pact_broker 0.0.10 → 1.0.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +0 -3
- data/README.md +28 -1
- data/Rakefile +4 -2
- data/assets/d3.v3.js +9263 -0
- data/assets/force.csv +29 -0
- data/assets/index.html +186 -0
- data/assets/index2.html +224 -0
- data/assets/relationships +4 -0
- data/assets/stylesheets/github.css +387 -0
- data/bethtest.rb +67 -0
- data/config.ru +10 -4
- data/config/boot.rb +4 -0
- data/example/Gemfile +5 -0
- data/example/config.ru +18 -0
- data/lib/db.rb +52 -0
- data/lib/pact_broker.rb +2 -0
- data/lib/pact_broker/api.rb +2 -0
- data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +32 -0
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +43 -0
- data/lib/pact_broker/api/resources/latest_pact.rb +7 -1
- data/lib/pact_broker/api/resources/relationships.rb +29 -0
- data/lib/pact_broker/app.rb +82 -0
- data/lib/pact_broker/configuration.rb +47 -0
- data/lib/pact_broker/db.rb +7 -39
- data/lib/pact_broker/models/relationship.rb +27 -0
- data/lib/pact_broker/project_root.rb +7 -0
- data/lib/pact_broker/services/pacticipant_service.rb +6 -0
- data/lib/pact_broker/ui/controllers/base_controller.rb +15 -0
- data/lib/pact_broker/ui/controllers/clusters.rb +28 -0
- data/lib/pact_broker/ui/controllers/relationships.rb +21 -0
- data/lib/pact_broker/ui/view_models/clusters.rb +0 -0
- data/lib/pact_broker/ui/view_models/relationship.rb +35 -0
- data/lib/pact_broker/ui/view_models/relationships.rb +21 -0
- data/lib/pact_broker/ui/views/clusters/show.haml +2 -0
- data/lib/pact_broker/ui/views/layouts/main.haml +2 -0
- data/lib/pact_broker/ui/views/relationships/show.haml +44 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/rack/hal_browser.rb +1 -0
- data/lib/rack/hal_browser/redirect.rb +45 -0
- data/pact_broker.gemspec +10 -8
- data/public/bootstrap.zip +0 -0
- data/public/config.json +412 -0
- data/public/css/bootstrap-theme.css +346 -0
- data/public/css/bootstrap-theme.min.css +7 -0
- data/public/css/bootstrap.css +5780 -0
- data/public/css/bootstrap.min.css +7 -0
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +229 -0
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/javascripts/jquery-2.1.1.min.js +4 -0
- data/public/javascripts/jquery.tablesorter.js +1765 -0
- data/public/javascripts/jquery.tablesorter.min.js +5 -0
- data/public/js/bootstrap.js +1943 -0
- data/public/js/bootstrap.min.js +7 -0
- data/public/stylesheets/github.css +387 -0
- data/public/stylesheets/relationships.css +18 -0
- data/script/update-hal-browser +6 -0
- data/spec/fixtures/renderer_pact.json +34 -0
- data/spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb +30 -0
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +29 -0
- data/spec/lib/pact_broker/api/resources/latest_pact_spec.rb +57 -0
- data/spec/lib/pact_broker/configuration_spec.rb +21 -0
- data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +30 -0
- data/spec/lib/pact_broker/ui/controllers/clusters_spec.rb +27 -0
- data/spec/lib/pact_broker/ui/controllers/relationships_spec.rb +37 -0
- data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +29 -0
- data/spec/lib/rack/hal_browser/redirect_spec.rb +63 -0
- data/spec/service_consumers/pact_helper.rb +1 -1
- data/spec/spec_helper.rb +10 -3
- data/tasks/database.rb +57 -0
- data/tasks/db.rake +57 -12
- data/tasks/pact.rake +1 -1
- data/tasks/rspec.rake +1 -9
- data/vendor/hal-browser/.gitignore +1 -0
- data/vendor/hal-browser/MIT-LICENSE.txt +20 -0
- data/vendor/hal-browser/README.md +35 -0
- data/vendor/hal-browser/browser.html +246 -0
- data/vendor/hal-browser/js/hal.js +57 -0
- data/vendor/hal-browser/js/hal/browser.js +60 -0
- data/vendor/hal-browser/js/hal/http/client.js +38 -0
- data/vendor/hal-browser/js/hal/resource.js +34 -0
- data/vendor/hal-browser/js/hal/views/browser.js +29 -0
- data/vendor/hal-browser/js/hal/views/documentation.js +7 -0
- data/vendor/hal-browser/js/hal/views/embedded_resource.js +56 -0
- data/vendor/hal-browser/js/hal/views/embedded_resources.js +41 -0
- data/vendor/hal-browser/js/hal/views/explorer.js +23 -0
- data/vendor/hal-browser/js/hal/views/inspector.js +39 -0
- data/vendor/hal-browser/js/hal/views/links.js +54 -0
- data/vendor/hal-browser/js/hal/views/location_bar.js +40 -0
- data/vendor/hal-browser/js/hal/views/navigation.js +19 -0
- data/vendor/hal-browser/js/hal/views/non_safe_request_dialog.js +53 -0
- data/vendor/hal-browser/js/hal/views/properties.js +14 -0
- data/vendor/hal-browser/js/hal/views/query_uri_dialog.js +69 -0
- data/vendor/hal-browser/js/hal/views/request_headers.js +30 -0
- data/vendor/hal-browser/js/hal/views/resource.js +38 -0
- data/vendor/hal-browser/js/hal/views/response.js +24 -0
- data/vendor/hal-browser/js/hal/views/response_body.js +40 -0
- data/vendor/hal-browser/js/hal/views/response_headers.js +19 -0
- data/vendor/hal-browser/styles.css +67 -0
- data/vendor/hal-browser/vendor/css/bootstrap-responsive.css +1109 -0
- data/vendor/hal-browser/vendor/css/bootstrap.css +6158 -0
- data/vendor/hal-browser/vendor/img/ajax-loader.gif +0 -0
- data/vendor/hal-browser/vendor/img/glyphicons-halflings-white.png +0 -0
- data/vendor/hal-browser/vendor/img/glyphicons-halflings.png +0 -0
- data/vendor/hal-browser/vendor/js/backbone.js +1487 -0
- data/vendor/hal-browser/vendor/js/bootstrap.js +2276 -0
- data/vendor/hal-browser/vendor/js/jquery-1.9.1.js +9597 -0
- data/vendor/hal-browser/vendor/js/underscore.js +1227 -0
- data/vendor/hal-browser/vendor/js/uritemplates.js +438 -0
- metadata +162 -47
- data/Gemfile.lock +0 -110
@@ -0,0 +1,438 @@
|
|
1
|
+
/*
|
2
|
+
UriTemplates Template Processor - Version: @VERSION - Dated: @DATE
|
3
|
+
(c) marc.portier@gmail.com - 2011-2012
|
4
|
+
Licensed under ALPv2
|
5
|
+
*/
|
6
|
+
|
7
|
+
;
|
8
|
+
var uritemplate = (function() {
|
9
|
+
|
10
|
+
// Below are the functions we originally used from jQuery.
|
11
|
+
// The implementations below are often more naive then what is inside jquery, but they suffice for our needs.
|
12
|
+
|
13
|
+
function isFunction(fn) {
|
14
|
+
return typeof fn == 'function';
|
15
|
+
}
|
16
|
+
|
17
|
+
function isEmptyObject (obj) {
|
18
|
+
for(var name in obj){
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
|
24
|
+
function extend(base, newprops) {
|
25
|
+
for (var name in newprops) {
|
26
|
+
base[name] = newprops[name];
|
27
|
+
}
|
28
|
+
return base;
|
29
|
+
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Create a runtime cache around retrieved values from the context.
|
33
|
+
* This allows for dynamic (function) results to be kept the same for multiple
|
34
|
+
* occuring expansions within one template.
|
35
|
+
* Note: Uses key-value tupples to be able to cache null values as well.
|
36
|
+
*/
|
37
|
+
//TODO move this into prep-processing
|
38
|
+
function CachingContext(context) {
|
39
|
+
this.raw = context;
|
40
|
+
this.cache = {};
|
41
|
+
}
|
42
|
+
CachingContext.prototype.get = function(key) {
|
43
|
+
var val = this.lookupRaw(key);
|
44
|
+
var result = val;
|
45
|
+
|
46
|
+
if (isFunction(val)) { // check function-result-cache
|
47
|
+
var tupple = this.cache[key];
|
48
|
+
if (tupple !== null && tupple !== undefined) {
|
49
|
+
result = tupple.val;
|
50
|
+
} else {
|
51
|
+
result = val(this.raw);
|
52
|
+
this.cache[key] = {key: key, val: result};
|
53
|
+
// NOTE: by storing tupples we make sure a null return is validly consistent too in expansions
|
54
|
+
}
|
55
|
+
}
|
56
|
+
return result;
|
57
|
+
};
|
58
|
+
|
59
|
+
CachingContext.prototype.lookupRaw = function(key) {
|
60
|
+
return CachingContext.lookup(this, this.raw, key);
|
61
|
+
};
|
62
|
+
|
63
|
+
CachingContext.lookup = function(me, context, key) {
|
64
|
+
var result = context[key];
|
65
|
+
if (result !== undefined) {
|
66
|
+
return result;
|
67
|
+
} else {
|
68
|
+
var keyparts = key.split('.');
|
69
|
+
var i = 0, keysplits = keyparts.length - 1;
|
70
|
+
for (i = 0; i<keysplits; i++) {
|
71
|
+
var leadKey = keyparts.slice(0, keysplits - i).join('.');
|
72
|
+
var trailKey = keyparts.slice(-i-1).join('.');
|
73
|
+
var leadContext = context[leadKey];
|
74
|
+
if (leadContext !== undefined) {
|
75
|
+
return CachingContext.lookup(me, leadContext, trailKey);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
return undefined;
|
79
|
+
}
|
80
|
+
};
|
81
|
+
|
82
|
+
|
83
|
+
function UriTemplate(set) {
|
84
|
+
this.set = set;
|
85
|
+
}
|
86
|
+
|
87
|
+
UriTemplate.prototype.expand = function(context) {
|
88
|
+
var cache = new CachingContext(context);
|
89
|
+
var res = "";
|
90
|
+
var i = 0, cnt = this.set.length;
|
91
|
+
for (i = 0; i<cnt; i++ ) {
|
92
|
+
res += this.set[i].expand(cache);
|
93
|
+
}
|
94
|
+
return res;
|
95
|
+
};
|
96
|
+
|
97
|
+
//TODO: change since draft-0.6 about characters in literals
|
98
|
+
/* extract:
|
99
|
+
The characters outside of expressions in a URI Template string are intended to be copied literally to the URI-reference if the character is allowed in a URI (reserved / unreserved / pct-encoded) or, if not allowed, copied to the URI-reference in its UTF-8 pct-encoded form.
|
100
|
+
*/
|
101
|
+
function Literal(txt ) {
|
102
|
+
this.txt = txt;
|
103
|
+
}
|
104
|
+
|
105
|
+
Literal.prototype.expand = function() {
|
106
|
+
return this.txt;
|
107
|
+
};
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
var RESERVEDCHARS_RE = new RegExp("[:/?#\\[\\]@!$&()*+,;=']","g");
|
112
|
+
function encodeNormal(val) {
|
113
|
+
return encodeURIComponent(val).replace(RESERVEDCHARS_RE, function(s) {return escape(s);} );
|
114
|
+
}
|
115
|
+
|
116
|
+
//var SELECTEDCHARS_RE = new RegExp("[]","g");
|
117
|
+
function encodeReserved(val) {
|
118
|
+
//return encodeURI(val).replace(SELECTEDCHARS_RE, function(s) {return escape(s)} );
|
119
|
+
return encodeURI(val); // no need for additional replace if selected-chars is empty
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
function addUnNamed(name, key, val) {
|
124
|
+
return key + (key.length > 0 ? "=" : "") + val;
|
125
|
+
}
|
126
|
+
|
127
|
+
function addNamed(name, key, val, noName) {
|
128
|
+
noName = noName || false;
|
129
|
+
if (noName) { name = ""; }
|
130
|
+
|
131
|
+
if (!key || key.length === 0) {
|
132
|
+
key = name;
|
133
|
+
}
|
134
|
+
return key + (key.length > 0 ? "=" : "") + val;
|
135
|
+
}
|
136
|
+
|
137
|
+
function addLabeled(name, key, val, noName) {
|
138
|
+
noName = noName || false;
|
139
|
+
if (noName) { name = ""; }
|
140
|
+
|
141
|
+
if (!key || key.length === 0) {
|
142
|
+
key = name;
|
143
|
+
}
|
144
|
+
return key + (key.length > 0 && val ? "=" : "") + val;
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
var simpleConf = {
|
149
|
+
prefix : "", joiner : ",", encode : encodeNormal, builder : addUnNamed
|
150
|
+
};
|
151
|
+
var reservedConf = {
|
152
|
+
prefix : "", joiner : ",", encode : encodeReserved, builder : addUnNamed
|
153
|
+
};
|
154
|
+
var fragmentConf = {
|
155
|
+
prefix : "#", joiner : ",", encode : encodeReserved, builder : addUnNamed
|
156
|
+
};
|
157
|
+
var pathParamConf = {
|
158
|
+
prefix : ";", joiner : ";", encode : encodeNormal, builder : addLabeled
|
159
|
+
};
|
160
|
+
var formParamConf = {
|
161
|
+
prefix : "?", joiner : "&", encode : encodeNormal, builder : addNamed
|
162
|
+
};
|
163
|
+
var formContinueConf = {
|
164
|
+
prefix : "&", joiner : "&", encode : encodeNormal, builder : addNamed
|
165
|
+
};
|
166
|
+
var pathHierarchyConf = {
|
167
|
+
prefix : "/", joiner : "/", encode : encodeNormal, builder : addUnNamed
|
168
|
+
};
|
169
|
+
var labelConf = {
|
170
|
+
prefix : ".", joiner : ".", encode : encodeNormal, builder : addUnNamed
|
171
|
+
};
|
172
|
+
|
173
|
+
|
174
|
+
function Expression(conf, vars ) {
|
175
|
+
extend(this, conf);
|
176
|
+
this.vars = vars;
|
177
|
+
}
|
178
|
+
|
179
|
+
Expression.build = function(ops, vars) {
|
180
|
+
var conf;
|
181
|
+
switch(ops) {
|
182
|
+
case '' : conf = simpleConf; break;
|
183
|
+
case '+' : conf = reservedConf; break;
|
184
|
+
case '#' : conf = fragmentConf; break;
|
185
|
+
case ';' : conf = pathParamConf; break;
|
186
|
+
case '?' : conf = formParamConf; break;
|
187
|
+
case '&' : conf = formContinueConf; break;
|
188
|
+
case '/' : conf = pathHierarchyConf; break;
|
189
|
+
case '.' : conf = labelConf; break;
|
190
|
+
default : throw "Unexpected operator: '"+ops+"'";
|
191
|
+
}
|
192
|
+
return new Expression(conf, vars);
|
193
|
+
};
|
194
|
+
|
195
|
+
Expression.prototype.expand = function(context) {
|
196
|
+
var joiner = this.prefix;
|
197
|
+
var nextjoiner = this.joiner;
|
198
|
+
var buildSegment = this.builder;
|
199
|
+
var res = "";
|
200
|
+
var i = 0, cnt = this.vars.length;
|
201
|
+
|
202
|
+
for (i = 0 ; i< cnt; i++) {
|
203
|
+
var varspec = this.vars[i];
|
204
|
+
varspec.addValues(context, this.encode, function(key, val, noName) {
|
205
|
+
var segm = buildSegment(varspec.name, key, val, noName);
|
206
|
+
if (segm !== null && segm !== undefined) {
|
207
|
+
res += joiner + segm;
|
208
|
+
joiner = nextjoiner;
|
209
|
+
}
|
210
|
+
});
|
211
|
+
}
|
212
|
+
return res;
|
213
|
+
};
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
var UNBOUND = {};
|
218
|
+
|
219
|
+
/**
|
220
|
+
* Helper class to help grow a string of (possibly encoded) parts until limit is reached
|
221
|
+
*/
|
222
|
+
function Buffer(limit) {
|
223
|
+
this.str = "";
|
224
|
+
if (limit === UNBOUND) {
|
225
|
+
this.appender = Buffer.UnboundAppend;
|
226
|
+
} else {
|
227
|
+
this.len = 0;
|
228
|
+
this.limit = limit;
|
229
|
+
this.appender = Buffer.BoundAppend;
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
Buffer.prototype.append = function(part, encoder) {
|
234
|
+
return this.appender(this, part, encoder);
|
235
|
+
};
|
236
|
+
|
237
|
+
Buffer.UnboundAppend = function(me, part, encoder) {
|
238
|
+
part = encoder ? encoder(part) : part;
|
239
|
+
me.str += part;
|
240
|
+
return me;
|
241
|
+
};
|
242
|
+
|
243
|
+
Buffer.BoundAppend = function(me, part, encoder) {
|
244
|
+
part = part.substring(0, me.limit - me.len);
|
245
|
+
me.len += part.length;
|
246
|
+
|
247
|
+
part = encoder ? encoder(part) : part;
|
248
|
+
me.str += part;
|
249
|
+
return me;
|
250
|
+
};
|
251
|
+
|
252
|
+
|
253
|
+
function arrayToString(arr, encoder, maxLength) {
|
254
|
+
var buffer = new Buffer(maxLength);
|
255
|
+
var joiner = "";
|
256
|
+
|
257
|
+
var i = 0, cnt = arr.length;
|
258
|
+
for (i=0; i<cnt; i++) {
|
259
|
+
if (arr[i] !== null && arr[i] !== undefined) {
|
260
|
+
buffer.append(joiner).append(arr[i], encoder);
|
261
|
+
joiner = ",";
|
262
|
+
}
|
263
|
+
}
|
264
|
+
return buffer.str;
|
265
|
+
}
|
266
|
+
|
267
|
+
function objectToString(obj, encoder, maxLength) {
|
268
|
+
var buffer = new Buffer(maxLength);
|
269
|
+
var joiner = "";
|
270
|
+
var k;
|
271
|
+
|
272
|
+
for (k in obj) {
|
273
|
+
if (obj.hasOwnProperty(k) ) {
|
274
|
+
if (obj[k] !== null && obj[k] !== undefined) {
|
275
|
+
buffer.append(joiner + k + ',').append(obj[k], encoder);
|
276
|
+
joiner = ",";
|
277
|
+
}
|
278
|
+
}
|
279
|
+
}
|
280
|
+
return buffer.str;
|
281
|
+
}
|
282
|
+
|
283
|
+
|
284
|
+
function simpleValueHandler(me, val, valprops, encoder, adder) {
|
285
|
+
var result;
|
286
|
+
|
287
|
+
if (valprops.isArr) {
|
288
|
+
result = arrayToString(val, encoder, me.maxLength);
|
289
|
+
} else if (valprops.isObj) {
|
290
|
+
result = objectToString(val, encoder, me.maxLength);
|
291
|
+
} else {
|
292
|
+
var buffer = new Buffer(me.maxLength);
|
293
|
+
result = buffer.append(val, encoder).str;
|
294
|
+
}
|
295
|
+
|
296
|
+
adder("", result);
|
297
|
+
}
|
298
|
+
|
299
|
+
function explodeValueHandler(me, val, valprops, encoder, adder) {
|
300
|
+
if (valprops.isArr) {
|
301
|
+
var i = 0, cnt = val.length;
|
302
|
+
for (i = 0; i<cnt; i++) {
|
303
|
+
adder("", encoder(val[i]) );
|
304
|
+
}
|
305
|
+
} else if (valprops.isObj) {
|
306
|
+
var k;
|
307
|
+
for (k in val) {
|
308
|
+
if (val.hasOwnProperty(k)) {
|
309
|
+
adder(k, encoder(val[k]) );
|
310
|
+
}
|
311
|
+
}
|
312
|
+
} else { // explode-requested, but single value
|
313
|
+
adder("", encoder(val));
|
314
|
+
}
|
315
|
+
}
|
316
|
+
|
317
|
+
function valueProperties(val) {
|
318
|
+
var isArr = false;
|
319
|
+
var isObj = false;
|
320
|
+
var isUndef = true; //note: "" is empty but not undef
|
321
|
+
|
322
|
+
if (val !== null && val !== undefined) {
|
323
|
+
isArr = (val.constructor === Array);
|
324
|
+
isObj = (val.constructor === Object);
|
325
|
+
isUndef = (isArr && val.length === 0) || (isObj && isEmptyObject(val));
|
326
|
+
}
|
327
|
+
|
328
|
+
return {isArr: isArr, isObj: isObj, isUndef: isUndef};
|
329
|
+
}
|
330
|
+
|
331
|
+
|
332
|
+
function VarSpec (name, vhfn, nums) {
|
333
|
+
this.name = unescape(name);
|
334
|
+
this.valueHandler = vhfn;
|
335
|
+
this.maxLength = nums;
|
336
|
+
}
|
337
|
+
|
338
|
+
|
339
|
+
VarSpec.build = function(name, expl, part, nums) {
|
340
|
+
var valueHandler, valueModifier;
|
341
|
+
|
342
|
+
if (!!expl) { //interprete as boolean
|
343
|
+
valueHandler = explodeValueHandler;
|
344
|
+
} else {
|
345
|
+
valueHandler = simpleValueHandler;
|
346
|
+
}
|
347
|
+
|
348
|
+
if (!part) {
|
349
|
+
nums = UNBOUND;
|
350
|
+
}
|
351
|
+
|
352
|
+
return new VarSpec(name, valueHandler, nums);
|
353
|
+
};
|
354
|
+
|
355
|
+
|
356
|
+
VarSpec.prototype.addValues = function(context, encoder, adder) {
|
357
|
+
var val = context.get(this.name);
|
358
|
+
var valprops = valueProperties(val);
|
359
|
+
if (valprops.isUndef) { return; } // ignore empty values
|
360
|
+
this.valueHandler(this, val, valprops, encoder, adder);
|
361
|
+
};
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
//----------------------------------------------parsing logic
|
366
|
+
// How each varspec should look like
|
367
|
+
var VARSPEC_RE=/([^*:]*)((\*)|(:)([0-9]+))?/;
|
368
|
+
|
369
|
+
var match2varspec = function(m) {
|
370
|
+
var name = m[1];
|
371
|
+
var expl = m[3];
|
372
|
+
var part = m[4];
|
373
|
+
var nums = parseInt(m[5], 10);
|
374
|
+
|
375
|
+
return VarSpec.build(name, expl, part, nums);
|
376
|
+
};
|
377
|
+
|
378
|
+
|
379
|
+
// Splitting varspecs in list with:
|
380
|
+
var LISTSEP=",";
|
381
|
+
|
382
|
+
// How each template should look like
|
383
|
+
var TEMPL_RE=/(\{([+#.;?&\/])?(([^.*:,{}|@!=$()][^*:,{}$()]*)(\*|:([0-9]+))?(,([^.*:,{}][^*:,{}]*)(\*|:([0-9]+))?)*)\})/g;
|
384
|
+
// Note: reserved operators: |!@ are left out of the regexp in order to make those templates degrade into literals
|
385
|
+
// (as expected by the spec - see tests.html "reserved operators")
|
386
|
+
|
387
|
+
|
388
|
+
var match2expression = function(m) {
|
389
|
+
var expr = m[0];
|
390
|
+
var ops = m[2] || '';
|
391
|
+
var vars = m[3].split(LISTSEP);
|
392
|
+
var i = 0, len = vars.length;
|
393
|
+
for (i = 0; i<len; i++) {
|
394
|
+
var match;
|
395
|
+
if ( (match = vars[i].match(VARSPEC_RE)) === null) {
|
396
|
+
throw "unexpected parse error in varspec: " + vars[i];
|
397
|
+
}
|
398
|
+
vars[i] = match2varspec(match);
|
399
|
+
}
|
400
|
+
|
401
|
+
return Expression.build(ops, vars);
|
402
|
+
};
|
403
|
+
|
404
|
+
|
405
|
+
var pushLiteralSubstr = function(set, src, from, to) {
|
406
|
+
if (from < to) {
|
407
|
+
var literal = src.substr(from, to - from);
|
408
|
+
set.push(new Literal(literal));
|
409
|
+
}
|
410
|
+
};
|
411
|
+
|
412
|
+
var parse = function(str) {
|
413
|
+
var lastpos = 0;
|
414
|
+
var comp = [];
|
415
|
+
|
416
|
+
var match;
|
417
|
+
var pattern = TEMPL_RE;
|
418
|
+
pattern.lastIndex = 0; // just to be sure
|
419
|
+
while ((match = pattern.exec(str)) !== null) {
|
420
|
+
var newpos = match.index;
|
421
|
+
pushLiteralSubstr(comp, str, lastpos, newpos);
|
422
|
+
|
423
|
+
comp.push(match2expression(match));
|
424
|
+
lastpos = pattern.lastIndex;
|
425
|
+
}
|
426
|
+
pushLiteralSubstr(comp, str, lastpos, str.length);
|
427
|
+
|
428
|
+
return new UriTemplate(comp);
|
429
|
+
};
|
430
|
+
|
431
|
+
|
432
|
+
//-------------------------------------------comments and ideas
|
433
|
+
|
434
|
+
//TODO: consider building cache of previously parsed uris or even parsed expressions?
|
435
|
+
|
436
|
+
return parse;
|
437
|
+
|
438
|
+
}());
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0.alpha1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Bethany Skurrie
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-
|
14
|
+
date: 2014-05-09 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: httparty
|
@@ -126,62 +126,78 @@ dependencies:
|
|
126
126
|
- !ruby/object:Gem::Version
|
127
127
|
version: '0'
|
128
128
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
129
|
+
name: rack
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
type: :runtime
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: redcarpet
|
130
146
|
requirement: !ruby/object:Gem::Requirement
|
131
147
|
none: false
|
132
148
|
requirements:
|
133
149
|
- - ~>
|
134
150
|
- !ruby/object:Gem::Version
|
135
|
-
version:
|
136
|
-
type: :
|
151
|
+
version: 3.1.1
|
152
|
+
type: :runtime
|
137
153
|
prerelease: false
|
138
154
|
version_requirements: !ruby/object:Gem::Requirement
|
139
155
|
none: false
|
140
156
|
requirements:
|
141
157
|
- - ~>
|
142
158
|
- !ruby/object:Gem::Version
|
143
|
-
version:
|
159
|
+
version: 3.1.1
|
144
160
|
- !ruby/object:Gem::Dependency
|
145
|
-
name:
|
161
|
+
name: pact
|
146
162
|
requirement: !ruby/object:Gem::Requirement
|
147
163
|
none: false
|
148
164
|
requirements:
|
149
|
-
- -
|
165
|
+
- - ~>
|
150
166
|
- !ruby/object:Gem::Version
|
151
|
-
version:
|
152
|
-
type: :
|
167
|
+
version: 1.1.0
|
168
|
+
type: :runtime
|
153
169
|
prerelease: false
|
154
170
|
version_requirements: !ruby/object:Gem::Requirement
|
155
171
|
none: false
|
156
172
|
requirements:
|
157
|
-
- -
|
173
|
+
- - ~>
|
158
174
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
175
|
+
version: 1.1.0
|
160
176
|
- !ruby/object:Gem::Dependency
|
161
|
-
name:
|
177
|
+
name: padrino
|
162
178
|
requirement: !ruby/object:Gem::Requirement
|
163
179
|
none: false
|
164
180
|
requirements:
|
165
181
|
- - ~>
|
166
182
|
- !ruby/object:Gem::Version
|
167
|
-
version:
|
168
|
-
type: :
|
183
|
+
version: 0.9.29
|
184
|
+
type: :runtime
|
169
185
|
prerelease: false
|
170
186
|
version_requirements: !ruby/object:Gem::Requirement
|
171
187
|
none: false
|
172
188
|
requirements:
|
173
189
|
- - ~>
|
174
190
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
191
|
+
version: 0.9.29
|
176
192
|
- !ruby/object:Gem::Dependency
|
177
|
-
name:
|
193
|
+
name: haml
|
178
194
|
requirement: !ruby/object:Gem::Requirement
|
179
195
|
none: false
|
180
196
|
requirements:
|
181
197
|
- - ! '>='
|
182
198
|
- !ruby/object:Gem::Version
|
183
199
|
version: '0'
|
184
|
-
type: :
|
200
|
+
type: :runtime
|
185
201
|
prerelease: false
|
186
202
|
version_requirements: !ruby/object:Gem::Requirement
|
187
203
|
none: false
|
@@ -190,7 +206,7 @@ dependencies:
|
|
190
206
|
- !ruby/object:Gem::Version
|
191
207
|
version: '0'
|
192
208
|
- !ruby/object:Gem::Dependency
|
193
|
-
name:
|
209
|
+
name: pry
|
194
210
|
requirement: !ruby/object:Gem::Requirement
|
195
211
|
none: false
|
196
212
|
requirements:
|
@@ -206,69 +222,69 @@ dependencies:
|
|
206
222
|
- !ruby/object:Gem::Version
|
207
223
|
version: '0'
|
208
224
|
- !ruby/object:Gem::Dependency
|
209
|
-
name:
|
225
|
+
name: rake
|
210
226
|
requirement: !ruby/object:Gem::Requirement
|
211
227
|
none: false
|
212
228
|
requirements:
|
213
|
-
- -
|
229
|
+
- - ~>
|
214
230
|
- !ruby/object:Gem::Version
|
215
|
-
version: '0'
|
231
|
+
version: '10.0'
|
216
232
|
type: :development
|
217
233
|
prerelease: false
|
218
234
|
version_requirements: !ruby/object:Gem::Requirement
|
219
235
|
none: false
|
220
236
|
requirements:
|
221
|
-
- -
|
237
|
+
- - ~>
|
222
238
|
- !ruby/object:Gem::Version
|
223
|
-
version: '0'
|
239
|
+
version: '10.0'
|
224
240
|
- !ruby/object:Gem::Dependency
|
225
|
-
name:
|
241
|
+
name: fakefs
|
226
242
|
requirement: !ruby/object:Gem::Requirement
|
227
243
|
none: false
|
228
244
|
requirements:
|
229
|
-
- -
|
245
|
+
- - ~>
|
230
246
|
- !ruby/object:Gem::Version
|
231
|
-
version: '0'
|
247
|
+
version: '0.4'
|
232
248
|
type: :development
|
233
249
|
prerelease: false
|
234
250
|
version_requirements: !ruby/object:Gem::Requirement
|
235
251
|
none: false
|
236
252
|
requirements:
|
237
|
-
- -
|
253
|
+
- - ~>
|
238
254
|
- !ruby/object:Gem::Version
|
239
|
-
version: '0'
|
255
|
+
version: '0.4'
|
240
256
|
- !ruby/object:Gem::Dependency
|
241
|
-
name:
|
257
|
+
name: rspec-fire
|
242
258
|
requirement: !ruby/object:Gem::Requirement
|
243
259
|
none: false
|
244
260
|
requirements:
|
245
|
-
- -
|
261
|
+
- - ~>
|
246
262
|
- !ruby/object:Gem::Version
|
247
|
-
version:
|
263
|
+
version: 1.2.0
|
248
264
|
type: :development
|
249
265
|
prerelease: false
|
250
266
|
version_requirements: !ruby/object:Gem::Requirement
|
251
267
|
none: false
|
252
268
|
requirements:
|
253
|
-
- -
|
269
|
+
- - ~>
|
254
270
|
- !ruby/object:Gem::Version
|
255
|
-
version:
|
271
|
+
version: 1.2.0
|
256
272
|
- !ruby/object:Gem::Dependency
|
257
|
-
name:
|
273
|
+
name: mysql2
|
258
274
|
requirement: !ruby/object:Gem::Requirement
|
259
275
|
none: false
|
260
276
|
requirements:
|
261
|
-
- -
|
277
|
+
- - ~>
|
262
278
|
- !ruby/object:Gem::Version
|
263
|
-
version:
|
279
|
+
version: 0.3.15
|
264
280
|
type: :development
|
265
281
|
prerelease: false
|
266
282
|
version_requirements: !ruby/object:Gem::Requirement
|
267
283
|
none: false
|
268
284
|
requirements:
|
269
|
-
- -
|
285
|
+
- - ~>
|
270
286
|
- !ruby/object:Gem::Version
|
271
|
-
version:
|
287
|
+
version: 0.3.15
|
272
288
|
description: A server that stores and returns pact files generated by the pact gem.
|
273
289
|
It enables head/prod cross testing of the consumer and provider projects.
|
274
290
|
email:
|
@@ -283,9 +299,15 @@ files:
|
|
283
299
|
- .rspec
|
284
300
|
- CHANGELOG.md
|
285
301
|
- Gemfile
|
286
|
-
- Gemfile.lock
|
287
302
|
- README.md
|
288
303
|
- Rakefile
|
304
|
+
- assets/d3.v3.js
|
305
|
+
- assets/force.csv
|
306
|
+
- assets/index.html
|
307
|
+
- assets/index2.html
|
308
|
+
- assets/relationships
|
309
|
+
- assets/stylesheets/github.css
|
310
|
+
- bethtest.rb
|
289
311
|
- config.ru
|
290
312
|
- config/boot.rb
|
291
313
|
- config/database.yml
|
@@ -295,6 +317,9 @@ files:
|
|
295
317
|
- db/migrations/04_create_tags_table.rb
|
296
318
|
- db/migrations/05_add_order_column_to_version.rb
|
297
319
|
- db/pact_broker_database.sqlite3
|
320
|
+
- example/Gemfile
|
321
|
+
- example/config.ru
|
322
|
+
- lib/db.rb
|
298
323
|
- lib/pact_broker.rb
|
299
324
|
- lib/pact_broker/api.rb
|
300
325
|
- lib/pact_broker/api/decorators.rb
|
@@ -305,10 +330,12 @@ files:
|
|
305
330
|
- lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb
|
306
331
|
- lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb
|
307
332
|
- lib/pact_broker/api/decorators/pacticipant_decorator.rb
|
333
|
+
- lib/pact_broker/api/decorators/relationships_csv_decorator.rb
|
308
334
|
- lib/pact_broker/api/decorators/representable_pact.rb
|
309
335
|
- lib/pact_broker/api/decorators/tag_decorator.rb
|
310
336
|
- lib/pact_broker/api/decorators/version_decorator.rb
|
311
337
|
- lib/pact_broker/api/pact_broker_urls.rb
|
338
|
+
- lib/pact_broker/api/renderers/html_pact_renderer.rb
|
312
339
|
- lib/pact_broker/api/resources/base_resource.rb
|
313
340
|
- lib/pact_broker/api/resources/index.rb
|
314
341
|
- lib/pact_broker/api/resources/latest_pact.rb
|
@@ -316,15 +343,20 @@ files:
|
|
316
343
|
- lib/pact_broker/api/resources/pact.rb
|
317
344
|
- lib/pact_broker/api/resources/pacticipant.rb
|
318
345
|
- lib/pact_broker/api/resources/pacticipants.rb
|
346
|
+
- lib/pact_broker/api/resources/relationships.rb
|
319
347
|
- lib/pact_broker/api/resources/tag.rb
|
348
|
+
- lib/pact_broker/app.rb
|
349
|
+
- lib/pact_broker/configuration.rb
|
320
350
|
- lib/pact_broker/db.rb
|
321
351
|
- lib/pact_broker/logging.rb
|
322
352
|
- lib/pact_broker/models.rb
|
323
353
|
- lib/pact_broker/models/order_versions.rb
|
324
354
|
- lib/pact_broker/models/pact.rb
|
325
355
|
- lib/pact_broker/models/pacticipant.rb
|
356
|
+
- lib/pact_broker/models/relationship.rb
|
326
357
|
- lib/pact_broker/models/tag.rb
|
327
358
|
- lib/pact_broker/models/version.rb
|
359
|
+
- lib/pact_broker/project_root.rb
|
328
360
|
- lib/pact_broker/repositories.rb
|
329
361
|
- lib/pact_broker/repositories/pact_repository.rb
|
330
362
|
- lib/pact_broker/repositories/pacticipant_repository.rb
|
@@ -337,24 +369,100 @@ files:
|
|
337
369
|
- lib/pact_broker/services/version_service.rb
|
338
370
|
- lib/pact_broker/tasks.rb
|
339
371
|
- lib/pact_broker/tasks/migration_task.rb
|
372
|
+
- lib/pact_broker/ui/controllers/base_controller.rb
|
373
|
+
- lib/pact_broker/ui/controllers/clusters.rb
|
374
|
+
- lib/pact_broker/ui/controllers/relationships.rb
|
375
|
+
- lib/pact_broker/ui/view_models/clusters.rb
|
376
|
+
- lib/pact_broker/ui/view_models/relationship.rb
|
377
|
+
- lib/pact_broker/ui/view_models/relationships.rb
|
378
|
+
- lib/pact_broker/ui/views/clusters/show.haml
|
379
|
+
- lib/pact_broker/ui/views/layouts/main.haml
|
380
|
+
- lib/pact_broker/ui/views/relationships/show.haml
|
340
381
|
- lib/pact_broker/version.rb
|
382
|
+
- lib/rack/hal_browser.rb
|
383
|
+
- lib/rack/hal_browser/redirect.rb
|
341
384
|
- pact_broker.gemspec
|
342
385
|
- pact_broker_client-pact_broker.json
|
386
|
+
- public/bootstrap.zip
|
387
|
+
- public/config.json
|
388
|
+
- public/css/bootstrap-theme.css
|
389
|
+
- public/css/bootstrap-theme.min.css
|
390
|
+
- public/css/bootstrap.css
|
391
|
+
- public/css/bootstrap.min.css
|
392
|
+
- public/fonts/glyphicons-halflings-regular.eot
|
393
|
+
- public/fonts/glyphicons-halflings-regular.svg
|
394
|
+
- public/fonts/glyphicons-halflings-regular.ttf
|
395
|
+
- public/fonts/glyphicons-halflings-regular.woff
|
396
|
+
- public/javascripts/jquery-2.1.1.min.js
|
397
|
+
- public/javascripts/jquery.tablesorter.js
|
398
|
+
- public/javascripts/jquery.tablesorter.min.js
|
399
|
+
- public/js/bootstrap.js
|
400
|
+
- public/js/bootstrap.min.js
|
401
|
+
- public/stylesheets/github.css
|
402
|
+
- public/stylesheets/relationships.css
|
403
|
+
- script/update-hal-browser
|
404
|
+
- spec/fixtures/renderer_pact.json
|
343
405
|
- spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
|
406
|
+
- spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb
|
344
407
|
- spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
|
408
|
+
- spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb
|
409
|
+
- spec/lib/pact_broker/api/resources/latest_pact_spec.rb
|
345
410
|
- spec/lib/pact_broker/api/resources/tag_spec.rb
|
411
|
+
- spec/lib/pact_broker/configuration_spec.rb
|
346
412
|
- spec/lib/pact_broker/models/order_versions_spec.rb
|
347
413
|
- spec/lib/pact_broker/repositories/pact_repository_spec.rb
|
348
414
|
- spec/lib/pact_broker/repositories/tag_repository_spec.rb
|
349
415
|
- spec/lib/pact_broker/repositories/version_repository_spec.rb
|
416
|
+
- spec/lib/pact_broker/services/pacticipant_service_spec.rb
|
350
417
|
- spec/lib/pact_broker/services/tag_service_spec.rb
|
418
|
+
- spec/lib/pact_broker/ui/controllers/clusters_spec.rb
|
419
|
+
- spec/lib/pact_broker/ui/controllers/relationships_spec.rb
|
420
|
+
- spec/lib/pact_broker/ui/view_models/relationship_spec.rb
|
421
|
+
- spec/lib/rack/hal_browser/redirect_spec.rb
|
351
422
|
- spec/service_consumers/pact_helper.rb
|
352
423
|
- spec/service_consumers/provider_states_for_pact_broker_client.rb
|
353
424
|
- spec/spec_helper.rb
|
354
425
|
- spec/support/provider_state_builder.rb
|
426
|
+
- tasks/database.rb
|
355
427
|
- tasks/db.rake
|
356
428
|
- tasks/pact.rake
|
357
429
|
- tasks/rspec.rake
|
430
|
+
- vendor/hal-browser/.gitignore
|
431
|
+
- vendor/hal-browser/MIT-LICENSE.txt
|
432
|
+
- vendor/hal-browser/README.md
|
433
|
+
- vendor/hal-browser/browser.html
|
434
|
+
- vendor/hal-browser/js/hal.js
|
435
|
+
- vendor/hal-browser/js/hal/browser.js
|
436
|
+
- vendor/hal-browser/js/hal/http/client.js
|
437
|
+
- vendor/hal-browser/js/hal/resource.js
|
438
|
+
- vendor/hal-browser/js/hal/views/browser.js
|
439
|
+
- vendor/hal-browser/js/hal/views/documentation.js
|
440
|
+
- vendor/hal-browser/js/hal/views/embedded_resource.js
|
441
|
+
- vendor/hal-browser/js/hal/views/embedded_resources.js
|
442
|
+
- vendor/hal-browser/js/hal/views/explorer.js
|
443
|
+
- vendor/hal-browser/js/hal/views/inspector.js
|
444
|
+
- vendor/hal-browser/js/hal/views/links.js
|
445
|
+
- vendor/hal-browser/js/hal/views/location_bar.js
|
446
|
+
- vendor/hal-browser/js/hal/views/navigation.js
|
447
|
+
- vendor/hal-browser/js/hal/views/non_safe_request_dialog.js
|
448
|
+
- vendor/hal-browser/js/hal/views/properties.js
|
449
|
+
- vendor/hal-browser/js/hal/views/query_uri_dialog.js
|
450
|
+
- vendor/hal-browser/js/hal/views/request_headers.js
|
451
|
+
- vendor/hal-browser/js/hal/views/resource.js
|
452
|
+
- vendor/hal-browser/js/hal/views/response.js
|
453
|
+
- vendor/hal-browser/js/hal/views/response_body.js
|
454
|
+
- vendor/hal-browser/js/hal/views/response_headers.js
|
455
|
+
- vendor/hal-browser/styles.css
|
456
|
+
- vendor/hal-browser/vendor/css/bootstrap-responsive.css
|
457
|
+
- vendor/hal-browser/vendor/css/bootstrap.css
|
458
|
+
- vendor/hal-browser/vendor/img/ajax-loader.gif
|
459
|
+
- vendor/hal-browser/vendor/img/glyphicons-halflings-white.png
|
460
|
+
- vendor/hal-browser/vendor/img/glyphicons-halflings.png
|
461
|
+
- vendor/hal-browser/vendor/js/backbone.js
|
462
|
+
- vendor/hal-browser/vendor/js/bootstrap.js
|
463
|
+
- vendor/hal-browser/vendor/js/jquery-1.9.1.js
|
464
|
+
- vendor/hal-browser/vendor/js/underscore.js
|
465
|
+
- vendor/hal-browser/vendor/js/uritemplates.js
|
358
466
|
homepage: https://github.com/DiUS/pact_broker
|
359
467
|
licenses:
|
360
468
|
- MIT
|
@@ -370,16 +478,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
370
478
|
version: '0'
|
371
479
|
segments:
|
372
480
|
- 0
|
373
|
-
hash: -
|
481
|
+
hash: -3233276074341714439
|
374
482
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
375
483
|
none: false
|
376
484
|
requirements:
|
377
|
-
- - ! '
|
485
|
+
- - ! '>'
|
378
486
|
- !ruby/object:Gem::Version
|
379
|
-
version:
|
380
|
-
segments:
|
381
|
-
- 0
|
382
|
-
hash: -449205238157124147
|
487
|
+
version: 1.3.1
|
383
488
|
requirements: []
|
384
489
|
rubyforge_project:
|
385
490
|
rubygems_version: 1.8.23
|
@@ -387,14 +492,24 @@ signing_key:
|
|
387
492
|
specification_version: 3
|
388
493
|
summary: See description
|
389
494
|
test_files:
|
495
|
+
- spec/fixtures/renderer_pact.json
|
390
496
|
- spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
|
497
|
+
- spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb
|
391
498
|
- spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
|
499
|
+
- spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb
|
500
|
+
- spec/lib/pact_broker/api/resources/latest_pact_spec.rb
|
392
501
|
- spec/lib/pact_broker/api/resources/tag_spec.rb
|
502
|
+
- spec/lib/pact_broker/configuration_spec.rb
|
393
503
|
- spec/lib/pact_broker/models/order_versions_spec.rb
|
394
504
|
- spec/lib/pact_broker/repositories/pact_repository_spec.rb
|
395
505
|
- spec/lib/pact_broker/repositories/tag_repository_spec.rb
|
396
506
|
- spec/lib/pact_broker/repositories/version_repository_spec.rb
|
507
|
+
- spec/lib/pact_broker/services/pacticipant_service_spec.rb
|
397
508
|
- spec/lib/pact_broker/services/tag_service_spec.rb
|
509
|
+
- spec/lib/pact_broker/ui/controllers/clusters_spec.rb
|
510
|
+
- spec/lib/pact_broker/ui/controllers/relationships_spec.rb
|
511
|
+
- spec/lib/pact_broker/ui/view_models/relationship_spec.rb
|
512
|
+
- spec/lib/rack/hal_browser/redirect_spec.rb
|
398
513
|
- spec/service_consumers/pact_helper.rb
|
399
514
|
- spec/service_consumers/provider_states_for_pact_broker_client.rb
|
400
515
|
- spec/spec_helper.rb
|