43 |
44 |
83 |

84 |
89 |
90 |
91 |
92 |
93 |
94 |
Powered by:
95 |
96 |
97 |
98 |
99 |
100 | Source code available on
Github
101 |
102 |
103 |
104 |
127 |
128 |
129 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/lib/git2provConverter.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | /* A converter for a git url to PROV-N */
4 | var exec = require('child_process').exec;
5 | var serialize = require('./provSerializer').serialize;
6 |
7 | /* Convert the git repository at giturl to PROV in the specified serialization.
8 | RepositoryPath will be used to temporarily store the cloned repository on the server.
9 | */
10 | function convert(giturl, serialization, repositoryPath, requestUrl, options, callback) {
11 | // Convert git URLs to https URLs
12 | if(giturl.indexOf("git@github.com:") > -1) {
13 | giturl = giturl.replace("git@github.com:", "https://github.com/");
14 | }
15 | // get the repository name.
16 | var repository = giturl.substring(giturl.lastIndexOf('/')+1, giturl.lastIndexOf('.git'));
17 | // clone the git repository
18 | clone(giturl, repositoryPath, function(error) {
19 | if (error !== null){
20 | callback(null, error);
21 | // cleanup - delete the repository
22 | exec("rm -rf " + repositoryPath);
23 | } else {
24 | // convert the information from the git url to PROV
25 | convertRepositoryToProv(repositoryPath, serialization, requestUrl, options, function(prov,contentType){
26 | callback(prov,null,contentType);
27 | // cleanup - delete the repository
28 | exec("rm -rf " + repositoryPath);
29 | });
30 | }
31 | });
32 | }
33 |
34 | /* Clone a git repository (at giturl) to the specified repositoryPath on the server */
35 | function clone(giturl, repositoryPath, callback) {
36 | exec('git clone '+ giturl + ' ' + repositoryPath, { timeout : 30000 },function (error) {
37 | if( error !== null ) {
38 | callback(error);
39 | } else {
40 | callback(null);
41 | }
42 | });
43 | }
44 |
45 | function getProvObject(prefixes, urlprefix) {
46 | var provObject = {};
47 | provObject.prefixes = prefixes;
48 | provObject.bundle = urlprefix + ":provenance";
49 | provObject.alternateBundle = "fullResult:provenance";
50 | provObject.entities = {};
51 | provObject.agents = {};
52 | provObject.activities = {};
53 | provObject.starts = {};
54 | provObject.ends = {};
55 | provObject.attributions = {};
56 | provObject.associations = {};
57 | provObject.communications = {};
58 | provObject.specializations = {};
59 | provObject.usages = {};
60 | provObject.generations = {};
61 | provObject.derivations = {};
62 | provObject.invalidations = {};
63 | return provObject;
64 | }
65 |
66 | function getCommitObj(line) {
67 |
68 | // remove the trailing filename from the --name-status line
69 | line = line.substring(0, line.lastIndexOf(',') + 2);
70 |
71 | var commitObj = {};
72 | var data = line.split(",");
73 |
74 | commitObj.entity = "file-" + data[0].replace(/ /g, "-");
75 | commitObj.id = "commit-" + data[1];
76 | commitObj.parents = data[2] ? data[2].split(" ") : [];
77 | commitObj.author = "user-" + data[3].replace(/ /g, "-");
78 | commitObj.author_label = data[3];
79 | commitObj.author_date = new Date(data[4]).toISOString();
80 | commitObj.commiter = "user-" + data[5].replace(/ /g, "-");
81 | commitObj.commiter_label = data[5];
82 | commitObj.commiter_date = new Date(data[6]).toISOString();
83 | commitObj.subject = data[7];
84 | commitObj.modification_type = data[8];
85 | return commitObj;
86 | }
87 |
88 | function updateProvObj(provObject, urlprefix, commitObj){
89 |
90 | var commitEntity = commitObj.entity + "_" + commitObj.id;
91 |
92 |
93 | // Add the commit activity to the activities object
94 | provObject.activities[urlprefix + ":" + commitObj.id] = {"prov:label" : commitObj.subject};// No need to add the parents as well, since we will eventually loop over them anyway
95 | provObject.starts[urlprefix + ":" + commitObj.id + "_start"] ={
96 | "prov:activity" : urlprefix + ":" + commitObj.id, "prov:time" : commitObj.author_date};
97 | provObject.ends[urlprefix + ":" + commitObj.id + "_end"] = {
98 | "prov:activity" : urlprefix + ":" + commitObj.id, "prov:time" : commitObj.commiter_date};
99 | // Add the commit entities (files) to the entities, specializations and derivations object
100 | provObject.entities[urlprefix + ":" + commitEntity] = {};
101 | provObject.specializations[urlprefix + ":" + commitEntity + "_spec"] = {
102 | "prov:generalEntity" : urlprefix + ":" + commitObj.entity,
103 | "prov:specificEntity" : urlprefix + ":" + commitEntity};
104 | switch(commitObj.modification_type){
105 | case "D":
106 | // The file was deleted in this commit
107 | provObject.invalidations[urlprefix + ":" + commitEntity + "_inv"] = {
108 | "prov:entity": urlprefix + ":" + commitEntity,
109 | "prov:activity": urlprefix + ":" + commitObj.id,
110 | "prov:time": commitObj.author_date
111 | };
112 | break;
113 | case "A":
114 | // The file was added in this commit
115 | provObject.generations[urlprefix + ":" + commitEntity + "_gen"] = {
116 | "prov:entity": urlprefix + ":" + commitEntity,
117 | "prov:activity": urlprefix + ":" + commitObj.id,
118 | "prov:time": commitObj.author_date
119 | };
120 | break;
121 | default:
122 | // The file was modified in this commit
123 | var generation = urlprefix + ":" + commitEntity + "_gen";
124 | provObject.generations[generation] = {
125 | "prov:activity": urlprefix + ":" + commitObj.id,
126 | "prov:entity": urlprefix + ":" + commitEntity,
127 | "prov:time": commitObj.author_date
128 | };
129 |
130 | commitObj.parents.forEach(function(parent){
131 | if(parent !== ""){
132 | var parentEntity = commitObj.entity + "_commit-" + parent;
133 | var usage = urlprefix + ":" + parentEntity + "_" + commitObj.id + "_use";
134 | provObject.usages[usage] = {
135 | "prov:activity": urlprefix + ":" + commitObj.id,
136 | "prov:entity": urlprefix + ":" + parentEntity,
137 | "prov:time": commitObj.author_date
138 | };
139 | provObject.derivations[urlprefix + ":" + commitEntity + "_" + parent + "_der"] = {
140 | "prov:activity": urlprefix + ":" + commitObj.id,
141 | "prov:generatedEntity": urlprefix + ":" + commitEntity,
142 | "prov:usedEntity": urlprefix + ":" + parentEntity,
143 | "prov:generation": generation,
144 | "prov:usage": usage
145 | };
146 | provObject.communications[urlprefix + ":" + commitObj.id + "_" + parent + "_comm"] = {
147 | "prov:informant": urlprefix + ":" + "commit-" + parent,
148 | "prov:informed": urlprefix + ":" + commitObj.id
149 | };
150 | }
151 | });
152 | break;
153 | }
154 | // Add the agents to the stack of agents
155 | provObject.agents[urlprefix + ":" + commitObj.author] = {"prov:label" : commitObj.author_label};
156 | // The file is definitly attributed to the author
157 | provObject.attributions[urlprefix + ":" + commitObj.entity + "_" + commitObj.id + "_" + commitObj.author + "_attr"] = {
158 | "prov:entity" : urlprefix + ":" + commitEntity,
159 | "prov:agent" : urlprefix + ":" + commitObj.author,
160 | "prov:type" : "authorship"
161 | };
162 | // And he/she is definitely associated with the commit activity
163 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.author + "_assoc"] = {
164 | "prov:activity" : urlprefix + ":" + commitObj.id,
165 | "prov:agent" : urlprefix + ":" + commitObj.author,
166 | "prov:role" : "author"
167 | };
168 | provObject.agents[urlprefix + ":" + commitObj.commiter] = {"prov:label" : commitObj.commiter_label};
169 | // We can't say that the file was attributed to the committer, but we can associate the commit activity with him/her
170 | if(provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"]){
171 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"]["prov:role"] += ", committer";
172 | } else {
173 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"] = {
174 | "prov:activity" : urlprefix + ":" + commitObj.id,
175 | "prov:agent" : urlprefix + ":" + commitObj.commiter,
176 | "prov:role" : "committer"
177 | };
178 | }
179 | }
180 |
181 | function getPrefixes(urlprefix, requestUrl, serialization) {
182 | var prefixes = {};
183 | prefixes[urlprefix] = requestUrl + "#";
184 | prefixes.fullResult = requestUrl.substring(0, requestUrl.indexOf('&')) + "&serialization=" + serialization + "#";
185 | return prefixes;
186 | }
187 |
188 | function getLogCmds(provObject, fileList, urlprefix, options) {
189 |
190 | var files = fileList.toString().split('\n');
191 | // For some reason, git log appends empty lines here and there. Let's fitler them out.
192 | files = files.filter(function(element) { return element !== ""; });
193 |
194 | var logCmds = files.map(function (file) {
195 | var commitHash = options.shortHashes ? "%h" : "%H";
196 | var parentHash = options.shortHashes ? "%p" : "%P";
197 |
198 | //console.log('Processing ' + file);
199 | // Because all identifiers need to be QNames in PROV, and we need valid turtle as well, we need to get rid of the slashes, spaces and dots
200 | var currentEntity = file.replace(/[\/. ]/g, "-");
201 | provObject.entities[urlprefix + ":file-" + currentEntity] = {"prov:label": file};
202 | // Next, do a git log for each file to find out about all commits, authors, the commit parents, and the modification type
203 | // This will output the following: Commit hash, Parent hash(es), Author name, Author date, Committer name, Committer date, Subject, name-status
204 | // This translates to: activity (commit), derivations, agent (author), starttime, agent (committer), endtime, prov:label (Commit message)
205 | return 'git --no-pager log --date=iso --name-status --pretty=format:"' + currentEntity + ',' + commitHash + ',' + parentHash + ',%an,%ad,%cn,%cd,%s,&" -- ' + file;
206 | });
207 | return logCmds;
208 | }
209 |
210 | /* We convert git concepts to PROV concepts as follows:
211 |
212 | commit c with subject s ---> activity(c, [prov:label="s"])
213 | file f ---> entity(f)
214 | author a ---> agent(a)
215 | ---> wasAssociatedWith(c, a, [prov:role="author"])
216 | ---> wasAttributedTo(f_c, a, [prov:type="authorship"])
217 | committer ca ---> agent(ca)
218 | ---> wasAssociatedWith(c, ca, [prov:role="committer"])
219 | author date ad ---> wasStartedBy(c, -, -, ad)
220 | commit date cd ---> wasEndedBy(c, -, -, cd)
221 | file f in commit c ---> specializationOf(f_c, f)
222 | file f_c added in commit c ---> wasGeneratedBy(f_c, c, authordate)
223 | file f_c in commit c modified f_c2 from parent commit c2
224 | ---> wasGeneratedBy(f_c, c, authordate)
225 | ---> used(c, f_c2, authordate)
226 | ---> wasDerivedFrom(f_c, f_c2, c)
227 | ---> wasInformedBy(c, c2)
228 | file f_c deleted in commit c ---> wasInvalidatedBy(f_c, c, authordate)
229 | */
230 |
231 | function convertRepositoryToProv(repositoryPath, serialization, requestUrl, options, callback) {
232 | // set the corresponding variables according to the options
233 | var ignore = options.ignore ? options.ignore : [];
234 | // determine a QName for the bundle
235 | var urlprefix = "result";
236 |
237 | var prefixes = getPrefixes(urlprefix, requestUrl, serialization);
238 |
239 | // We store these assertions in the PROV-JSON format, so they need to be objects.
240 | // PROV-JSON spec: http://www.w3.org/Submission/prov-json/
241 | var provObject = getProvObject(prefixes, urlprefix);
242 |
243 | // first, do a git log to find out about all files that ever existed in the repository
244 | exec('git --no-pager log --pretty=format: --name-only --diff-filter=A', { cwd : repositoryPath }, function (error, stdout) {
245 | // Keep track of how many files have been processed
246 | var logCmds = getLogCmds(provObject, stdout, urlprefix, options);
247 |
248 | executeLogCmd(logCmds.pop());
249 | function executeLogCmd(logcmd) {
250 | exec( logcmd, { cwd : repositoryPath }, function (error, stdout) {
251 | var output = stdout.toString().replace(/&\n/g,'');
252 | var lines = output.split('\n');
253 | // For some reason, git log appends empty lines here and there. Let's fitler them out.
254 | lines = lines.filter(function(element) { return element !== ""; });
255 | lines.forEach(function(line){
256 | updateProvObj(provObject, urlprefix, getCommitObj(line)); });
257 | if (logCmds.length) {
258 | executeLogCmd(logCmds.pop());
259 | }
260 | else {
261 | serialize(serialization, provObject, ignore, callback);
262 | }
263 | });
264 | }
265 | });
266 | }
267 |
268 | exports.convert = convert;
269 | exports.getProvObject = getProvObject;
270 | exports.getCommitObj = getCommitObj;
271 | exports.updateProvObj = updateProvObj;
272 | exports.getPrefixes = getPrefixes;
273 | exports.getLogCommands = getLogCmds;
--------------------------------------------------------------------------------
/test/testProvNdata.n3:
--------------------------------------------------------------------------------
1 | document
2 | prefix result
3 | prefix fullResult
4 | bundle result:provenance
5 | entity(result:file--gitignore, [prov:label=".gitignore"])
6 | entity(result:file-Berksfile, [prov:label="Berksfile"])
7 | entity(result:file-Linux-call_watcher-c, [prov:label="Linux/call_watcher.c"])
8 | entity(result:file-Linux-test-sh, [prov:label="Linux/test.sh"])
9 | entity(result:file-Mac-call_watcher-c, [prov:label="Mac/call_watcher.c"])
10 | entity(result:file-Mac-test-c, [prov:label="Mac/test.c"])
11 | entity(result:file-Mac-test-sh, [prov:label="Mac/test.sh"])
12 | entity(result:file-Vagrantfile, [prov:label="Vagrantfile"])
13 | entity(result:file-LICENSE, [prov:label="LICENSE"])
14 | entity(result:file-README-md, [prov:label="README.md"])
15 | entity(result:file-Linux-Makefile, [prov:label="Linux/Makefile"])
16 | entity(result:file-Linux-myPreload-c, [prov:label="Linux/myPreload.c"])
17 | entity(result:file-Linux-test-c, [prov:label="Linux/test.c"])
18 | entity(result:file-Mac-Makefile, [prov:label="Mac/Makefile"])
19 | entity(result:file-Mac-inject-h, [prov:label="Mac/inject.h"])
20 | entity(result:file-Mac-inject-m, [prov:label="Mac/inject.m"])
21 | entity(result:file-Mac-open-c, [prov:label="Mac/open.c"])
22 | entity(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
23 | entity(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
24 | entity(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
25 | entity(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
26 | entity(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
27 | entity(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
28 | entity(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
29 | entity(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
30 | entity(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
31 | entity(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
32 | entity(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
33 | entity(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
34 | entity(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
35 | entity(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162)
36 | entity(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
37 | entity(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a)
38 | entity(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a)
39 | entity(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
40 | entity(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
41 | entity(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
42 | entity(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
43 | entity(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
44 | entity(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
45 | entity(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
46 | entity(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d)
47 | agent(result:user-vlad, [prov:label="vlad"])
48 | agent(result:user-Vlad-Korolev, [prov:label="Vlad Korolev"])
49 | activity(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, [prov:label="Modernized and harmonized the code"])
50 | activity(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, [prov:label="Initial import"])
51 | activity(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, [prov:label="Initial commit"])
52 | wasStartedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, -, -, 2014-08-14T13:42:05.000Z)
53 | wasStartedBy(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, -, -, 2014-08-13T00:06:41.000Z)
54 | wasStartedBy(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, -, -, 2014-08-14T15:21:06.000Z)
55 | wasEndedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, -, -, 2014-08-14T15:50:51.000Z)
56 | wasEndedBy(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, -, -, 2014-08-13T00:06:41.000Z)
57 | wasEndedBy(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, -, -, 2014-08-14T15:41:35.000Z)
58 | wasAttributedTo(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
59 | wasAttributedTo(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
60 | wasAttributedTo(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
61 | wasAttributedTo(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
62 | wasAttributedTo(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
63 | wasAttributedTo(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
64 | wasAttributedTo(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
65 | wasAttributedTo(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
66 | wasAttributedTo(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
67 | wasAttributedTo(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
68 | wasAttributedTo(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
69 | wasAttributedTo(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
70 | wasAttributedTo(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
71 | wasAttributedTo(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"])
72 | wasAttributedTo(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
73 | wasAttributedTo(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:type="authorship"])
74 | wasAttributedTo(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:type="authorship"])
75 | wasAttributedTo(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
76 | wasAttributedTo(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
77 | wasAttributedTo(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
78 | wasAttributedTo(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
79 | wasAttributedTo(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
80 | wasAttributedTo(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
81 | wasAttributedTo(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
82 | wasAttributedTo(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"])
83 | wasAssociatedWith(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:role="author, committer"])
84 | wasAssociatedWith(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:role="author, committer"])
85 | wasAssociatedWith(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:role="author"])
86 | wasAssociatedWith(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-vlad, [prov:role="committer, committer"])
87 | wasInformedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a)
88 | specializationOf(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-open-c)
89 | specializationOf(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-open-c)
90 | specializationOf(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-inject-m)
91 | specializationOf(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-inject-m)
92 | specializationOf(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-inject-h)
93 | specializationOf(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-inject-h)
94 | specializationOf(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile)
95 | specializationOf(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-Makefile)
96 | specializationOf(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c)
97 | specializationOf(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-test-c)
98 | specializationOf(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-myPreload-c)
99 | specializationOf(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-myPreload-c)
100 | specializationOf(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile)
101 | specializationOf(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-Makefile)
102 | specializationOf(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md)
103 | specializationOf(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:file-README-md)
104 | specializationOf(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:file-LICENSE)
105 | specializationOf(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Vagrantfile)
106 | specializationOf(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-test-sh)
107 | specializationOf(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-test-c)
108 | specializationOf(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-call_watcher-c)
109 | specializationOf(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-sh)
110 | specializationOf(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-call_watcher-c)
111 | specializationOf(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Berksfile)
112 | specializationOf(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file--gitignore)
113 | wasGeneratedBy(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
114 | wasGeneratedBy(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
115 | wasGeneratedBy(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
116 | wasGeneratedBy(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
117 | wasGeneratedBy(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
118 | wasGeneratedBy(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
119 | wasGeneratedBy(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
120 | wasGeneratedBy(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
121 | wasGeneratedBy(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
122 | wasGeneratedBy(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z)
123 | wasGeneratedBy(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
124 | wasGeneratedBy(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T15:21:06.000Z)
125 | wasGeneratedBy(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T15:21:06.000Z)
126 | wasGeneratedBy(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
127 | wasGeneratedBy(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
128 | wasGeneratedBy(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
129 | wasGeneratedBy(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
130 | wasGeneratedBy(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
131 | wasGeneratedBy(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
132 | wasGeneratedBy(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
133 | wasGeneratedBy(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
134 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z)
135 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z)
136 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z)
137 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z)
138 | wasDerivedFrom(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use)
139 | wasDerivedFrom(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use)
140 | wasDerivedFrom(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use)
141 | wasDerivedFrom(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use)
142 | wasInvalidatedBy(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
143 | wasInvalidatedBy(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
144 | wasInvalidatedBy(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
145 | wasInvalidatedBy(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z)
146 | endBundle
147 | endDocument
148 |
--------------------------------------------------------------------------------
/test/testProvOdata.n3:
--------------------------------------------------------------------------------
1 | @prefix fullResult: .
2 | @prefix prov: .
3 | @prefix rdfs: .
4 | @prefix result: .
5 | @prefix xsd: .
6 | result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Activity ;
7 | prov:endedAtTime "2014-08-14T15:41:35.000Z"^^xsd:dateTime ;
8 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "committer, committer"@en ] ,
9 | [ a prov:Association ; prov:agent result:user-Vlad-Korolev ; prov:hadRole "author"@en ] ;
10 | prov:startedAtTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ;
11 | prov:wasAssociatedWith result:user-vlad ,
12 | result:user-Vlad-Korolev ;
13 | rdfs:label "Initial commit"@en .
14 | result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Activity ;
15 | prov:endedAtTime "2014-08-14T15:50:51.000Z"^^xsd:dateTime ;
16 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "author, committer"@en ] ;
17 | prov:qualifiedUsage [ a prov:Usage ; prov:entity result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ,
18 | [ a prov:Usage ; prov:entity result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ,
19 | [ a prov:Usage ; prov:entity result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ,
20 | [ a prov:Usage ; prov:entity result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
21 | prov:startedAtTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ;
22 | prov:used result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ,
23 | result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ,
24 | result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ,
25 | result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
26 | prov:wasAssociatedWith result:user-vlad ;
27 | prov:wasInformedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
28 | rdfs:label "Modernized and harmonized the code"@en .
29 | result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Activity ;
30 | prov:endedAtTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ;
31 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "author, committer"@en ] ;
32 | prov:startedAtTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ;
33 | prov:wasAssociatedWith result:user-vlad ;
34 | rdfs:label "Initial import"@en .
35 | result:file--gitignore a prov:Entity ;
36 | rdfs:label ".gitignore"@en .
37 | result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
38 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
39 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
40 | prov:specializationOf result:file--gitignore ;
41 | prov:wasAttributedTo result:user-vlad ;
42 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
43 | result:file-Berksfile a prov:Entity ;
44 | rdfs:label "Berksfile"@en .
45 | result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
46 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
47 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
48 | prov:specializationOf result:file-Berksfile ;
49 | prov:wasAttributedTo result:user-vlad ;
50 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
51 | result:file-LICENSE a prov:Entity ;
52 | rdfs:label "LICENSE"@en .
53 | result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Entity ;
54 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-Vlad-Korolev ; a "authorship"@en ] ;
55 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ] ;
56 | prov:specializationOf result:file-LICENSE ;
57 | prov:wasAttributedTo result:user-Vlad-Korolev ;
58 | prov:wasGeneratedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a .
59 | result:file-Linux-call_watcher-c a prov:Entity ;
60 | rdfs:label "Linux/call_watcher.c"@en .
61 | result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
62 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
63 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
64 | prov:specializationOf result:file-Linux-call_watcher-c ;
65 | prov:wasAttributedTo result:user-vlad ;
66 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
67 | result:file-Linux-Makefile a prov:Entity ;
68 | rdfs:label "Linux/Makefile"@en .
69 | result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
70 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
71 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ;
72 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
73 | prov:specializationOf result:file-Linux-Makefile ;
74 | prov:wasAttributedTo result:user-vlad ;
75 | prov:wasDerivedFrom result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
76 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
77 | result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
78 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
79 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
80 | prov:specializationOf result:file-Linux-Makefile ;
81 | prov:wasAttributedTo result:user-vlad ;
82 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
83 | result:file-Linux-myPreload-c a prov:Entity ;
84 | rdfs:label "Linux/myPreload.c"@en .
85 | result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
86 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
87 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
88 | prov:specializationOf result:file-Linux-myPreload-c ;
89 | prov:wasAttributedTo result:user-vlad ;
90 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
91 | result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
92 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
93 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
94 | prov:specializationOf result:file-Linux-myPreload-c ;
95 | prov:wasAttributedTo result:user-vlad ;
96 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
97 | result:file-Linux-test-c a prov:Entity ;
98 | rdfs:label "Linux/test.c"@en .
99 | result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
100 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
101 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ;
102 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
103 | prov:specializationOf result:file-Linux-test-c ;
104 | prov:wasAttributedTo result:user-vlad ;
105 | prov:wasDerivedFrom result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
106 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
107 | result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
108 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
109 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
110 | prov:specializationOf result:file-Linux-test-c ;
111 | prov:wasAttributedTo result:user-vlad ;
112 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
113 | result:file-Linux-test-sh a prov:Entity ;
114 | rdfs:label "Linux/test.sh"@en .
115 | result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
116 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
117 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
118 | prov:specializationOf result:file-Linux-test-sh ;
119 | prov:wasAttributedTo result:user-vlad ;
120 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
121 | result:file-Mac-call_watcher-c a prov:Entity ;
122 | rdfs:label "Mac/call_watcher.c"@en .
123 | result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
124 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
125 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
126 | prov:specializationOf result:file-Mac-call_watcher-c ;
127 | prov:wasAttributedTo result:user-vlad ;
128 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
129 | result:file-Mac-inject-h a prov:Entity ;
130 | rdfs:label "Mac/inject.h"@en .
131 | result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
132 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
133 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
134 | prov:specializationOf result:file-Mac-inject-h ;
135 | prov:wasAttributedTo result:user-vlad ;
136 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
137 | result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
138 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
139 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
140 | prov:specializationOf result:file-Mac-inject-h ;
141 | prov:wasAttributedTo result:user-vlad ;
142 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
143 | result:file-Mac-inject-m a prov:Entity ;
144 | rdfs:label "Mac/inject.m"@en .
145 | result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
146 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
147 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
148 | prov:specializationOf result:file-Mac-inject-m ;
149 | prov:wasAttributedTo result:user-vlad ;
150 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
151 | result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
152 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
153 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
154 | prov:specializationOf result:file-Mac-inject-m ;
155 | prov:wasAttributedTo result:user-vlad ;
156 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
157 | result:file-Mac-Makefile a prov:Entity ;
158 | rdfs:label "Mac/Makefile"@en .
159 | result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
160 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
161 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ;
162 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
163 | prov:specializationOf result:file-Mac-Makefile ;
164 | prov:wasAttributedTo result:user-vlad ;
165 | prov:wasDerivedFrom result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
166 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
167 | result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
168 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
169 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
170 | prov:specializationOf result:file-Mac-Makefile ;
171 | prov:wasAttributedTo result:user-vlad ;
172 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
173 | result:file-Mac-open-c a prov:Entity ;
174 | rdfs:label "Mac/open.c"@en .
175 | result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
176 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
177 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
178 | prov:specializationOf result:file-Mac-open-c ;
179 | prov:wasAttributedTo result:user-vlad ;
180 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
181 | result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ;
182 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
183 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ;
184 | prov:specializationOf result:file-Mac-open-c ;
185 | prov:wasAttributedTo result:user-vlad ;
186 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 .
187 | result:file-Mac-test-c a prov:Entity ;
188 | rdfs:label "Mac/test.c"@en .
189 | result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
190 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
191 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
192 | prov:specializationOf result:file-Mac-test-c ;
193 | prov:wasAttributedTo result:user-vlad ;
194 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
195 | result:file-Mac-test-sh a prov:Entity ;
196 | rdfs:label "Mac/test.sh"@en .
197 | result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
198 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
199 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
200 | prov:specializationOf result:file-Mac-test-sh ;
201 | prov:wasAttributedTo result:user-vlad ;
202 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
203 | result:file-README-md a prov:Entity ;
204 | rdfs:label "README.md"@en .
205 | result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Entity ;
206 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-Vlad-Korolev ; a "authorship"@en ] ;
207 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ] ;
208 | prov:specializationOf result:file-README-md ;
209 | prov:wasAttributedTo result:user-Vlad-Korolev ;
210 | prov:wasGeneratedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a .
211 | result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
212 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
213 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ;
214 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
215 | prov:specializationOf result:file-README-md ;
216 | prov:wasAttributedTo result:user-vlad ;
217 | prov:wasDerivedFrom result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ;
218 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
219 | result:file-Vagrantfile a prov:Entity ;
220 | rdfs:label "Vagrantfile"@en .
221 | result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ;
222 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ;
223 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ;
224 | prov:specializationOf result:file-Vagrantfile ;
225 | prov:wasAttributedTo result:user-vlad ;
226 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d .
227 | result:provenance a prov:Bundle ;
228 | prov:alternateOf fullResult:provenance .
229 | result:user-vlad a prov:Agent ;
230 | rdfs:label "vlad"@en .
231 | result:user-Vlad-Korolev a prov:Agent ;
232 | rdfs:label "Vlad Korolev"@en .
--------------------------------------------------------------------------------
/lib/provSerializer.js:
--------------------------------------------------------------------------------
1 | /* A module that has functions to serialize arrays of data into PROV-N, PROV-O or PROV-XML */
2 | var n3 = require('n3');
3 |
4 | /* Serialize the specified entries in the specified serialization (default: PROV-N) */
5 | function serialize(serialization, provObject, ignore, callback){
6 | switch(serialization) {
7 | case "PROV-JSON":
8 | serializePROVJSON(provObject, ignore, callback);
9 | break;
10 | case "PROV-O":
11 | serializePROVO(provObject, ignore, callback);
12 | break;
13 | case "PROV-XML":
14 | serializePROVXML(provObject, ignore, callback);
15 | break;
16 | default:
17 | serializePROVN(provObject, ignore, callback);
18 | }
19 | }
20 |
21 | function shouldBeAdded(provSet, ignoreBLock, arg, ignoreAttr) {
22 | return provSet.hasOwnProperty(arg) && ignoreBLock.indexOf(ignoreAttr) < 0;
23 | }
24 |
25 | function addToJSONBundleIfNeeded(provJSONObject, provObject, ignoreBlock, attrPlural, attrSingular) {
26 |
27 | var provSet = provObject[attrPlural];
28 | var bundlename = provObject.bundle;
29 |
30 | if (provSet && ignoreBlock.indexOf(attrSingular) < 0) {
31 | provJSONObject.bundle[bundlename][attrSingular] = provSet;
32 | }
33 | }
34 |
35 |
36 | /* Serialize the specified entries as a PROV-JSON object */
37 | function serializePROVJSON(provObject, ignore, callback){
38 |
39 | var provJSONObject = {};
40 | provJSONObject.prefix = provObject.prefixes;
41 | provJSONObject.bundle = {};
42 | provJSONObject.bundle[provObject.bundle] = {};
43 |
44 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'entities', 'entity');
45 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'agents', 'agent');
46 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'activities', 'activity');
47 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'starts', 'wasStartedBy');
48 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'ends', 'wasEndedBy');
49 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'attributions', 'wasAttributedTo');
50 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'associations', 'wasAssociatedWith');
51 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'communications', 'wasInformedBy');
52 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'specializations', 'specializationOf');
53 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'generations', 'wasGeneratedBy');
54 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'usages', 'used');
55 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'derivations', 'wasDerivedFrom');
56 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'invalidations', 'wasInvalidatedBy');
57 |
58 | callback(JSON.stringify(provJSONObject, undefined, 2),"text/plain");//TODO: change to text/json
59 | }
60 |
61 |
62 |
63 | function addProvNEntries(provObject, ignore, prov, section, singular, getRecord, altSubj) {
64 |
65 |
66 | var entry_collection = provObject[section];
67 |
68 | for (var entity in entry_collection) {
69 | if (shouldBeAdded(entry_collection, ignore, entity, singular)) {
70 | var subj = (altSubj ? entry_collection[entity][altSubj] : entity );
71 | prov += singular + "(" + subj + getRecord(entry_collection, entity) + ")" + "\n";
72 | }
73 | }
74 | return prov;
75 | }
76 |
77 |
78 | function addPrefixes(provObject, prov) {
79 | for (var prefix in provObject.prefixes) {
80 | if (provObject.prefixes.hasOwnProperty(prefix)) {
81 | prov += "prefix " + prefix + " <" + provObject.prefixes[prefix] + ">" + "\n";
82 | }
83 | }
84 | return prov;
85 | }
86 |
87 | function getEntityRecord(entities, entity) {
88 | return (entities[entity]["prov:label"] ? ", [prov:label=\"" + entities[entity]["prov:label"] + "\"]" : "");
89 | }
90 |
91 | function getWasStartedByRecord(starts, start) {
92 | return ", -, -, " + starts[start]["prov:time"];
93 | }
94 |
95 | function getAttributionRecord(attributions, attribution) {
96 | return ", " + attributions[attribution]["prov:agent"] + ", [prov:type=\"" + attributions[attribution]["prov:type"] + "\"]";
97 | }
98 |
99 | function getAssociationsRecord(associations, association) {
100 | return ", " + associations[association]["prov:agent"] + ", [prov:role=\"" + associations[association]["prov:role"] + "\"]";
101 | }
102 |
103 | function getCommunicationRecord(communications, communication) {
104 | return ", " + communications[communication]["prov:informant"];
105 | }
106 |
107 | function getSpecializationRecord(specializations, specialization) {
108 | return ", " + specializations[specialization]["prov:generalEntity"];
109 | }
110 |
111 | function getGenerationRecord(generations, generation) {
112 | return ", " + generations[generation]["prov:activity"] + ", " + generations[generation]["prov:time"];
113 | }
114 |
115 | function getUsageRecord(usages, usage) {
116 | return ", " + usages[usage]["prov:entity"] + ", " + usages[usage]["prov:time"];
117 | }
118 |
119 |
120 | function getDerivationRecord(derivations, derivation) {
121 | return ", " + derivations[derivation]["prov:usedEntity"] + ", " + derivations[derivation]["prov:activity"] +
122 | ", " + derivations[derivation]["prov:generation"] + ", " + derivations[derivation]["prov:usage"];
123 | }
124 |
125 | function getInvalidationRecord(invalidations, invalidation) {
126 | return ", " + invalidations[invalidation]["prov:activity"] + ", " + invalidations[invalidation]["prov:time"];
127 | }
128 |
129 | /* Serialize the specified PROV-JSON object in PROV-N */
130 | function serializePROVN(provObject, ignore, callback){
131 | //write everything to the result string
132 | var prov = "document" + "\n";
133 |
134 | prov = addPrefixes(provObject, prov);
135 | prov += "bundle " + provObject.bundle + "\n";
136 |
137 | prov = addProvNEntries(provObject, ignore, prov, 'entities', 'entity', getEntityRecord);
138 | prov = addProvNEntries(provObject, ignore, prov, 'agents', 'agent', getEntityRecord);
139 | prov = addProvNEntries(provObject, ignore, prov, 'activities', 'activity', getEntityRecord);
140 | prov = addProvNEntries(provObject, ignore, prov, 'starts', 'wasStartedBy', getWasStartedByRecord, "prov:activity");
141 | prov = addProvNEntries(provObject, ignore, prov, 'ends', 'wasEndedBy', getWasStartedByRecord, "prov:activity" );
142 | prov = addProvNEntries(provObject, ignore, prov, 'attributions', 'wasAttributedTo', getAttributionRecord, "prov:entity" );
143 | prov = addProvNEntries(provObject, ignore, prov, 'associations', 'wasAssociatedWith', getAssociationsRecord, "prov:activity" );
144 | prov = addProvNEntries(provObject, ignore, prov, 'communications', 'wasInformedBy', getCommunicationRecord, "prov:informed" );
145 | prov = addProvNEntries(provObject, ignore, prov, 'specializations', 'specializationOf', getSpecializationRecord, "prov:specificEntity" );
146 | prov = addProvNEntries(provObject, ignore, prov, 'generations', 'wasGeneratedBy', getGenerationRecord, "prov:entity" );
147 | prov = addProvNEntries(provObject, ignore, prov, 'usages', 'used', getUsageRecord, "prov:activity" );
148 | prov = addProvNEntries(provObject, ignore, prov, 'derivations', 'wasDerivedFrom', getDerivationRecord, "prov:generatedEntity" );
149 | prov = addProvNEntries(provObject, ignore, prov, 'invalidations', 'wasInvalidatedBy', getInvalidationRecord, "prov:entity" );
150 |
151 |
152 | prov += "endBundle " + "\n";
153 | prov += "endDocument" + "\n";
154 | callback(prov,"text/plain");//TODO: change to text/prov-notation
155 | }
156 |
157 | function cmp(a, b) {
158 | return (a.toLowerCase() > b.toLowerCase()) ? 1 :
159 | ((a.toLowerCase() < b.toLowerCase()) ? -1 : 0);
160 | }
161 |
162 |
163 | /* Serialize the specified PROV-JSON object in PROV-O */
164 | function statementFromTriple(triple, count, sameSubj, samePred) {
165 |
166 | var statement = "";
167 |
168 | if (count > 0) {
169 | statement += (sameSubj ? (samePred ? "," : ";") : ".") + "\n";
170 | }
171 |
172 | if (sameSubj) {
173 | statement += "\t" + "\t";
174 | } else {
175 | statement += triple.subject + "\t";
176 | }
177 |
178 | if (sameSubj && samePred) {
179 | statement += "\t";
180 | } else {
181 | statement += triple.predicate;
182 | }
183 |
184 | statement += "\t" + triple.object + " ";
185 |
186 | return statement;
187 | }
188 |
189 |
190 | function getTurtle(store) {
191 | var provo = "";
192 |
193 |
194 | var triples = store.find();
195 | triples = triples.sort(function (a, b) {
196 | return cmp(a.subject, b.subject) || cmp(a.predicate, b.predicate) || cmp(a.object, b.object);
197 | });
198 |
199 |
200 | var previousTriple = {};
201 | var count = 0;
202 | triples.forEach(function (triple) {
203 | if (triple.subject === "@prefix") {
204 | // For prefixes, always rewrite the subject
205 | provo += triple.subject + " " + triple.predicate + " " + triple.object + " .\n";
206 | } else {
207 | // For all other triples, don't re-write the subject/predicate when it's the same as the previous
208 | var prevSubj = previousTriple.subject === triple.subject;
209 | var prevPred = previousTriple.predicate === triple.predicate;
210 | provo += statementFromTriple(triple, count, prevSubj, prevPred);
211 | count++;
212 | }
213 | previousTriple = triple;
214 | });
215 | provo += ".";
216 | return provo;
217 | }
218 |
219 |
220 | function capitalize(string){
221 | return string.charAt(0).toUpperCase() + string.slice(1);
222 | }
223 |
224 |
225 |
226 | function addEntityRecord(store, entityCollection, entity, subject) {
227 | store.addTriple(subject, "rdfs:label", "\"" + entityCollection[entity]["prov:label"] + "\"@en");
228 | }
229 |
230 | function addActivityStartedAtRecord(store, entityCollection, entity, subject) {
231 | store.addTriple(subject, "prov:startedAtTime", "\"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime");
232 | }
233 |
234 | function addActivityEndedAtRecord(store, entityCollection, entity, subject) {
235 | store.addTriple(subject, "prov:endedAtTime", "\"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime");
236 | }
237 |
238 | function addCommunicationRecord(store, entityCollection, entity, subject) {
239 | store.addTriple(subject, "prov:wasInformedBy", entityCollection[entity]["prov:informant"]);
240 | }
241 |
242 | function addGeneralizationRecord(store, entityCollection, entity, subject) {
243 | store.addTriple(subject, "prov:specializationOf", entityCollection[entity]["prov:generalEntity"]);
244 | }
245 |
246 |
247 | function addGenerationsRecords(store, entityCollection, entity, singular, subj) {
248 |
249 | var record = entityCollection[entity];
250 | store.addTriple(subj, "prov:"+ singular, record["prov:activity"]);
251 | if (record["prov:time"]) {
252 | store.addTriple(subj, "prov:qualifiedGeneration",
253 | "[ a prov:Generation ; prov:activity " + record["prov:activity"] + " ; " +
254 | "prov:atTime \"" + record["prov:time"] + "\"^^xsd:dateTime ]");
255 | }
256 | //TODO: format this better
257 | }
258 |
259 | function addUsageRecords(store, entityCollection, entity, singular, subj) {
260 |
261 | var record = entityCollection[entity];
262 | store.addTriple(subj, "prov:" + singular, record["prov:entity"]);
263 | if (record["prov:time"]) {
264 | store.addTriple(subj, "prov:qualifiedUsage",
265 | "[ a prov:Usage ; prov:entity " + record["prov:entity"] + " ; " +
266 | "prov:atTime \"" + record["prov:time"] + "\"^^xsd:dateTime ]");
267 | }
268 | //TODO: format this better
269 | }
270 |
271 |
272 | function addDerivationRecords(store, entityCollection, entity, singular, subj) {
273 |
274 | var record = entityCollection[entity];
275 | store.addTriple(subj, "prov:"+ singular, record["prov:usedEntity"]);
276 | if (record["prov:generation"] && record["prov:usage"] &&
277 | record["prov:activity"]) {
278 | store.addTriple(subj, "prov:qualifiedDerivation",
279 | "[ a prov:Derivation ; prov:entity " + record["prov:usedEntity"] + " ; " +
280 | "prov:hadGeneration " + record["prov:generation"] + " ; " +
281 | "prov:hadUsage " + record["prov:usage"] + " ; " +
282 | "prov:hadActivity " + record["prov:activity"] + " ]");
283 | }
284 | //TODO: format this better
285 | }
286 |
287 | function addInvalidationRecords(store, entityCollection, entity, singular, subj) {
288 |
289 | store.addTriple(subj, "prov:"+ singular, entityCollection[entity]["prov:activity"]);
290 | if (entityCollection[entity]["prov:time"]) {
291 | store.addTriple(subj, "prov:qualifiedInvalidation",
292 | "[ a prov:Invalidation ; prov:activity " + entityCollection[entity]["prov:activity"] + " ; " +
293 | "prov:atTime \"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime ]");
294 | }
295 | }
296 |
297 |
298 |
299 | function addAttributionRecords(store, entityCollection, entity, singular, subj) {
300 | store.addTriple(subj, "prov:" + singular, entityCollection[entity]["prov:agent"]);
301 | if (entityCollection[entity]["prov:type"]) {
302 | store.addTriple(subj, "prov:qualifiedAttribution",
303 | "[ a prov:Attribution ; prov:agent " + entityCollection[entity]["prov:agent"] + " ; " +
304 | "a \"" + entityCollection[entity]["prov:type"] + "\"@en ]");
305 | }
306 | }
307 |
308 | function addAssociationRecords(store, entityCollection, entity, singular, subj) {
309 | var record = entityCollection[entity];
310 | store.addTriple(subj, "prov:" + singular, record["prov:agent"]);
311 | if (record["prov:role"]) {
312 | store.addTriple(subj, "prov:qualifiedAssociation",
313 | "[ a prov:Association ; prov:agent " + record["prov:agent"] + " ; " +
314 | "prov:hadRole \"" + record["prov:role"] + "\"@en ]");
315 | }
316 | }
317 |
318 |
319 | function addProvEntityTriples(store, provObject, ignore, section, singular, recordWriter, altSubj) {
320 | var entityCollection = provObject[section];
321 | for (var entity in entityCollection) {
322 | if (shouldBeAdded(entityCollection, ignore, entity, singular)) {
323 | altSubj || store.addTriple(entity, "a", "prov:" + capitalize(singular));
324 | if (entityCollection[entity]["prov:label"] || altSubj ) {
325 | var subj = (altSubj ? entityCollection[entity][altSubj] : entity );
326 | recordWriter(store, entityCollection, entity, subj);
327 | }
328 | }
329 | }
330 | }
331 |
332 | function addProvEntityTriplesDbl(store, provObject, ignore, section, singular, recordWriter, altSubj) {
333 | var entityCollection = provObject[section];
334 | for (var entity in entityCollection) {
335 | if (shouldBeAdded(entityCollection, ignore, entity, singular)) {
336 | var subj = entityCollection[entity][altSubj];
337 | recordWriter(store, entityCollection, entity, singular, subj);
338 | //TODO: format this better
339 | }
340 | }
341 | }
342 |
343 |
344 | function addPrefixTriples(store, provObject) {
345 | store.addTriple("@prefix", "prov:", "");
346 | store.addTriple("@prefix", "rdfs:", "");
347 | store.addTriple("@prefix", "xsd:", "");
348 |
349 | for (var prefix in provObject.prefixes) {
350 | if (provObject.prefixes.hasOwnProperty(prefix)) {
351 | store.addTriple("@prefix", prefix + ":", "<" + provObject.prefixes[prefix] + ">");
352 | }
353 | }
354 | }
355 |
356 |
357 | function addAltBundleTriples(provObject, store) {
358 | if (provObject.bundle) {
359 | store.addTriple(provObject.bundle, "a", "prov:Bundle");
360 | if (provObject.alternateBundle) {
361 | store.addTriple(provObject.bundle, "prov:alternateOf", provObject.alternateBundle);
362 | }
363 | }
364 | }
365 |
366 |
367 |
368 | function storeProvInN3(store, provObject, ignore) {
369 |
370 | addPrefixTriples(store, provObject);
371 | addAltBundleTriples(provObject, store);
372 |
373 |
374 | addProvEntityTriples(store, provObject, ignore, 'entities', 'entity', addEntityRecord);
375 | addProvEntityTriples(store, provObject, ignore, 'agents', 'agent', addEntityRecord);
376 | addProvEntityTriples(store, provObject, ignore, 'activities', 'activity', addEntityRecord);
377 | addProvEntityTriples(store, provObject, ignore, 'starts', 'wasStartedBy', addActivityStartedAtRecord, "prov:activity");
378 | addProvEntityTriples(store, provObject, ignore, 'ends', 'wasEndedBy', addActivityEndedAtRecord, "prov:activity");
379 |
380 | addProvEntityTriplesDbl(store, provObject, ignore, 'attributions', 'wasAttributedTo', addAttributionRecords, "prov:entity");
381 | addProvEntityTriplesDbl(store, provObject, ignore, 'associations', 'wasAssociatedWith', addAssociationRecords, "prov:activity");
382 |
383 | addProvEntityTriples(store, provObject, ignore, 'communications', 'wasInformedBy', addCommunicationRecord, "prov:informed");
384 | addProvEntityTriples(store, provObject, ignore, 'specializations', 'specializationOf', addGeneralizationRecord, "prov:specificEntity");
385 |
386 | addProvEntityTriplesDbl(store, provObject, ignore, 'generations', 'wasGeneratedBy', addGenerationsRecords, "prov:entity");
387 | addProvEntityTriplesDbl(store, provObject, ignore, 'usages', 'used', addUsageRecords, "prov:activity");
388 | addProvEntityTriplesDbl(store, provObject, ignore, 'derivations', 'wasDerivedFrom', addDerivationRecords, "prov:generatedEntity");
389 | addProvEntityTriplesDbl(store, provObject, ignore, 'invalidations', 'wasInvalidatedBy', addInvalidationRecords, "prov:entity");
390 |
391 | }
392 |
393 |
394 | function serializePROVO(provObject, ignore, callback){
395 |
396 |
397 | //write everything to the triple store
398 | var store = new n3.Store();
399 |
400 | storeProvInN3(store, provObject, ignore);
401 |
402 | // Now write everything to nice turtle
403 | callback(getTurtle(store), "text/plain");//TODO: change to RDF
404 |
405 | }
406 |
407 | /* Serialize the specified PROV-JSON object in PROV-XML */
408 | function serializePROVXML(provObject, ignore, callback){
409 | callback("serialization unsupported", "text/plain");//TODO: change to text/X
410 | }
411 |
412 | exports.serialize = serialize;
413 | exports.shouldBeAdded = shouldBeAdded;
414 | exports.addToJSONBundleIfNeeded = addToJSONBundleIfNeeded;
415 | exports.recordWriters = {};
416 | exports.recordWriters.provN = {};
417 | exports.recordWriters.provN.entity = getEntityRecord;
418 | exports.recordWriters.provN.association = getAssociationsRecord;
419 | exports.recordWriters.provN.attribution = getAttributionRecord;
420 | exports.recordWriters.provN.communication = getCommunicationRecord;
421 | exports.recordWriters.provN.wasStartedBy = getWasStartedByRecord;
422 | exports.recordWriters.provN.specialization = getSpecializationRecord;
423 | exports.recordWriters.provN.generation = getGenerationRecord;
424 | exports.recordWriters.provN.usage = getUsageRecord;
425 | exports.recordWriters.provN.invalidation = getInvalidationRecord;
426 | exports.recordWriters.provN.derivation = getDerivationRecord;
427 | exports.recordWriters.provN.addProvNEntries = addProvNEntries;
428 | exports.recordWriters.provN.addPrefixes = addPrefixes;
429 | exports.recordWriters.provO = {};
430 | exports.recordWriters.provO.addEntities = addProvEntityTriples;
431 | exports.recordWriters.provO.addEntitiesD = addProvEntityTriplesDbl;
432 | exports.recordWriters.provO.addPrefix = addPrefixTriples;
433 | exports.recordWriters.provO.addAltBundle = addAltBundleTriples;
434 | exports.recordWriters.provO.entity = addEntityRecord;
435 | exports.recordWriters.provO.activityStart = addActivityStartedAtRecord;
436 | exports.recordWriters.provO.activityEnd = addActivityEndedAtRecord;
437 | exports.recordWriters.provO.communication = addCommunicationRecord;
438 | exports.recordWriters.provO.generalization = addGeneralizationRecord;
439 | exports.recordWriters.provO.attribution = addAttributionRecords;
440 | exports.recordWriters.provO.association = addAssociationRecords;
441 | exports.recordWriters.provO.generation = addGenerationsRecords;
442 | exports.recordWriters.provO.usage = addUsageRecords;
443 | exports.recordWriters.provO.derivation = addDerivationRecords;
444 | exports.recordWriters.provO.invalidation = addInvalidationRecords;
445 | exports.recordWriters.provO.cmp = cmp;
446 | exports.recordWriters.provO.statementFromTriple = statementFromTriple;
447 | exports.recordWriters.provO.getTurtle = getTurtle;
448 |
449 | exports.serializePROVXML = serializePROVXML;
450 | exports.serializePROVJSON = serializePROVJSON;
451 | exports.serializePROVN = serializePROVN;
452 | exports.serializePROVO = serializePROVO;
--------------------------------------------------------------------------------
/public_html/css/bootstrap-responsive.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.2.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 | .clearfix {
12 | *zoom: 1;
13 | }
14 |
15 | .clearfix:before,
16 | .clearfix:after {
17 | display: table;
18 | line-height: 0;
19 | content: "";
20 | }
21 |
22 | .clearfix:after {
23 | clear: both;
24 | }
25 |
26 | .hide-text {
27 | font: 0/0 a;
28 | color: transparent;
29 | text-shadow: none;
30 | background-color: transparent;
31 | border: 0;
32 | }
33 |
34 | .input-block-level {
35 | display: block;
36 | width: 100%;
37 | min-height: 30px;
38 | -webkit-box-sizing: border-box;
39 | -moz-box-sizing: border-box;
40 | box-sizing: border-box;
41 | }
42 |
43 | .hidden {
44 | display: none;
45 | visibility: hidden;
46 | }
47 |
48 | .visible-phone {
49 | display: none !important;
50 | }
51 |
52 | .visible-tablet {
53 | display: none !important;
54 | }
55 |
56 | .hidden-desktop {
57 | display: none !important;
58 | }
59 |
60 | .visible-desktop {
61 | display: inherit !important;
62 | }
63 |
64 | @media (min-width: 768px) and (max-width: 979px) {
65 | .hidden-desktop {
66 | display: inherit !important;
67 | }
68 | .visible-desktop {
69 | display: none !important ;
70 | }
71 | .visible-tablet {
72 | display: inherit !important;
73 | }
74 | .hidden-tablet {
75 | display: none !important;
76 | }
77 | }
78 |
79 | @media (max-width: 767px) {
80 | .hidden-desktop {
81 | display: inherit !important;
82 | }
83 | .visible-desktop {
84 | display: none !important;
85 | }
86 | .visible-phone {
87 | display: inherit !important;
88 | }
89 | .hidden-phone {
90 | display: none !important;
91 | }
92 | }
93 |
94 | @media (min-width: 1200px) {
95 | .row {
96 | margin-left: -30px;
97 | *zoom: 1;
98 | }
99 | .row:before,
100 | .row:after {
101 | display: table;
102 | line-height: 0;
103 | content: "";
104 | }
105 | .row:after {
106 | clear: both;
107 | }
108 | [class*="span"] {
109 | float: left;
110 | min-height: 1px;
111 | margin-left: 30px;
112 | }
113 | .container,
114 | .navbar-static-top .container,
115 | .navbar-fixed-top .container,
116 | .navbar-fixed-bottom .container {
117 | width: 1170px;
118 | }
119 | .span12 {
120 | width: 1170px;
121 | }
122 | .span11 {
123 | width: 1070px;
124 | }
125 | .span10 {
126 | width: 970px;
127 | }
128 | .span9 {
129 | width: 870px;
130 | }
131 | .span8 {
132 | width: 770px;
133 | }
134 | .span7 {
135 | width: 670px;
136 | }
137 | .span6 {
138 | width: 570px;
139 | }
140 | .span5 {
141 | width: 470px;
142 | }
143 | .span4 {
144 | width: 370px;
145 | }
146 | .span3 {
147 | width: 270px;
148 | }
149 | .span2 {
150 | width: 170px;
151 | }
152 | .span1 {
153 | width: 70px;
154 | }
155 | .offset12 {
156 | margin-left: 1230px;
157 | }
158 | .offset11 {
159 | margin-left: 1130px;
160 | }
161 | .offset10 {
162 | margin-left: 1030px;
163 | }
164 | .offset9 {
165 | margin-left: 930px;
166 | }
167 | .offset8 {
168 | margin-left: 830px;
169 | }
170 | .offset7 {
171 | margin-left: 730px;
172 | }
173 | .offset6 {
174 | margin-left: 630px;
175 | }
176 | .offset5 {
177 | margin-left: 530px;
178 | }
179 | .offset4 {
180 | margin-left: 430px;
181 | }
182 | .offset3 {
183 | margin-left: 330px;
184 | }
185 | .offset2 {
186 | margin-left: 230px;
187 | }
188 | .offset1 {
189 | margin-left: 130px;
190 | }
191 | .row-fluid {
192 | width: 100%;
193 | *zoom: 1;
194 | }
195 | .row-fluid:before,
196 | .row-fluid:after {
197 | display: table;
198 | line-height: 0;
199 | content: "";
200 | }
201 | .row-fluid:after {
202 | clear: both;
203 | }
204 | .row-fluid [class*="span"] {
205 | display: block;
206 | float: left;
207 | width: 100%;
208 | min-height: 30px;
209 | margin-left: 2.564102564102564%;
210 | *margin-left: 2.5109110747408616%;
211 | -webkit-box-sizing: border-box;
212 | -moz-box-sizing: border-box;
213 | box-sizing: border-box;
214 | }
215 | .row-fluid [class*="span"]:first-child {
216 | margin-left: 0;
217 | }
218 | .row-fluid .controls-row [class*="span"] + [class*="span"] {
219 | margin-left: 2.564102564102564%;
220 | }
221 | .row-fluid .span12 {
222 | width: 100%;
223 | *width: 99.94680851063829%;
224 | }
225 | .row-fluid .span11 {
226 | width: 91.45299145299145%;
227 | *width: 91.39979996362975%;
228 | }
229 | .row-fluid .span10 {
230 | width: 82.90598290598291%;
231 | *width: 82.8527914166212%;
232 | }
233 | .row-fluid .span9 {
234 | width: 74.35897435897436%;
235 | *width: 74.30578286961266%;
236 | }
237 | .row-fluid .span8 {
238 | width: 65.81196581196582%;
239 | *width: 65.75877432260411%;
240 | }
241 | .row-fluid .span7 {
242 | width: 57.26495726495726%;
243 | *width: 57.21176577559556%;
244 | }
245 | .row-fluid .span6 {
246 | width: 48.717948717948715%;
247 | *width: 48.664757228587014%;
248 | }
249 | .row-fluid .span5 {
250 | width: 40.17094017094017%;
251 | *width: 40.11774868157847%;
252 | }
253 | .row-fluid .span4 {
254 | width: 31.623931623931625%;
255 | *width: 31.570740134569924%;
256 | }
257 | .row-fluid .span3 {
258 | width: 23.076923076923077%;
259 | *width: 23.023731587561375%;
260 | }
261 | .row-fluid .span2 {
262 | width: 14.52991452991453%;
263 | *width: 14.476723040552828%;
264 | }
265 | .row-fluid .span1 {
266 | width: 5.982905982905983%;
267 | *width: 5.929714493544281%;
268 | }
269 | .row-fluid .offset12 {
270 | margin-left: 105.12820512820512%;
271 | *margin-left: 105.02182214948171%;
272 | }
273 | .row-fluid .offset12:first-child {
274 | margin-left: 102.56410256410257%;
275 | *margin-left: 102.45771958537915%;
276 | }
277 | .row-fluid .offset11 {
278 | margin-left: 96.58119658119658%;
279 | *margin-left: 96.47481360247316%;
280 | }
281 | .row-fluid .offset11:first-child {
282 | margin-left: 94.01709401709402%;
283 | *margin-left: 93.91071103837061%;
284 | }
285 | .row-fluid .offset10 {
286 | margin-left: 88.03418803418803%;
287 | *margin-left: 87.92780505546462%;
288 | }
289 | .row-fluid .offset10:first-child {
290 | margin-left: 85.47008547008548%;
291 | *margin-left: 85.36370249136206%;
292 | }
293 | .row-fluid .offset9 {
294 | margin-left: 79.48717948717949%;
295 | *margin-left: 79.38079650845607%;
296 | }
297 | .row-fluid .offset9:first-child {
298 | margin-left: 76.92307692307693%;
299 | *margin-left: 76.81669394435352%;
300 | }
301 | .row-fluid .offset8 {
302 | margin-left: 70.94017094017094%;
303 | *margin-left: 70.83378796144753%;
304 | }
305 | .row-fluid .offset8:first-child {
306 | margin-left: 68.37606837606839%;
307 | *margin-left: 68.26968539734497%;
308 | }
309 | .row-fluid .offset7 {
310 | margin-left: 62.393162393162385%;
311 | *margin-left: 62.28677941443899%;
312 | }
313 | .row-fluid .offset7:first-child {
314 | margin-left: 59.82905982905982%;
315 | *margin-left: 59.72267685033642%;
316 | }
317 | .row-fluid .offset6 {
318 | margin-left: 53.84615384615384%;
319 | *margin-left: 53.739770867430444%;
320 | }
321 | .row-fluid .offset6:first-child {
322 | margin-left: 51.28205128205128%;
323 | *margin-left: 51.175668303327875%;
324 | }
325 | .row-fluid .offset5 {
326 | margin-left: 45.299145299145295%;
327 | *margin-left: 45.1927623204219%;
328 | }
329 | .row-fluid .offset5:first-child {
330 | margin-left: 42.73504273504273%;
331 | *margin-left: 42.62865975631933%;
332 | }
333 | .row-fluid .offset4 {
334 | margin-left: 36.75213675213675%;
335 | *margin-left: 36.645753773413354%;
336 | }
337 | .row-fluid .offset4:first-child {
338 | margin-left: 34.18803418803419%;
339 | *margin-left: 34.081651209310785%;
340 | }
341 | .row-fluid .offset3 {
342 | margin-left: 28.205128205128204%;
343 | *margin-left: 28.0987452264048%;
344 | }
345 | .row-fluid .offset3:first-child {
346 | margin-left: 25.641025641025642%;
347 | *margin-left: 25.53464266230224%;
348 | }
349 | .row-fluid .offset2 {
350 | margin-left: 19.65811965811966%;
351 | *margin-left: 19.551736679396257%;
352 | }
353 | .row-fluid .offset2:first-child {
354 | margin-left: 17.094017094017094%;
355 | *margin-left: 16.98763411529369%;
356 | }
357 | .row-fluid .offset1 {
358 | margin-left: 11.11111111111111%;
359 | *margin-left: 11.004728132387708%;
360 | }
361 | .row-fluid .offset1:first-child {
362 | margin-left: 8.547008547008547%;
363 | *margin-left: 8.440625568285142%;
364 | }
365 | input,
366 | textarea,
367 | .uneditable-input {
368 | margin-left: 0;
369 | }
370 | .controls-row [class*="span"] + [class*="span"] {
371 | margin-left: 30px;
372 | }
373 | input.span12,
374 | textarea.span12,
375 | .uneditable-input.span12 {
376 | width: 1156px;
377 | }
378 | input.span11,
379 | textarea.span11,
380 | .uneditable-input.span11 {
381 | width: 1056px;
382 | }
383 | input.span10,
384 | textarea.span10,
385 | .uneditable-input.span10 {
386 | width: 956px;
387 | }
388 | input.span9,
389 | textarea.span9,
390 | .uneditable-input.span9 {
391 | width: 856px;
392 | }
393 | input.span8,
394 | textarea.span8,
395 | .uneditable-input.span8 {
396 | width: 756px;
397 | }
398 | input.span7,
399 | textarea.span7,
400 | .uneditable-input.span7 {
401 | width: 656px;
402 | }
403 | input.span6,
404 | textarea.span6,
405 | .uneditable-input.span6 {
406 | width: 556px;
407 | }
408 | input.span5,
409 | textarea.span5,
410 | .uneditable-input.span5 {
411 | width: 456px;
412 | }
413 | input.span4,
414 | textarea.span4,
415 | .uneditable-input.span4 {
416 | width: 356px;
417 | }
418 | input.span3,
419 | textarea.span3,
420 | .uneditable-input.span3 {
421 | width: 256px;
422 | }
423 | input.span2,
424 | textarea.span2,
425 | .uneditable-input.span2 {
426 | width: 156px;
427 | }
428 | input.span1,
429 | textarea.span1,
430 | .uneditable-input.span1 {
431 | width: 56px;
432 | }
433 | .thumbnails {
434 | margin-left: -30px;
435 | }
436 | .thumbnails > li {
437 | margin-left: 30px;
438 | }
439 | .row-fluid .thumbnails {
440 | margin-left: 0;
441 | }
442 | }
443 |
444 | @media (min-width: 768px) and (max-width: 979px) {
445 | .row {
446 | margin-left: -20px;
447 | *zoom: 1;
448 | }
449 | .row:before,
450 | .row:after {
451 | display: table;
452 | line-height: 0;
453 | content: "";
454 | }
455 | .row:after {
456 | clear: both;
457 | }
458 | [class*="span"] {
459 | float: left;
460 | min-height: 1px;
461 | margin-left: 20px;
462 | }
463 | .container,
464 | .navbar-static-top .container,
465 | .navbar-fixed-top .container,
466 | .navbar-fixed-bottom .container {
467 | width: 724px;
468 | }
469 | .span12 {
470 | width: 724px;
471 | }
472 | .span11 {
473 | width: 662px;
474 | }
475 | .span10 {
476 | width: 600px;
477 | }
478 | .span9 {
479 | width: 538px;
480 | }
481 | .span8 {
482 | width: 476px;
483 | }
484 | .span7 {
485 | width: 414px;
486 | }
487 | .span6 {
488 | width: 352px;
489 | }
490 | .span5 {
491 | width: 290px;
492 | }
493 | .span4 {
494 | width: 228px;
495 | }
496 | .span3 {
497 | width: 166px;
498 | }
499 | .span2 {
500 | width: 104px;
501 | }
502 | .span1 {
503 | width: 42px;
504 | }
505 | .offset12 {
506 | margin-left: 764px;
507 | }
508 | .offset11 {
509 | margin-left: 702px;
510 | }
511 | .offset10 {
512 | margin-left: 640px;
513 | }
514 | .offset9 {
515 | margin-left: 578px;
516 | }
517 | .offset8 {
518 | margin-left: 516px;
519 | }
520 | .offset7 {
521 | margin-left: 454px;
522 | }
523 | .offset6 {
524 | margin-left: 392px;
525 | }
526 | .offset5 {
527 | margin-left: 330px;
528 | }
529 | .offset4 {
530 | margin-left: 268px;
531 | }
532 | .offset3 {
533 | margin-left: 206px;
534 | }
535 | .offset2 {
536 | margin-left: 144px;
537 | }
538 | .offset1 {
539 | margin-left: 82px;
540 | }
541 | .row-fluid {
542 | width: 100%;
543 | *zoom: 1;
544 | }
545 | .row-fluid:before,
546 | .row-fluid:after {
547 | display: table;
548 | line-height: 0;
549 | content: "";
550 | }
551 | .row-fluid:after {
552 | clear: both;
553 | }
554 | .row-fluid [class*="span"] {
555 | display: block;
556 | float: left;
557 | width: 100%;
558 | min-height: 30px;
559 | margin-left: 2.7624309392265194%;
560 | *margin-left: 2.709239449864817%;
561 | -webkit-box-sizing: border-box;
562 | -moz-box-sizing: border-box;
563 | box-sizing: border-box;
564 | }
565 | .row-fluid [class*="span"]:first-child {
566 | margin-left: 0;
567 | }
568 | .row-fluid .controls-row [class*="span"] + [class*="span"] {
569 | margin-left: 2.7624309392265194%;
570 | }
571 | .row-fluid .span12 {
572 | width: 100%;
573 | *width: 99.94680851063829%;
574 | }
575 | .row-fluid .span11 {
576 | width: 91.43646408839778%;
577 | *width: 91.38327259903608%;
578 | }
579 | .row-fluid .span10 {
580 | width: 82.87292817679558%;
581 | *width: 82.81973668743387%;
582 | }
583 | .row-fluid .span9 {
584 | width: 74.30939226519337%;
585 | *width: 74.25620077583166%;
586 | }
587 | .row-fluid .span8 {
588 | width: 65.74585635359117%;
589 | *width: 65.69266486422946%;
590 | }
591 | .row-fluid .span7 {
592 | width: 57.18232044198895%;
593 | *width: 57.12912895262725%;
594 | }
595 | .row-fluid .span6 {
596 | width: 48.61878453038674%;
597 | *width: 48.56559304102504%;
598 | }
599 | .row-fluid .span5 {
600 | width: 40.05524861878453%;
601 | *width: 40.00205712942283%;
602 | }
603 | .row-fluid .span4 {
604 | width: 31.491712707182323%;
605 | *width: 31.43852121782062%;
606 | }
607 | .row-fluid .span3 {
608 | width: 22.92817679558011%;
609 | *width: 22.87498530621841%;
610 | }
611 | .row-fluid .span2 {
612 | width: 14.3646408839779%;
613 | *width: 14.311449394616199%;
614 | }
615 | .row-fluid .span1 {
616 | width: 5.801104972375691%;
617 | *width: 5.747913483013988%;
618 | }
619 | .row-fluid .offset12 {
620 | margin-left: 105.52486187845304%;
621 | *margin-left: 105.41847889972962%;
622 | }
623 | .row-fluid .offset12:first-child {
624 | margin-left: 102.76243093922652%;
625 | *margin-left: 102.6560479605031%;
626 | }
627 | .row-fluid .offset11 {
628 | margin-left: 96.96132596685082%;
629 | *margin-left: 96.8549429881274%;
630 | }
631 | .row-fluid .offset11:first-child {
632 | margin-left: 94.1988950276243%;
633 | *margin-left: 94.09251204890089%;
634 | }
635 | .row-fluid .offset10 {
636 | margin-left: 88.39779005524862%;
637 | *margin-left: 88.2914070765252%;
638 | }
639 | .row-fluid .offset10:first-child {
640 | margin-left: 85.6353591160221%;
641 | *margin-left: 85.52897613729868%;
642 | }
643 | .row-fluid .offset9 {
644 | margin-left: 79.8342541436464%;
645 | *margin-left: 79.72787116492299%;
646 | }
647 | .row-fluid .offset9:first-child {
648 | margin-left: 77.07182320441989%;
649 | *margin-left: 76.96544022569647%;
650 | }
651 | .row-fluid .offset8 {
652 | margin-left: 71.2707182320442%;
653 | *margin-left: 71.16433525332079%;
654 | }
655 | .row-fluid .offset8:first-child {
656 | margin-left: 68.50828729281768%;
657 | *margin-left: 68.40190431409427%;
658 | }
659 | .row-fluid .offset7 {
660 | margin-left: 62.70718232044199%;
661 | *margin-left: 62.600799341718584%;
662 | }
663 | .row-fluid .offset7:first-child {
664 | margin-left: 59.94475138121547%;
665 | *margin-left: 59.838368402492065%;
666 | }
667 | .row-fluid .offset6 {
668 | margin-left: 54.14364640883978%;
669 | *margin-left: 54.037263430116376%;
670 | }
671 | .row-fluid .offset6:first-child {
672 | margin-left: 51.38121546961326%;
673 | *margin-left: 51.27483249088986%;
674 | }
675 | .row-fluid .offset5 {
676 | margin-left: 45.58011049723757%;
677 | *margin-left: 45.47372751851417%;
678 | }
679 | .row-fluid .offset5:first-child {
680 | margin-left: 42.81767955801105%;
681 | *margin-left: 42.71129657928765%;
682 | }
683 | .row-fluid .offset4 {
684 | margin-left: 37.01657458563536%;
685 | *margin-left: 36.91019160691196%;
686 | }
687 | .row-fluid .offset4:first-child {
688 | margin-left: 34.25414364640884%;
689 | *margin-left: 34.14776066768544%;
690 | }
691 | .row-fluid .offset3 {
692 | margin-left: 28.45303867403315%;
693 | *margin-left: 28.346655695309746%;
694 | }
695 | .row-fluid .offset3:first-child {
696 | margin-left: 25.69060773480663%;
697 | *margin-left: 25.584224756083227%;
698 | }
699 | .row-fluid .offset2 {
700 | margin-left: 19.88950276243094%;
701 | *margin-left: 19.783119783707537%;
702 | }
703 | .row-fluid .offset2:first-child {
704 | margin-left: 17.12707182320442%;
705 | *margin-left: 17.02068884448102%;
706 | }
707 | .row-fluid .offset1 {
708 | margin-left: 11.32596685082873%;
709 | *margin-left: 11.219583872105325%;
710 | }
711 | .row-fluid .offset1:first-child {
712 | margin-left: 8.56353591160221%;
713 | *margin-left: 8.457152932878806%;
714 | }
715 | input,
716 | textarea,
717 | .uneditable-input {
718 | margin-left: 0;
719 | }
720 | .controls-row [class*="span"] + [class*="span"] {
721 | margin-left: 20px;
722 | }
723 | input.span12,
724 | textarea.span12,
725 | .uneditable-input.span12 {
726 | width: 710px;
727 | }
728 | input.span11,
729 | textarea.span11,
730 | .uneditable-input.span11 {
731 | width: 648px;
732 | }
733 | input.span10,
734 | textarea.span10,
735 | .uneditable-input.span10 {
736 | width: 586px;
737 | }
738 | input.span9,
739 | textarea.span9,
740 | .uneditable-input.span9 {
741 | width: 524px;
742 | }
743 | input.span8,
744 | textarea.span8,
745 | .uneditable-input.span8 {
746 | width: 462px;
747 | }
748 | input.span7,
749 | textarea.span7,
750 | .uneditable-input.span7 {
751 | width: 400px;
752 | }
753 | input.span6,
754 | textarea.span6,
755 | .uneditable-input.span6 {
756 | width: 338px;
757 | }
758 | input.span5,
759 | textarea.span5,
760 | .uneditable-input.span5 {
761 | width: 276px;
762 | }
763 | input.span4,
764 | textarea.span4,
765 | .uneditable-input.span4 {
766 | width: 214px;
767 | }
768 | input.span3,
769 | textarea.span3,
770 | .uneditable-input.span3 {
771 | width: 152px;
772 | }
773 | input.span2,
774 | textarea.span2,
775 | .uneditable-input.span2 {
776 | width: 90px;
777 | }
778 | input.span1,
779 | textarea.span1,
780 | .uneditable-input.span1 {
781 | width: 28px;
782 | }
783 | }
784 |
785 | @media (max-width: 767px) {
786 | body {
787 | padding-right: 20px;
788 | padding-left: 20px;
789 | }
790 | .navbar-fixed-top,
791 | .navbar-fixed-bottom,
792 | .navbar-static-top {
793 | margin-right: -20px;
794 | margin-left: -20px;
795 | }
796 | .container-fluid {
797 | padding: 0;
798 | }
799 | .dl-horizontal dt {
800 | float: none;
801 | width: auto;
802 | clear: none;
803 | text-align: left;
804 | }
805 | .dl-horizontal dd {
806 | margin-left: 0;
807 | }
808 | .container {
809 | width: auto;
810 | }
811 | .row-fluid {
812 | width: 100%;
813 | }
814 | .row,
815 | .thumbnails {
816 | margin-left: 0;
817 | }
818 | .thumbnails > li {
819 | float: none;
820 | margin-left: 0;
821 | }
822 | [class*="span"],
823 | .uneditable-input[class*="span"],
824 | .row-fluid [class*="span"] {
825 | display: block;
826 | float: none;
827 | width: 100%;
828 | margin-left: 0;
829 | -webkit-box-sizing: border-box;
830 | -moz-box-sizing: border-box;
831 | box-sizing: border-box;
832 | }
833 | .span12,
834 | .row-fluid .span12 {
835 | width: 100%;
836 | -webkit-box-sizing: border-box;
837 | -moz-box-sizing: border-box;
838 | box-sizing: border-box;
839 | }
840 | .row-fluid [class*="offset"]:first-child {
841 | margin-left: 0;
842 | }
843 | .input-large,
844 | .input-xlarge,
845 | .input-xxlarge,
846 | input[class*="span"],
847 | select[class*="span"],
848 | textarea[class*="span"],
849 | .uneditable-input {
850 | display: block;
851 | width: 100%;
852 | min-height: 30px;
853 | -webkit-box-sizing: border-box;
854 | -moz-box-sizing: border-box;
855 | box-sizing: border-box;
856 | }
857 | .input-prepend input,
858 | .input-append input,
859 | .input-prepend input[class*="span"],
860 | .input-append input[class*="span"] {
861 | display: inline-block;
862 | width: auto;
863 | }
864 | .controls-row [class*="span"] + [class*="span"] {
865 | margin-left: 0;
866 | }
867 | .modal {
868 | position: fixed;
869 | top: 20px;
870 | right: 20px;
871 | left: 20px;
872 | width: auto;
873 | margin: 0;
874 | }
875 | .modal.fade {
876 | top: -100px;
877 | }
878 | .modal.fade.in {
879 | top: 20px;
880 | }
881 | }
882 |
883 | @media (max-width: 480px) {
884 | .nav-collapse {
885 | -webkit-transform: translate3d(0, 0, 0);
886 | }
887 | .page-header h1 small {
888 | display: block;
889 | line-height: 20px;
890 | }
891 | input[type="checkbox"],
892 | input[type="radio"] {
893 | border: 1px solid #ccc;
894 | }
895 | .form-horizontal .control-label {
896 | float: none;
897 | width: auto;
898 | padding-top: 0;
899 | text-align: left;
900 | }
901 | .form-horizontal .controls {
902 | margin-left: 0;
903 | }
904 | .form-horizontal .control-list {
905 | padding-top: 0;
906 | }
907 | .form-horizontal .form-actions {
908 | padding-right: 10px;
909 | padding-left: 10px;
910 | }
911 | .media .pull-left,
912 | .media .pull-right {
913 | display: block;
914 | float: none;
915 | margin-bottom: 10px;
916 | }
917 | .media-object {
918 | margin-right: 0;
919 | margin-left: 0;
920 | }
921 | .modal {
922 | top: 10px;
923 | right: 10px;
924 | left: 10px;
925 | }
926 | .modal-header .close {
927 | padding: 10px;
928 | margin: -10px;
929 | }
930 | .carousel-caption {
931 | position: static;
932 | }
933 | }
934 |
935 | @media (max-width: 979px) {
936 | body {
937 | padding-top: 0;
938 | }
939 | .navbar-fixed-top,
940 | .navbar-fixed-bottom {
941 | position: static;
942 | }
943 | .navbar-fixed-top {
944 | margin-bottom: 20px;
945 | }
946 | .navbar-fixed-bottom {
947 | margin-top: 20px;
948 | }
949 | .navbar-fixed-top .navbar-inner,
950 | .navbar-fixed-bottom .navbar-inner {
951 | padding: 5px;
952 | }
953 | .navbar .container {
954 | width: auto;
955 | padding: 0;
956 | }
957 | .navbar .brand {
958 | padding-right: 10px;
959 | padding-left: 10px;
960 | margin: 0 0 0 -5px;
961 | }
962 | .nav-collapse {
963 | clear: both;
964 | }
965 | .nav-collapse .nav {
966 | float: none;
967 | margin: 0 0 10px;
968 | }
969 | .nav-collapse .nav > li {
970 | float: none;
971 | }
972 | .nav-collapse .nav > li > a {
973 | margin-bottom: 2px;
974 | }
975 | .nav-collapse .nav > .divider-vertical {
976 | display: none;
977 | }
978 | .nav-collapse .nav .nav-header {
979 | color: #777777;
980 | text-shadow: none;
981 | }
982 | .nav-collapse .nav > li > a,
983 | .nav-collapse .dropdown-menu a {
984 | padding: 9px 15px;
985 | font-weight: bold;
986 | color: #777777;
987 | -webkit-border-radius: 3px;
988 | -moz-border-radius: 3px;
989 | border-radius: 3px;
990 | }
991 | .nav-collapse .btn {
992 | padding: 4px 10px 4px;
993 | font-weight: normal;
994 | -webkit-border-radius: 4px;
995 | -moz-border-radius: 4px;
996 | border-radius: 4px;
997 | }
998 | .nav-collapse .dropdown-menu li + li a {
999 | margin-bottom: 2px;
1000 | }
1001 | .nav-collapse .nav > li > a:hover,
1002 | .nav-collapse .dropdown-menu a:hover {
1003 | background-color: #f2f2f2;
1004 | }
1005 | .navbar-inverse .nav-collapse .nav > li > a,
1006 | .navbar-inverse .nav-collapse .dropdown-menu a {
1007 | color: #999999;
1008 | }
1009 | .navbar-inverse .nav-collapse .nav > li > a:hover,
1010 | .navbar-inverse .nav-collapse .dropdown-menu a:hover {
1011 | background-color: #111111;
1012 | }
1013 | .nav-collapse.in .btn-group {
1014 | padding: 0;
1015 | margin-top: 5px;
1016 | }
1017 | .nav-collapse .dropdown-menu {
1018 | position: static;
1019 | top: auto;
1020 | left: auto;
1021 | display: none;
1022 | float: none;
1023 | max-width: none;
1024 | padding: 0;
1025 | margin: 0 15px;
1026 | background-color: transparent;
1027 | border: none;
1028 | -webkit-border-radius: 0;
1029 | -moz-border-radius: 0;
1030 | border-radius: 0;
1031 | -webkit-box-shadow: none;
1032 | -moz-box-shadow: none;
1033 | box-shadow: none;
1034 | }
1035 | .nav-collapse .open > .dropdown-menu {
1036 | display: block;
1037 | }
1038 | .nav-collapse .dropdown-menu:before,
1039 | .nav-collapse .dropdown-menu:after {
1040 | display: none;
1041 | }
1042 | .nav-collapse .dropdown-menu .divider {
1043 | display: none;
1044 | }
1045 | .nav-collapse .nav > li > .dropdown-menu:before,
1046 | .nav-collapse .nav > li > .dropdown-menu:after {
1047 | display: none;
1048 | }
1049 | .nav-collapse .navbar-form,
1050 | .nav-collapse .navbar-search {
1051 | float: none;
1052 | padding: 10px 15px;
1053 | margin: 10px 0;
1054 | border-top: 1px solid #f2f2f2;
1055 | border-bottom: 1px solid #f2f2f2;
1056 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1057 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1058 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1059 | }
1060 | .navbar-inverse .nav-collapse .navbar-form,
1061 | .navbar-inverse .nav-collapse .navbar-search {
1062 | border-top-color: #111111;
1063 | border-bottom-color: #111111;
1064 | }
1065 | .navbar .nav-collapse .nav.pull-right {
1066 | float: none;
1067 | margin-left: 0;
1068 | }
1069 | .nav-collapse,
1070 | .nav-collapse.collapse {
1071 | height: 0;
1072 | overflow: hidden;
1073 | }
1074 | .navbar .btn-navbar {
1075 | display: block;
1076 | }
1077 | .navbar-static .navbar-inner {
1078 | padding-right: 10px;
1079 | padding-left: 10px;
1080 | }
1081 | }
1082 |
1083 | @media (min-width: 980px) {
1084 | .nav-collapse.collapse {
1085 | height: auto !important;
1086 | overflow: visible !important;
1087 | }
1088 | }
1089 |
--------------------------------------------------------------------------------
/test/test.js:
--------------------------------------------------------------------------------
1 | var assert = require("assert");
2 | var sinon = require('sinon');
3 | var git2provCvt = require("../lib/git2provConverter");
4 | var fs = require('fs');
5 | var exec = require('child_process').exec;
6 | var serializers = require('../lib/provSerializer');
7 |
8 |
9 |
10 | describe('Unit', function(){
11 |
12 | var log_line1 = "Mac-open-c,9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d,21fd9dde98de5b31f4ca89fe0347b44fd2a1997a," +
13 | "jill,2014-08-14 09:42:05 -0400,vlad,2014-08-14 11:50:51 -0400,Modernized and harmonized the code,D";
14 | var log_line2 = "Mac-open-c,e01161193fe24e3c8f08a6d80c27ea33dac0c162,x y,bob,2014-08-12 20:06:41 -0400," +
15 | "john,2014-08-12 20:06:41 -0400,Initial import,A";
16 | var log_line3 = "README-md,9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d," +
17 | "21fd9dde98de5b31f4ca89fe0347b44fd2a1997a,vlad,2014-08-14 09:42:05 -0400,vlad,2014-08-14 11:50:51 -0400," +
18 | "Modernized and harmonized the code,M README.md";
19 |
20 |
21 | describe('ProvSerializer ShouldBeAdded', function() {
22 | var testColl = { 'a': 1, 'd': 23, 'bill': 9 };
23 | var ignoreBlock = "bob;bill,dope";
24 | it('Should allow to add property for which we have entry', function() {
25 | var a = 'a';
26 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'a-block');
27 | assert.equal(rv, true);
28 | } );
29 |
30 | it('Should not-allow to add property which we have in ignore block', function() {
31 | var a = 'bill';
32 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'bill');
33 | assert.equal(rv, false);
34 | } );
35 |
36 | it('Should not-allow to add property which is not in a collection', function() {
37 | var a = 'bruce';
38 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'bruce');
39 | assert.equal(rv, false);
40 | } );
41 | });
42 |
43 | describe('Add to JSON bundle', function() {
44 |
45 | var jSONObj;
46 | var ignoreBlock = "bob;dope";
47 | var provObj = { 'bills': [1,2,3], 'bundle': 'bill' };
48 |
49 | beforeEach(function(complete) {
50 | jSONObj = {'bundle': { 'bill': {}}};
51 | complete();
52 | });
53 |
54 | it('Should add bundle to JSON object', function() {
55 |
56 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,ignoreBlock,'bills','bill');
57 | assert.deepEqual({bill: [1,2,3]}, jSONObj.bundle.bill);
58 |
59 | } );
60 |
61 | it('Should add bundle to JSON object if set is ignored', function() {
62 |
63 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,"bill",'bills','bill');
64 | assert.deepEqual({}, jSONObj.bundle.bill);
65 |
66 | } );
67 |
68 | it('Should not add bundle to JSON object if receptacle is not there', function() {
69 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,ignoreBlock,'drews','drew');
70 | assert.deepEqual({}, jSONObj.bundle.bill);
71 |
72 | } );
73 | });
74 |
75 | describe('Record writers', function() {
76 |
77 | var agentsTestData = {'agents':{
78 | 'e1': {'prov:label': 'E1'},
79 | 'e2': {'prov:label': 'E2'}
80 | }};
81 |
82 | var communicationTestData = { 'x': {'prov:informant': 'Bob'} };
83 | var specializationTestData = { 'x': {'prov:agent': 'Alice', 'prov:generalEntity': 'Person'} };
84 | var attributionTestData = { 'x': {'prov:agent': 'Alice', 'prov:type': 'rumor'} };
85 | var qualifiedAttributionTestData = { 'x': {'prov:agent': 'Alice', 'prov:type': 'rumor',
86 | 'prov:role' : 'editor'} };
87 | var associationTestData = { 'x': {'prov:agent': 'Alice', 'prov:role': 'editor'} };
88 | var generationTestData = { 'x': {'prov:activity': 'Editing', 'prov:time': '12:44'} };
89 | var usageTestData = { 'x': {'prov:entity': 'Pamphlet1', 'prov:time': '12:44'} };
90 | var derivationTestData = { 'x': { 'prov:usedEntity': 'Table5', 'prov:activity': 'Editing',
91 | 'prov:generation': 'Table5_Gen', 'prov:usage': 'Table5_Use' }};
92 | var invalidationTestData = { 'x': {'prov:activity': 'Editing', 'prov:time': '12:44'} };
93 |
94 |
95 | function getN3Stub(triples) {
96 | var n3API = function () {};
97 | n3API.prototype.addTriple = function () {};
98 | n3API.prototype.find = function () {};
99 | var store = sinon.stub(new n3API());
100 | store.find.returns(triples);
101 | return store;
102 | }
103 |
104 | describe('PROV-N', function() {
105 |
106 | it("should add PROV-N entries correctly", function(){
107 | var initialRec = "[PREV]\n";
108 | var rv = serializers.recordWriters.provN.addProvNEntries(
109 | agentsTestData,
110 | "bob", initialRec,'agents','X', function(x,y) {
111 | return " : " + x[y]['prov:label'] ;
112 | });
113 | assert.equal(rv, initialRec + "X(e1 : E1)\nX(e2 : E2)\n" );
114 | });
115 |
116 |
117 | it("should add PROV-N entries correctly, using alternate subject", function(){
118 | var initialRec = "[PREV]\n";
119 | var rv = serializers.recordWriters.provN.addProvNEntries(
120 | {'agents':{
121 | 'e1-extra': {'prov:label': 'E1', 'prov:xactivity': 'e1'},
122 | 'e2-extra': {'prov:label': 'E2', 'prov:xactivity': 'e2'}
123 | }},
124 | "bob", initialRec,'agents','X', function(x,y) {
125 | return " : " + x[y]['prov:label'] ;
126 | }, "prov:xactivity" );
127 | assert.equal(rv, initialRec + "X(e1 : E1)\nX(e2 : E2)\n" );
128 | });
129 |
130 | it("should add PROV-N prefixes correctly", function(){
131 | var rv = serializers.recordWriters.provN.addPrefixes(
132 | {'prefixes':{
133 | 'p1': 'prefix1',
134 | 'p2': 'prefix2'
135 | }},
136 | "{S}\n" );
137 | assert.equal(rv, "{S}\nprefix p1 \nprefix p2 \n" );
138 | });
139 |
140 |
141 |
142 | it('Should give correct record for entity', function () {
143 | var rv = serializers.recordWriters.provN.entity({ 'x': {'prov:label': 'X'} }, 'x');
144 | assert.equal(rv, ", [prov:label=\"X\"]");
145 | });
146 |
147 | it('Should give correct record for was started by', function () {
148 | var rv = serializers.recordWriters.provN.wasStartedBy({ 'x': {'prov:time': '11111'} }, 'x');
149 | assert.equal(rv, ", -, -, 11111");
150 | });
151 |
152 | it('Should give correct record for communication', function () {
153 | var rv = serializers.recordWriters.provN.communication(communicationTestData, 'x');
154 | assert.equal(rv, ", Bob");
155 | });
156 |
157 | it('Should give correct record for attribution', function () {
158 | var rv = serializers.recordWriters.provN.attribution(attributionTestData, 'x');
159 | assert.equal(rv, ", Alice, [prov:type=\"rumor\"]");
160 | });
161 |
162 | it('Should give correct record for association', function () {
163 | var rv = serializers.recordWriters.provN.association(associationTestData, 'x');
164 | assert.equal(rv, ", Alice, [prov:role=\"editor\"]");
165 | });
166 |
167 | it('Should give correct record for specialization', function () {
168 | var rv = serializers.recordWriters.provN.specialization(specializationTestData, 'x');
169 | assert.equal(rv, ", Person");
170 | });
171 |
172 | it('Should give correct record for generation', function () {
173 | var rv = serializers.recordWriters.provN.generation(generationTestData, 'x');
174 | assert.equal(rv, ", Editing, 12:44");
175 | });
176 |
177 | it('Should give correct record for usage', function () {
178 | var rv = serializers.recordWriters.provN.usage(usageTestData, 'x');
179 | assert.equal(rv, ", Pamphlet1, 12:44");
180 | });
181 |
182 | it('Should give correct record for invalidation', function () {
183 | var rv = serializers.recordWriters.provN.invalidation(invalidationTestData, 'x');
184 | assert.equal(rv, ", Editing, 12:44");
185 | });
186 |
187 | it('Should give correct record for derivation', function () {
188 |
189 | var rv = serializers.recordWriters.provN.derivation(derivationTestData, 'x');
190 | assert.equal(rv, ", Table5, Editing, Table5_Gen, Table5_Use");
191 | });
192 |
193 | });
194 |
195 | describe('ProvO', function(){
196 |
197 | var store;
198 |
199 | beforeEach(function() {
200 | store = getN3Stub();
201 | });
202 |
203 | it('Should add prefixes correctly', function() {
204 |
205 | serializers.recordWriters.provO.addPrefix( store,
206 | {'prefixes':{
207 | 'e1-extra': "http://x1",
208 | 'e2-extra': "http://x2"
209 | }});
210 |
211 | assert.equal(store.addTriple.called,true);
212 | assert.deepEqual(store.addTriple.getCall(0).args,["@prefix","prov:",""]);
213 | assert.deepEqual(store.addTriple.getCall(1).args,["@prefix","rdfs:",""]);
214 | assert.deepEqual(store.addTriple.getCall(2).args,["@prefix","xsd:",""]);
215 | assert.deepEqual(store.addTriple.getCall(3).args,["@prefix","e1-extra:",""]);
216 | assert.deepEqual(store.addTriple.getCall(4).args,["@prefix","e2-extra:",""]);
217 | });
218 |
219 | it('Should add alt bundles correctly', function() {
220 |
221 | serializers.recordWriters.provO.addAltBundle(
222 | {'bundle': 'A1', 'alternateBundle': 'A44' }, store);
223 |
224 | assert.equal(store.addTriple.called,true);
225 | assert.deepEqual(store.addTriple.getCall(0).args,["A1","a","prov:Bundle"]);
226 | assert.deepEqual(store.addTriple.getCall(1).args,["A1","prov:alternateOf","A44"]);
227 |
228 | });
229 |
230 | it('Should add entities correctly', function() {
231 | serializers.recordWriters.provO.addEntities( store,
232 | {'entities':{
233 | 'e1-extra': {'prov:label': 'E1', 'prov:xactivity': 'e1'},
234 | 'e2-extra': {'prov:label': 'E2', 'prov:xactivity': 'e2'}
235 | }}, "bob",'entities','entity', serializers.recordWriters.provO.entity);
236 |
237 | assert.equal(store.addTriple.called,true);
238 | assert.deepEqual(store.addTriple.getCall(0).args,["e1-extra","a","prov:Entity"]);
239 | assert.deepEqual(store.addTriple.getCall(1).args,["e1-extra","rdfs:label","\"E1\"@en"]);
240 | assert.deepEqual(store.addTriple.getCall(2).args,["e2-extra","a","prov:Entity"]);
241 | assert.deepEqual(store.addTriple.getCall(3).args,["e2-extra","rdfs:label","\"E2\"@en"]);
242 | });
243 |
244 | it('Should add entities correctly', function() {
245 | serializers.recordWriters.provO.addEntitiesD( store,
246 | {'g': { 'e1': {'spec': 'x', 'prov:generalEntity': 'E5' }}},
247 | "bob",'g','generated', serializers.recordWriters.provO.generalization, 'spec');
248 | assert.equal(store.addTriple.called,true);
249 | assert.deepEqual(store.addTriple.getCall(0).args,["generated","prov:specializationOf","E5"]);
250 | });
251 |
252 | it('Should add agents correctly', function() {
253 |
254 | serializers.recordWriters.provO.addEntities( store, agentsTestData,
255 | "bob",'agents','agent',serializers.recordWriters.provO.entity);
256 |
257 | assert.equal(store.addTriple.called,true);
258 | assert.deepEqual(store.addTriple.getCall(0).args,["e1","a","prov:Agent"]);
259 | assert.deepEqual(store.addTriple.getCall(1).args,["e1","rdfs:label","\"E1\"@en"]);
260 | assert.deepEqual(store.addTriple.getCall(2).args,["e2","a","prov:Agent"]);
261 | assert.deepEqual(store.addTriple.getCall(3).args,["e2","rdfs:label","\"E2\"@en"]);
262 | });
263 |
264 | it('Should add communication correctly', function() {
265 | serializers.recordWriters.provO.communication( store, communicationTestData,'x','F5');
266 | assert.equal(store.addTriple.called,true);
267 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasInformedBy","Bob"]);
268 | });
269 |
270 | it('Should add specialization correctly', function() {
271 | serializers.recordWriters.provO.generalization( store, specializationTestData,'x','Alice');
272 | assert.equal(store.addTriple.called,true);
273 | assert.deepEqual(store.addTriple.getCall(0).args,["Alice","prov:specializationOf","Person"]);
274 | });
275 |
276 | it('Should add attribution correctly', function() {
277 | serializers.recordWriters.provO.attribution(store, attributionTestData,'x','wasAttributedTo','F5');
278 | assert.equal(store.addTriple.called,true);
279 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAttributedTo","Alice"]);
280 | });
281 |
282 | it('Should add qualified attribution correctly', function() {
283 | serializers.recordWriters.provO.attribution(store, qualifiedAttributionTestData,'x','wasAttributedTo','F5');
284 | assert.equal(store.addTriple.called,true);
285 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAttributedTo","Alice"]);
286 | assert.deepEqual(store.addTriple.getCall(1).args,["F5","prov:qualifiedAttribution","[ a prov:Attribution ; prov:agent Alice ; a \"rumor\"@en ]"]);
287 | });
288 |
289 | it('Should add association correctly', function() {
290 | serializers.recordWriters.provO.association(store, associationTestData,'x','wasAssociatedWith','F5');
291 | assert.equal(store.addTriple.called,true);
292 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAssociatedWith","Alice"]);
293 | assert.deepEqual(store.addTriple.getCall(1).args,["F5","prov:qualifiedAssociation","[ a prov:Association ; prov:agent Alice ; prov:hadRole \"editor\"@en ]"]);
294 | });
295 |
296 | it('Should add activity start correctly', function() {
297 | var testData = { 'x': {'prov:time': '10:44'} };
298 | serializers.recordWriters.provO.activityStart(store, testData,'x','F5');
299 | assert.equal(store.addTriple.called,true);
300 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:startedAtTime","\"10:44\"^^xsd:dateTime"]);
301 | });
302 |
303 | it('Should add activity end correctly', function() {
304 | var testData = { 'x': {'prov:time': '10:44'} };
305 | serializers.recordWriters.provO.activityEnd(store, testData,'x','F5');
306 | assert.equal(store.addTriple.called,true);
307 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:endedAtTime","\"10:44\"^^xsd:dateTime"]);
308 | });
309 |
310 | it('Should add generation correctly', function() {
311 | serializers.recordWriters.provO.generation(store, generationTestData,'x','wasGeneratedBy', 'F5');
312 | assert.equal(store.addTriple.called,true);
313 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasGeneratedBy","Editing"]);
314 | assert.deepEqual(store.addTriple.getCall(1).args,["F5",
315 | "prov:qualifiedGeneration",
316 | "[ a prov:Generation ; prov:activity Editing ; prov:atTime \"12:44\"^^xsd:dateTime ]"]);
317 | });
318 |
319 | it('Should add usage correctly', function() {
320 | serializers.recordWriters.provO.usage(store, usageTestData,'x','usedBy', 'F5');
321 | assert.equal(store.addTriple.called,true);
322 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:usedBy","Pamphlet1"]);
323 | assert.deepEqual(store.addTriple.getCall(1).args,["F5",
324 | "prov:qualifiedUsage",
325 | "[ a prov:Usage ; prov:entity Pamphlet1 ; prov:atTime \"12:44\"^^xsd:dateTime ]"]);
326 | });
327 |
328 | it('Should add derivation correctly', function() {
329 | serializers.recordWriters.provO.derivation(store, derivationTestData,'x','derived', 'F5');
330 | assert.equal(store.addTriple.called,true);
331 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:derived","Table5"]);
332 | assert.deepEqual(store.addTriple.getCall(1).args,["F5",
333 | "prov:qualifiedDerivation",
334 | "[ a prov:Derivation ; prov:entity Table5 ; prov:hadGeneration Table5_Gen ; prov:hadUsage Table5_Use ; prov:hadActivity Editing ]"]);
335 | });
336 |
337 | it('Should add invalidation correctly', function() {
338 | serializers.recordWriters.provO.invalidation(store, invalidationTestData,'x','invalidated', 'F5');
339 | assert.equal(store.addTriple.called,true);
340 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:invalidated","Editing"]);
341 | assert.deepEqual(store.addTriple.getCall(1).args,["F5",
342 | "prov:qualifiedInvalidation",
343 | "[ a prov:Invalidation ; prov:activity Editing ; prov:atTime \"12:44\"^^xsd:dateTime ]"]);
344 | });
345 |
346 |
347 | describe("Nice Turtle writer", function(){
348 |
349 | describe('CMP', function(){
350 |
351 | it('should return 0 when properties are the same', function(){
352 | var rv = serializers.recordWriters.provO.cmp('a','a');
353 | assert.equal(0,rv);});
354 |
355 | it('should return -1 when first property is smaller', function(){
356 | var rv = serializers.recordWriters.provO.cmp('a','b');
357 | assert.equal(-1,rv);});
358 |
359 | it('should return 1 when first property is larger', function(){
360 | var rv = serializers.recordWriters.provO.cmp('f','b');
361 | assert.equal(1,rv);});
362 |
363 | });
364 |
365 | describe('Statement from Triple', function(){
366 |
367 | var triple = { 'subject': 'bob', 'predicate': 'eats', 'object': 'pie'};
368 | var statementFromTriple = serializers.recordWriters.provO.statementFromTriple;
369 |
370 | it('should output whole statement when no specialial cases apply', function() {
371 | var rv = statementFromTriple(triple,0,false,false);
372 | assert.equal(rv, "bob\teats\tpie ");
373 | });
374 |
375 | it('should prepend statement with .\\n if it is not a first triple ', function() {
376 |
377 | var rv = statementFromTriple(triple,5,false,false);
378 | assert.equal(rv, ".\nbob\teats\tpie ");
379 | });
380 |
381 | it('should skip subject if it is the same as previous ', function() {
382 |
383 | var rv = statementFromTriple(triple,5,true,false);
384 | assert.equal(rv, ";\n\t\teats\tpie ");
385 | });
386 |
387 | it('should skip predicate if it is the same as previous ', function() {
388 | var rv = statementFromTriple(triple,5,true,true);
389 | assert.equal(rv, ",\n\t\t\t\tpie ");
390 | });
391 |
392 | });
393 |
394 |
395 | describe('Get turtle from N3', function(){
396 |
397 | var store = getN3Stub([
398 | {subject:'@prefix',predicate:'b',object:'c'},
399 | {subject:'a',predicate:'b',object:'c'}
400 | ]);
401 |
402 | it('should get correct representation of triples', function(){
403 | var rv = serializers.recordWriters.provO.getTurtle(store);
404 | assert.equal("@prefix b c .\n" +
405 | "a\tb\tc .",rv);
406 | });
407 |
408 | });
409 |
410 | });
411 |
412 |
413 | });
414 |
415 | });
416 |
417 |
418 | describe('ProvObject', function() {
419 |
420 |
421 |
422 | it('should be constructed and have all necessary sections', function(){
423 | var p = git2provCvt.getProvObject([],"http:/x");
424 | assert.equal(p.bundle, "http:/x:provenance");
425 | assert.deepEqual(p.entities, {});
426 | });
427 |
428 | describe('Update based on commit obj', function(){
429 |
430 | var cm1 = git2provCvt.getCommitObj(log_line1);
431 | var cm2 = git2provCvt.getCommitObj(log_line2);
432 | var cm3 = git2provCvt.getCommitObj(log_line3);
433 |
434 | var pObj = git2provCvt.getProvObject([],"http://y");
435 |
436 | before(function(){
437 | git2provCvt.updateProvObj(pObj,"http://y",cm1);
438 | git2provCvt.updateProvObj(pObj,"http://y",cm2);
439 | git2provCvt.updateProvObj(pObj,"http://y",cm3);
440 | });
441 |
442 | it('Should contain 2 commits in the activity section', function(){
443 | assert.deepEqual(Object.keys(pObj.activities).sort(),[
444 | "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
445 | "http://y:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
446 | ]);
447 | });
448 |
449 | it('Should contain 2 files in the entities section', function(){
450 | assert.deepEqual(Object.keys(pObj.entities).sort(),[
451 | "http://y:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
452 | "http://y:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
453 | "http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
454 | ]);
455 | });
456 |
457 | it('Should contain 2 starts in the starts section', function(){
458 | assert.deepEqual(Object.keys(pObj.starts).sort(),[
459 | "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_start",
460 | "http://y:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_start"
461 | ]);
462 | });
463 |
464 | it('Should contain information linkage in the communications section', function(){
465 | var comm_1 = "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_comm";
466 | assert.deepEqual(Object.keys(pObj.communications).sort(),[
467 | comm_1
468 | ]);
469 |
470 | assert.equal(pObj.communications[comm_1]["prov:informant"],"http://y:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a");
471 | assert.equal(pObj.communications[comm_1]["prov:informed"],"http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d");
472 | });
473 |
474 |
475 | it('Should contain derivation linkage in the communications section', function(){
476 | var comm_1 = "http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der";
477 | assert.deepEqual(Object.keys(pObj.derivations).sort(),[
478 | comm_1
479 | ]);
480 |
481 | assert.equal(pObj.derivations[comm_1]["prov:generation"],"http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen");
482 | assert.equal(pObj.derivations[comm_1]["prov:usedEntity"],"http://y:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a");
483 | });
484 |
485 |
486 |
487 | });
488 |
489 | });
490 |
491 | describe('Commit Obj', function(){
492 |
493 |
494 | var obj1 = git2provCvt.getCommitObj(log_line1);
495 | var obj2 = git2provCvt.getCommitObj(log_line2);
496 |
497 | it("should contain entity id", function() {
498 | assert.equal(obj1.entity, "file-Mac-open-c");
499 | assert.equal(obj2.entity, "file-Mac-open-c");
500 | });
501 |
502 | it("should contain commit-id", function() {
503 | assert.equal(obj1.id, "commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d");
504 | assert.equal(obj2.id, "commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162");
505 | });
506 |
507 | it("should contain parents id", function() {
508 | assert.deepEqual(obj1.parents, ["21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"]);
509 | assert.deepEqual(obj2.parents, ["x","y"]);
510 | });
511 |
512 | it("should contain author", function() {
513 | assert.equal(obj1.author, "user-jill");
514 | assert.equal(obj2.author, "user-bob");
515 | });
516 |
517 | it("should contain author label", function() {
518 | assert.equal(obj1.author_label, "jill");
519 | assert.equal(obj2.author_label, "bob");
520 | });
521 |
522 | it("should contain author date", function() {
523 | assert.equal(obj1.author_date, "2014-08-14T13:42:05.000Z");
524 | assert.equal(obj2.author_date, "2014-08-13T00:06:41.000Z");
525 | });
526 |
527 | it("should contain committer", function() {
528 | assert.equal(obj1.commiter, "user-vlad");
529 | assert.equal(obj2.commiter, "user-john");
530 | });
531 |
532 | it("should contain committer label", function() {
533 | assert.equal(obj1.commiter_label, "vlad");
534 | assert.equal(obj2.commiter_label, "john");
535 | });
536 |
537 | it("should contain committer date", function() {
538 | assert.equal(obj1.commiter_date, "2014-08-14T15:50:51.000Z");
539 | assert.equal(obj2.commiter_date, "2014-08-13T00:06:41.000Z");
540 | });
541 |
542 | it("should contain subject", function() {
543 | assert.equal(obj1.subject, "Modernized and harmonized the code");
544 | assert.equal(obj2.subject, "Initial import");
545 | });
546 |
547 | it("should contain mod type", function() {
548 | assert.equal(obj1.modification_type, "D");
549 | assert.equal(obj2.modification_type, "A");
550 | });
551 |
552 |
553 |
554 |
555 | });
556 |
557 | describe('Get Prefixes', function(){
558 |
559 | it('Shoud generate correct prefix map',function(){
560 |
561 | var prefixes = git2provCvt.getPrefixes("result", "http://xx/", "PROV-O");
562 |
563 | assert.deepEqual(prefixes,{
564 | "fullResult": "&serialization=PROV-O#",
565 | "result": "http://xx/#"
566 | });
567 |
568 | });
569 |
570 |
571 | });
572 |
573 | describe('Process file list into log commands ', function(){
574 |
575 | var provObj = git2provCvt.getProvObject(git2provCvt.getPrefixes("result:","http:/zz","PROV-O"));
576 | var fileList = "README.md\n\n\n\ngit2provConverter.js\nindex.js";
577 | var log_cmds;
578 |
579 | before(function(){
580 | log_cmds = git2provCvt.getLogCommands(provObj,fileList,"result:",{});
581 | });
582 |
583 | it("process file into correct log command list", function(){
584 |
585 | assert.deepEqual(log_cmds,[
586 | "git --no-pager log --date=iso --name-status --pretty=format:\"README-md,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- README.md",
587 | "git --no-pager log --date=iso --name-status --pretty=format:\"git2provConverter-js,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- git2provConverter.js",
588 | "git --no-pager log --date=iso --name-status --pretty=format:\"index-js,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- index.js"
589 | ]);
590 |
591 | } );
592 |
593 | });
594 |
595 | var rqURL = "http://x/";
596 | var provObject;
597 |
598 |
599 |
600 | describe('PROV-XML serialization', function(){
601 |
602 | it("Should return serialization unsupported", function(done){
603 |
604 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-XML");
605 | provObject = git2provCvt.getProvObject(prefixes, rqURL);
606 |
607 |
608 | serializers.serializePROVXML(
609 | git2provCvt.getProvObject(provObject, rqURL),
610 | '',
611 | function(result,type){
612 |
613 | assert.equal(type,"text/plain");
614 | assert.equal(result,"serialization unsupported");
615 |
616 | done();
617 | }
618 | );
619 | });
620 | });
621 |
622 |
623 | describe('Serialization', function(){
624 |
625 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-XML");
626 | provObject = git2provCvt.getProvObject(prefixes, rqURL);
627 |
628 |
629 | it("Should return correct minimal PROV-N", function(done){
630 |
631 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-N");
632 | provObject = git2provCvt.getProvObject(prefixes, rqURL);
633 |
634 | serializers.serializePROVN (provObject,'',function(result,type){
635 |
636 | assert.equal(type,"text/plain");
637 | assert.deepEqual(result.split("\n"),[
638 | "document",
639 | "prefix result: ",
640 | "prefix fullResult <&serialization=PROV-N#>",
641 | "bundle http://x/:provenance",
642 | "endBundle ",
643 | "endDocument",
644 | ""
645 | ]);
646 |
647 | done();
648 | }
649 | );
650 | });
651 |
652 |
653 | it("Should return correct minimal PROV-O", function(done){
654 |
655 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-O");
656 | provObject = git2provCvt.getProvObject(prefixes, rqURL);
657 |
658 | serializers.serializePROVO (provObject,'',function(result,type){
659 |
660 | assert.equal(type,"text/plain");
661 | assert.deepEqual(result.split("\n"),[
662 | "@prefix fullResult: <&serialization=PROV-O#> .",
663 | "@prefix prov: .",
664 | "@prefix rdfs: .",
665 | "@prefix result:: .",
666 | "@prefix xsd: .",
667 | "http://x/:provenance\ta\tprov:Bundle ;",
668 | "\t\tprov:alternateOf\tfullResult:provenance ."
669 | ]);
670 |
671 | done();
672 | }
673 | );
674 | });
675 |
676 |
677 | it("Should return correct minimal PROV-JSON", function(done){
678 |
679 | var rqURL = "http://x/";
680 | var provObject = git2provCvt.getProvObject(git2provCvt.getPrefixes("result:", rqURL, "PROV-JSON"), rqURL);
681 |
682 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-JSON");
683 | provObject = git2provCvt.getProvObject(prefixes, rqURL);
684 |
685 |
686 | serializers.serializePROVJSON(provObject, '', function(result,type){
687 |
688 | assert.equal(type,"text/plain");
689 | assert.equal(result,"{\n \"prefix\": {\n" +
690 | " \"result:\": \"http://x/#\",\n" +
691 | " \"fullResult\": \"&serialization=PROV-JSON#\"\n },\n" +
692 | " \"bundle\": {\n \"http://x/:provenance\": {\n \"entity\": {},\n" +
693 | " \"agent\": {},\n \"activity\": {},\n \"wasStartedBy\": {},\n" +
694 | " \"wasEndedBy\": {},\n \"wasAttributedTo\": {},\n" +
695 | " \"wasAssociatedWith\": {},\n" +
696 | " \"wasInformedBy\": {},\n" +
697 | " \"specializationOf\": {},\n" +
698 | " \"wasGeneratedBy\": {},\n" +
699 | " \"used\": {},\n" +
700 | " \"wasDerivedFrom\": {},\n" +
701 | " \"wasInvalidatedBy\": {}\n" +
702 | " }\n }\n}");
703 |
704 | done();
705 | }
706 | );
707 | });
708 | });
709 |
710 |
711 | });
712 |
713 |
714 | describe('Integration', function(){
715 |
716 |
717 | beforeEach(function(complete) {
718 | exec("rm -rf testRepo", { timeout : 5000 },
719 | function() { complete(); });
720 | });
721 |
722 | describe('Test Repo', function(){
723 |
724 | it('should give correct PROV-O serialization on test ProvTrace repo', function(done){
725 |
726 | fs.readFile('test/testProvOdata.n3','utf8', function(err,provOData) {
727 |
728 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-O","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){
729 | assert.deepEqual(a.split('\n'), provOData.split('\n'));
730 | assert.equal(b, null);
731 | assert.equal(c,"text/plain");
732 | done();
733 |
734 | });
735 | });
736 | });
737 |
738 | it('should give correct PROV-JSON serialization on test ProvTrace repo', function(done){
739 |
740 | fs.readFile('test/testProvJSONData.json','utf8', function(err,provJSONData) {
741 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-JSON","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){
742 | var parsedTestData = JSON.parse(provJSONData);
743 | var parsedProvData = JSON.parse(a);
744 | assert.deepEqual(parsedProvData, parsedTestData);
745 | assert.equal(b, null);
746 | assert.equal(c,"text/plain");
747 | done();
748 | });
749 | });
750 | });
751 |
752 | it('should give correct PROV-XML serialization on test ProvTrace repo', function(done){
753 |
754 | fs.readFile('test/testProvXMLData.xml','utf8', function(err,provXMLData) {
755 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-XML","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){
756 | assert.deepEqual(a, provXMLData);
757 | assert.equal(b, null);
758 | assert.equal(c,"text/plain");
759 | done();
760 | });
761 | });
762 | });
763 |
764 | it('should give correct PROV-N serialization on test ProvTrace repo', function(done){
765 |
766 | fs.readFile('test/testProvNdata.n3','utf8', function(err,provXMLData) {
767 |
768 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-N","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){
769 | assert.deepEqual(a, provXMLData);
770 | assert.equal(b, null);
771 | assert.equal(c,"text/plain");
772 | done();
773 | });
774 | });
775 | });
776 |
777 | });
778 | });
779 |
780 |
--------------------------------------------------------------------------------
/test/testProvJSONData.json:
--------------------------------------------------------------------------------
1 | {
2 | "prefix": {
3 | "result": "http://xxx.bob&d=1#",
4 | "fullResult": "http://xxx.bob&serialization=PROV-JSON#"
5 | },
6 | "bundle": {
7 | "result:provenance": {
8 | "entity": {
9 | "result:file--gitignore": {
10 | "prov:label": ".gitignore"
11 | },
12 | "result:file-Berksfile": {
13 | "prov:label": "Berksfile"
14 | },
15 | "result:file-Linux-call_watcher-c": {
16 | "prov:label": "Linux/call_watcher.c"
17 | },
18 | "result:file-Linux-test-sh": {
19 | "prov:label": "Linux/test.sh"
20 | },
21 | "result:file-Mac-call_watcher-c": {
22 | "prov:label": "Mac/call_watcher.c"
23 | },
24 | "result:file-Mac-test-c": {
25 | "prov:label": "Mac/test.c"
26 | },
27 | "result:file-Mac-test-sh": {
28 | "prov:label": "Mac/test.sh"
29 | },
30 | "result:file-Vagrantfile": {
31 | "prov:label": "Vagrantfile"
32 | },
33 | "result:file-LICENSE": {
34 | "prov:label": "LICENSE"
35 | },
36 | "result:file-README-md": {
37 | "prov:label": "README.md"
38 | },
39 | "result:file-Linux-Makefile": {
40 | "prov:label": "Linux/Makefile"
41 | },
42 | "result:file-Linux-myPreload-c": {
43 | "prov:label": "Linux/myPreload.c"
44 | },
45 | "result:file-Linux-test-c": {
46 | "prov:label": "Linux/test.c"
47 | },
48 | "result:file-Mac-Makefile": {
49 | "prov:label": "Mac/Makefile"
50 | },
51 | "result:file-Mac-inject-h": {
52 | "prov:label": "Mac/inject.h"
53 | },
54 | "result:file-Mac-inject-m": {
55 | "prov:label": "Mac/inject.m"
56 | },
57 | "result:file-Mac-open-c": {
58 | "prov:label": "Mac/open.c"
59 | },
60 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
61 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
62 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
63 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
64 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
65 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
66 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
67 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
68 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
69 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
70 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
71 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
72 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
73 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {},
74 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
75 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": {},
76 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": {},
77 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
78 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
79 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
80 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
81 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
82 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
83 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {},
84 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}
85 | },
86 | "agent": {
87 | "result:user-vlad": {
88 | "prov:label": "vlad"
89 | },
90 | "result:user-Vlad-Korolev": {
91 | "prov:label": "Vlad Korolev"
92 | }
93 | },
94 | "activity": {
95 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {
96 | "prov:label": "Modernized and harmonized the code"
97 | },
98 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {
99 | "prov:label": "Initial import"
100 | },
101 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": {
102 | "prov:label": "Initial commit"
103 | }
104 | },
105 | "wasStartedBy": {
106 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_start": {
107 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
108 | "prov:time": "2014-08-14T13:42:05.000Z"
109 | },
110 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_start": {
111 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
112 | "prov:time": "2014-08-13T00:06:41.000Z"
113 | },
114 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_start": {
115 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
116 | "prov:time": "2014-08-14T15:21:06.000Z"
117 | }
118 | },
119 | "wasEndedBy": {
120 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_end": {
121 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
122 | "prov:time": "2014-08-14T15:50:51.000Z"
123 | },
124 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_end": {
125 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
126 | "prov:time": "2014-08-13T00:06:41.000Z"
127 | },
128 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_end": {
129 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
130 | "prov:time": "2014-08-14T15:41:35.000Z"
131 | }
132 | },
133 | "wasAttributedTo": {
134 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
135 | "prov:entity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
136 | "prov:agent": "result:user-vlad",
137 | "prov:type": "authorship"
138 | },
139 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
140 | "prov:entity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
141 | "prov:agent": "result:user-vlad",
142 | "prov:type": "authorship"
143 | },
144 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
145 | "prov:entity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
146 | "prov:agent": "result:user-vlad",
147 | "prov:type": "authorship"
148 | },
149 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
150 | "prov:entity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
151 | "prov:agent": "result:user-vlad",
152 | "prov:type": "authorship"
153 | },
154 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
155 | "prov:entity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
156 | "prov:agent": "result:user-vlad",
157 | "prov:type": "authorship"
158 | },
159 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
160 | "prov:entity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
161 | "prov:agent": "result:user-vlad",
162 | "prov:type": "authorship"
163 | },
164 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
165 | "prov:entity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
166 | "prov:agent": "result:user-vlad",
167 | "prov:type": "authorship"
168 | },
169 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
170 | "prov:entity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
171 | "prov:agent": "result:user-vlad",
172 | "prov:type": "authorship"
173 | },
174 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
175 | "prov:entity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
176 | "prov:agent": "result:user-vlad",
177 | "prov:type": "authorship"
178 | },
179 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
180 | "prov:entity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
181 | "prov:agent": "result:user-vlad",
182 | "prov:type": "authorship"
183 | },
184 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
185 | "prov:entity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
186 | "prov:agent": "result:user-vlad",
187 | "prov:type": "authorship"
188 | },
189 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
190 | "prov:entity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
191 | "prov:agent": "result:user-vlad",
192 | "prov:type": "authorship"
193 | },
194 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
195 | "prov:entity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
196 | "prov:agent": "result:user-vlad",
197 | "prov:type": "authorship"
198 | },
199 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": {
200 | "prov:entity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
201 | "prov:agent": "result:user-vlad",
202 | "prov:type": "authorship"
203 | },
204 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
205 | "prov:entity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
206 | "prov:agent": "result:user-vlad",
207 | "prov:type": "authorship"
208 | },
209 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_attr": {
210 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
211 | "prov:agent": "result:user-Vlad-Korolev",
212 | "prov:type": "authorship"
213 | },
214 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_attr": {
215 | "prov:entity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
216 | "prov:agent": "result:user-Vlad-Korolev",
217 | "prov:type": "authorship"
218 | },
219 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
220 | "prov:entity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
221 | "prov:agent": "result:user-vlad",
222 | "prov:type": "authorship"
223 | },
224 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
225 | "prov:entity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
226 | "prov:agent": "result:user-vlad",
227 | "prov:type": "authorship"
228 | },
229 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
230 | "prov:entity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
231 | "prov:agent": "result:user-vlad",
232 | "prov:type": "authorship"
233 | },
234 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
235 | "prov:entity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
236 | "prov:agent": "result:user-vlad",
237 | "prov:type": "authorship"
238 | },
239 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
240 | "prov:entity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
241 | "prov:agent": "result:user-vlad",
242 | "prov:type": "authorship"
243 | },
244 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
245 | "prov:entity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
246 | "prov:agent": "result:user-vlad",
247 | "prov:type": "authorship"
248 | },
249 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
250 | "prov:entity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
251 | "prov:agent": "result:user-vlad",
252 | "prov:type": "authorship"
253 | },
254 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": {
255 | "prov:entity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
256 | "prov:agent": "result:user-vlad",
257 | "prov:type": "authorship"
258 | }
259 | },
260 | "wasAssociatedWith": {
261 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_assoc": {
262 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
263 | "prov:agent": "result:user-vlad",
264 | "prov:role": "author, committer"
265 | },
266 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_assoc": {
267 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
268 | "prov:agent": "result:user-vlad",
269 | "prov:role": "author, committer"
270 | },
271 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_assoc": {
272 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
273 | "prov:agent": "result:user-Vlad-Korolev",
274 | "prov:role": "author"
275 | },
276 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-vlad_assoc": {
277 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
278 | "prov:agent": "result:user-vlad",
279 | "prov:role": "committer, committer"
280 | }
281 | },
282 | "wasInformedBy": {
283 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_comm": {
284 | "prov:informant": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
285 | "prov:informed": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
286 | }
287 | },
288 | "specializationOf": {
289 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
290 | "prov:generalEntity": "result:file-Mac-open-c",
291 | "prov:specificEntity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
292 | },
293 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
294 | "prov:generalEntity": "result:file-Mac-open-c",
295 | "prov:specificEntity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
296 | },
297 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
298 | "prov:generalEntity": "result:file-Mac-inject-m",
299 | "prov:specificEntity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
300 | },
301 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
302 | "prov:generalEntity": "result:file-Mac-inject-m",
303 | "prov:specificEntity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
304 | },
305 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
306 | "prov:generalEntity": "result:file-Mac-inject-h",
307 | "prov:specificEntity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
308 | },
309 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
310 | "prov:generalEntity": "result:file-Mac-inject-h",
311 | "prov:specificEntity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
312 | },
313 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
314 | "prov:generalEntity": "result:file-Mac-Makefile",
315 | "prov:specificEntity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
316 | },
317 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
318 | "prov:generalEntity": "result:file-Mac-Makefile",
319 | "prov:specificEntity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
320 | },
321 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
322 | "prov:generalEntity": "result:file-Linux-test-c",
323 | "prov:specificEntity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
324 | },
325 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
326 | "prov:generalEntity": "result:file-Linux-test-c",
327 | "prov:specificEntity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
328 | },
329 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
330 | "prov:generalEntity": "result:file-Linux-myPreload-c",
331 | "prov:specificEntity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
332 | },
333 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
334 | "prov:generalEntity": "result:file-Linux-myPreload-c",
335 | "prov:specificEntity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
336 | },
337 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
338 | "prov:generalEntity": "result:file-Linux-Makefile",
339 | "prov:specificEntity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
340 | },
341 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": {
342 | "prov:generalEntity": "result:file-Linux-Makefile",
343 | "prov:specificEntity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"
344 | },
345 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
346 | "prov:generalEntity": "result:file-README-md",
347 | "prov:specificEntity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
348 | },
349 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_spec": {
350 | "prov:generalEntity": "result:file-README-md",
351 | "prov:specificEntity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"
352 | },
353 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_spec": {
354 | "prov:generalEntity": "result:file-LICENSE",
355 | "prov:specificEntity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"
356 | },
357 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
358 | "prov:generalEntity": "result:file-Vagrantfile",
359 | "prov:specificEntity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
360 | },
361 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
362 | "prov:generalEntity": "result:file-Mac-test-sh",
363 | "prov:specificEntity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
364 | },
365 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
366 | "prov:generalEntity": "result:file-Mac-test-c",
367 | "prov:specificEntity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
368 | },
369 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
370 | "prov:generalEntity": "result:file-Mac-call_watcher-c",
371 | "prov:specificEntity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
372 | },
373 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
374 | "prov:generalEntity": "result:file-Linux-test-sh",
375 | "prov:specificEntity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
376 | },
377 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
378 | "prov:generalEntity": "result:file-Linux-call_watcher-c",
379 | "prov:specificEntity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
380 | },
381 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
382 | "prov:generalEntity": "result:file-Berksfile",
383 | "prov:specificEntity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
384 | },
385 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": {
386 | "prov:generalEntity": "result:file--gitignore",
387 | "prov:specificEntity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"
388 | }
389 | },
390 | "wasGeneratedBy": {
391 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
392 | "prov:entity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
393 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
394 | "prov:time": "2014-08-13T00:06:41.000Z"
395 | },
396 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
397 | "prov:entity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
398 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
399 | "prov:time": "2014-08-13T00:06:41.000Z"
400 | },
401 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
402 | "prov:entity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
403 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
404 | "prov:time": "2014-08-13T00:06:41.000Z"
405 | },
406 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
407 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
408 | "prov:entity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
409 | "prov:time": "2014-08-14T13:42:05.000Z"
410 | },
411 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
412 | "prov:entity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
413 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
414 | "prov:time": "2014-08-13T00:06:41.000Z"
415 | },
416 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
417 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
418 | "prov:entity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
419 | "prov:time": "2014-08-14T13:42:05.000Z"
420 | },
421 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
422 | "prov:entity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
423 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
424 | "prov:time": "2014-08-13T00:06:41.000Z"
425 | },
426 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
427 | "prov:entity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
428 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
429 | "prov:time": "2014-08-13T00:06:41.000Z"
430 | },
431 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
432 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
433 | "prov:entity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
434 | "prov:time": "2014-08-14T13:42:05.000Z"
435 | },
436 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": {
437 | "prov:entity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
438 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162",
439 | "prov:time": "2014-08-13T00:06:41.000Z"
440 | },
441 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
442 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
443 | "prov:entity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
444 | "prov:time": "2014-08-14T13:42:05.000Z"
445 | },
446 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_gen": {
447 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
448 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
449 | "prov:time": "2014-08-14T15:21:06.000Z"
450 | },
451 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_gen": {
452 | "prov:entity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
453 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
454 | "prov:time": "2014-08-14T15:21:06.000Z"
455 | },
456 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
457 | "prov:entity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
458 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
459 | "prov:time": "2014-08-14T13:42:05.000Z"
460 | },
461 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
462 | "prov:entity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
463 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
464 | "prov:time": "2014-08-14T13:42:05.000Z"
465 | },
466 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
467 | "prov:entity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
468 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
469 | "prov:time": "2014-08-14T13:42:05.000Z"
470 | },
471 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
472 | "prov:entity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
473 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
474 | "prov:time": "2014-08-14T13:42:05.000Z"
475 | },
476 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
477 | "prov:entity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
478 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
479 | "prov:time": "2014-08-14T13:42:05.000Z"
480 | },
481 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
482 | "prov:entity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
483 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
484 | "prov:time": "2014-08-14T13:42:05.000Z"
485 | },
486 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
487 | "prov:entity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
488 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
489 | "prov:time": "2014-08-14T13:42:05.000Z"
490 | },
491 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": {
492 | "prov:entity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
493 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
494 | "prov:time": "2014-08-14T13:42:05.000Z"
495 | }
496 | },
497 | "used": {
498 | "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": {
499 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
500 | "prov:entity": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
501 | "prov:time": "2014-08-14T13:42:05.000Z"
502 | },
503 | "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": {
504 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
505 | "prov:entity": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
506 | "prov:time": "2014-08-14T13:42:05.000Z"
507 | },
508 | "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": {
509 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
510 | "prov:entity": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
511 | "prov:time": "2014-08-14T13:42:05.000Z"
512 | },
513 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": {
514 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
515 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
516 | "prov:time": "2014-08-14T13:42:05.000Z"
517 | }
518 | },
519 | "wasDerivedFrom": {
520 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": {
521 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
522 | "prov:generatedEntity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
523 | "prov:usedEntity": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
524 | "prov:generation": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen",
525 | "prov:usage": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use"
526 | },
527 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": {
528 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
529 | "prov:generatedEntity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
530 | "prov:usedEntity": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
531 | "prov:generation": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen",
532 | "prov:usage": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use"
533 | },
534 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": {
535 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
536 | "prov:generatedEntity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
537 | "prov:usedEntity": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
538 | "prov:generation": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen",
539 | "prov:usage": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use"
540 | },
541 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": {
542 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
543 | "prov:generatedEntity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
544 | "prov:usedEntity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a",
545 | "prov:generation": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen",
546 | "prov:usage": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use"
547 | }
548 | },
549 | "wasInvalidatedBy": {
550 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": {
551 | "prov:entity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
552 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
553 | "prov:time": "2014-08-14T13:42:05.000Z"
554 | },
555 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": {
556 | "prov:entity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
557 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
558 | "prov:time": "2014-08-14T13:42:05.000Z"
559 | },
560 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": {
561 | "prov:entity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
562 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
563 | "prov:time": "2014-08-14T13:42:05.000Z"
564 | },
565 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": {
566 | "prov:entity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
567 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d",
568 | "prov:time": "2014-08-14T13:42:05.000Z"
569 | }
570 | }
571 | }
572 | }
573 | }
--------------------------------------------------------------------------------