set_builder 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +35 -0
  6. data/Rakefile +14 -0
  7. data/assets/javascripts/array.js +100 -0
  8. data/assets/javascripts/set_builder.js +415 -0
  9. data/init.rb +1 -0
  10. data/install.rb +1 -0
  11. data/lib/set_builder.rb +58 -0
  12. data/lib/set_builder/constraint.rb +67 -0
  13. data/lib/set_builder/modifier.rb +134 -0
  14. data/lib/set_builder/modifier/adverb.rb +11 -0
  15. data/lib/set_builder/modifier/base.rb +105 -0
  16. data/lib/set_builder/modifier/verb.rb +24 -0
  17. data/lib/set_builder/modifier_collection.rb +41 -0
  18. data/lib/set_builder/modifiers.rb +3 -0
  19. data/lib/set_builder/modifiers/date_modifier.rb +83 -0
  20. data/lib/set_builder/modifiers/number_modifier.rb +48 -0
  21. data/lib/set_builder/modifiers/string_modifier.rb +81 -0
  22. data/lib/set_builder/query_builders/string.rb +0 -0
  23. data/lib/set_builder/set.rb +81 -0
  24. data/lib/set_builder/trait.rb +74 -0
  25. data/lib/set_builder/traits.rb +42 -0
  26. data/lib/set_builder/value_map.rb +62 -0
  27. data/lib/set_builder/version.rb +3 -0
  28. data/set_builder.gemspec +25 -0
  29. data/spec/commands/example_command.rb +19 -0
  30. data/spec/dom.html +24 -0
  31. data/spec/lib/images/bg.png +0 -0
  32. data/spec/lib/images/hr.png +0 -0
  33. data/spec/lib/images/loading.gif +0 -0
  34. data/spec/lib/images/sprites.bg.png +0 -0
  35. data/spec/lib/images/sprites.png +0 -0
  36. data/spec/lib/images/vr.png +0 -0
  37. data/spec/lib/jspec.css +149 -0
  38. data/spec/lib/jspec.growl.js +115 -0
  39. data/spec/lib/jspec.jquery.js +88 -0
  40. data/spec/lib/jspec.js +1908 -0
  41. data/spec/lib/jspec.nodejs.js +18 -0
  42. data/spec/lib/jspec.shell.js +39 -0
  43. data/spec/lib/jspec.timers.js +154 -0
  44. data/spec/lib/jspec.xhr.js +210 -0
  45. data/spec/node.js +10 -0
  46. data/spec/rhino.js +10 -0
  47. data/spec/server.html +18 -0
  48. data/spec/server.rb +4 -0
  49. data/spec/unit/array.spec.js +82 -0
  50. data/spec/unit/set_builder.spec.js +166 -0
  51. data/spec/unit/spec.helper.js +0 -0
  52. data/test/date_modifier_test.rb +13 -0
  53. data/test/inflector_test.rb +27 -0
  54. data/test/modifier_test.rb +90 -0
  55. data/test/set_test.rb +96 -0
  56. data/test/test_helper.rb +79 -0
  57. data/test/trait_test.rb +49 -0
  58. data/test/traits_test.rb +41 -0
  59. data/test/value_map_test.rb +30 -0
  60. data/uninstall.rb +1 -0
  61. metadata +191 -0
@@ -0,0 +1,18 @@
1
+
2
+ // JSpec - node - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
3
+
4
+ JSpec
5
+ .include({
6
+ name: 'node',
7
+
8
+ // --- Matchers
9
+
10
+ matchers : {
11
+ have_enumerable_property: 'actual.propertyIsEnumerable(expected)',
12
+ have_writable_property: 'Object.getOwnPropertyDescriptor(actual, expected).writable === true',
13
+ have_configurable_property: 'Object.getOwnPropertyDescriptor(actual, expected).configurable === true',
14
+ have_keys: 'does(Object.keys(actual), "eql", expected)',
15
+ have_prototype: 'Object.getPrototypeOf(actual) === expected'
16
+ }
17
+ })
18
+
@@ -0,0 +1,39 @@
1
+
2
+ // JSpec - Shell - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
3
+
4
+ ;(function(){
5
+
6
+ var _quit = quit
7
+
8
+ Shell = {
9
+
10
+ // --- Global
11
+
12
+ main: this,
13
+
14
+ // --- Commands
15
+
16
+ commands: {
17
+ quit: ['Terminate the shell', function(){ _quit() }],
18
+ exit: ['Terminate the shell', function(){ _quit() }],
19
+ p: ['Inspect an object', function(o){ return o.toSource() }]
20
+ },
21
+
22
+ /**
23
+ * Start the interactive shell.
24
+ *
25
+ * @api public
26
+ */
27
+
28
+ start : function() {
29
+ for (var name in this.commands)
30
+ if (this.commands.hasOwnProperty(name))
31
+ this.commands[name][1].length ?
32
+ this.main[name] = this.commands[name][1] :
33
+ this.main.__defineGetter__(name, this.commands[name][1])
34
+ }
35
+ }
36
+
37
+ Shell.start()
38
+
39
+ })()
@@ -0,0 +1,154 @@
1
+
2
+ // Mock Timers - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
3
+
4
+ ;(function(){
5
+
6
+ /**
7
+ * Localized timer stack.
8
+ */
9
+ var timers = [];
10
+
11
+ // nodejs, rhino don't have a window object
12
+ var global = this;
13
+
14
+ // if they where mocked before this library is loaded - bad luck
15
+ var savedGlobals = {
16
+ setTimeout: global.setTimeout,
17
+ setInterval: global.setInterval,
18
+ clearInterval: global.clearInterval,
19
+ clearTimeout: global.clearTimeout,
20
+
21
+ // those should not be globals, but are mocked none the less, so we save them
22
+ resetTimers: global.resetTimers,
23
+ tick: global.tick
24
+ };
25
+ var hadResetTimers = 'resetTimers' in global;
26
+ var hadTick = 'tick' in global;
27
+
28
+ function forEachProperty(anObject, aClosure) {
29
+ for (var key in anObject) {
30
+ if ( ! anObject.hasOwnProperty(key))
31
+ continue;
32
+
33
+ aClosure(key, anObject[key]);
34
+ }
35
+ }
36
+
37
+ global.MockTimers = {
38
+
39
+ mockTimersVersion: '2.0.0',
40
+
41
+ mockGlobalTimerFunctions: function() {
42
+ forEachProperty(this.mocks, function(aName, aFunction) {
43
+ global[aName] = aFunction;
44
+ });
45
+ },
46
+
47
+ unmockGlobalTimerFunctions: function() {
48
+ forEachProperty(this.savedGlobals, function(aName, aFunction) {
49
+ global[aName] = aFunction;
50
+ });
51
+
52
+ if ( ! hadResetTimers)
53
+ delete global['resetTimers'];
54
+ if ( ! hadTick)
55
+ delete global['tick'];
56
+
57
+ }
58
+ };
59
+
60
+ function clearTimer(id) {
61
+ return delete timers[--id];
62
+ }
63
+
64
+ var mocks = {
65
+
66
+ /**
67
+ * Set mock timeout with _callback_ and timeout of _ms_.
68
+ *
69
+ * @param {function} callback
70
+ * @param {int} ms
71
+ * @return {int}
72
+ * @api public
73
+ */
74
+ setTimeout: function(callback, ms) {
75
+ var id;
76
+ return id = setInterval(function(){
77
+ callback();
78
+ clearInterval(id);
79
+ }, ms);
80
+ },
81
+
82
+
83
+ /**
84
+ * Set mock interval with _callback_ and interval of _ms_.
85
+ *
86
+ * @param {function} callback
87
+ * @param {int} ms
88
+ * @return {int}
89
+ * @api public
90
+ */
91
+ setInterval: function(callback, ms) {
92
+ // REFACT: use wrapper object so callback is not changed -> state leak
93
+ callback.step = ms;
94
+ callback.current = callback.last = 0;
95
+ timers[timers.length] = callback;
96
+ return timers.length;
97
+ },
98
+
99
+ /**
100
+ * Destroy timer with _id_.
101
+ *
102
+ * @param {int} id
103
+ * @return {bool}
104
+ * @api public
105
+ */
106
+ clearInterval: clearTimer,
107
+ clearTimeout: clearTimer
108
+ };
109
+
110
+ // additional functions that are not originally in the global namespace
111
+ /**
112
+ * Reset timers.
113
+ *
114
+ * @return {array}
115
+ * @api public
116
+ */
117
+ mocks.resetTimers = function() {
118
+ return timers = [];
119
+ };
120
+
121
+ /**
122
+ * Increment each timers internal clock by _ms_.
123
+ *
124
+ * @param {int} ms
125
+ * @api public
126
+ */
127
+ mocks.tick = function(ms) {
128
+ for (var i = 0, len = timers.length; i < len; ++i) {
129
+ if ( ! timers[i] || ! (timers[i].current += ms))
130
+ continue;
131
+
132
+ if (timers[i].current - timers[i].last < timers[i].step)
133
+ continue;
134
+
135
+ var times = Math.floor((timers[i].current - timers[i].last) / timers[i].step);
136
+ var remainder = (timers[i].current - timers[i].last) % timers[i].step;
137
+ timers[i].last = timers[i].current - remainder;
138
+ while (times-- && timers[i])
139
+ timers[i]();
140
+ }
141
+ };
142
+
143
+ // make them available publicly
144
+ MockTimers.mocks = mocks;
145
+
146
+ JSpec.include({
147
+ beforeSpec: function(){
148
+ MockTimers.mockGlobalTimerFunctions();
149
+ },
150
+ afterSpec : function() {
151
+ MockTimers.unmockGlobalTimerFunctions();
152
+ }
153
+ });
154
+ })();
@@ -0,0 +1,210 @@
1
+
2
+ // JSpec - XHR - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
3
+
4
+ (function(){
5
+
6
+ var lastRequest
7
+
8
+ // --- Original XMLHttpRequest
9
+
10
+ var OriginalXMLHttpRequest = 'XMLHttpRequest' in this ?
11
+ XMLHttpRequest :
12
+ function(){}
13
+ var OriginalActiveXObject = 'ActiveXObject' in this ?
14
+ ActiveXObject :
15
+ undefined
16
+
17
+ // --- MockXMLHttpRequest
18
+
19
+ var MockXMLHttpRequest = function() {
20
+ this.requestHeaders = {}
21
+ }
22
+
23
+ MockXMLHttpRequest.prototype = {
24
+ status: 0,
25
+ async: true,
26
+ readyState: 0,
27
+ responseXML: null,
28
+ responseText: '',
29
+ abort: function(){},
30
+ onreadystatechange: function(){},
31
+
32
+ /**
33
+ * Return response headers hash.
34
+ */
35
+
36
+ getAllResponseHeaders : function(){
37
+ return JSpec.inject(this.responseHeaders, '', function(buf, key, val){
38
+ return buf + key + ': ' + val + '\r\n'
39
+ })
40
+ },
41
+
42
+ /**
43
+ * Return case-insensitive value for header _name_.
44
+ */
45
+
46
+ getResponseHeader : function(name) {
47
+ return this.responseHeaders[name.toLowerCase()]
48
+ },
49
+
50
+ /**
51
+ * Set case-insensitive _value_ for header _name_.
52
+ */
53
+
54
+ setRequestHeader : function(name, value) {
55
+ this.requestHeaders[name.toLowerCase()] = value
56
+ },
57
+
58
+ /**
59
+ * Open mock request.
60
+ */
61
+
62
+ open : function(method, url, async, user, password) {
63
+ this.user = user
64
+ this.password = password
65
+ this.url = url
66
+ this.readyState = 1
67
+ this.method = method.toUpperCase()
68
+ if (async != undefined) this.async = async
69
+ if (this.async) this.onreadystatechange()
70
+ },
71
+
72
+ /**
73
+ * Send request _data_.
74
+ */
75
+
76
+ send : function(data) {
77
+ var self = this
78
+ this.data = data
79
+ this.readyState = 4
80
+ if (this.method == 'HEAD') this.responseText = null
81
+ this.responseHeaders['content-length'] = (this.responseText || '').length
82
+ if(this.async) this.onreadystatechange()
83
+ this.populateResponseXML()
84
+ lastRequest = function(){
85
+ return self
86
+ }
87
+ },
88
+
89
+ /**
90
+ * Parse request body and populate responseXML if response-type is xml
91
+ * Based on the standard specification : http://www.w3.org/TR/XMLHttpRequest/
92
+ */
93
+ populateResponseXML: function() {
94
+ var type = this.getResponseHeader("content-type")
95
+ if (!type || !this.responseText || !type.match(/(text\/xml|application\/xml|\+xml$)/g))
96
+ return
97
+ this.responseXML = JSpec.parseXML(this.responseText)
98
+ }
99
+ }
100
+
101
+ // --- Response status codes
102
+
103
+ JSpec.statusCodes = {
104
+ 100: 'Continue',
105
+ 101: 'Switching Protocols',
106
+ 200: 'OK',
107
+ 201: 'Created',
108
+ 202: 'Accepted',
109
+ 203: 'Non-Authoritative Information',
110
+ 204: 'No Content',
111
+ 205: 'Reset Content',
112
+ 206: 'Partial Content',
113
+ 300: 'Multiple Choice',
114
+ 301: 'Moved Permanently',
115
+ 302: 'Found',
116
+ 303: 'See Other',
117
+ 304: 'Not Modified',
118
+ 305: 'Use Proxy',
119
+ 307: 'Temporary Redirect',
120
+ 400: 'Bad Request',
121
+ 401: 'Unauthorized',
122
+ 402: 'Payment Required',
123
+ 403: 'Forbidden',
124
+ 404: 'Not Found',
125
+ 405: 'Method Not Allowed',
126
+ 406: 'Not Acceptable',
127
+ 407: 'Proxy Authentication Required',
128
+ 408: 'Request Timeout',
129
+ 409: 'Conflict',
130
+ 410: 'Gone',
131
+ 411: 'Length Required',
132
+ 412: 'Precondition Failed',
133
+ 413: 'Request Entity Too Large',
134
+ 414: 'Request-URI Too Long',
135
+ 415: 'Unsupported Media Type',
136
+ 416: 'Requested Range Not Satisfiable',
137
+ 417: 'Expectation Failed',
138
+ 422: 'Unprocessable Entity',
139
+ 500: 'Internal Server Error',
140
+ 501: 'Not Implemented',
141
+ 502: 'Bad Gateway',
142
+ 503: 'Service Unavailable',
143
+ 504: 'Gateway Timeout',
144
+ 505: 'HTTP Version Not Supported'
145
+ }
146
+
147
+ /**
148
+ * Mock XMLHttpRequest requests.
149
+ *
150
+ * mockRequest().and_return('some data', 'text/plain', 200, { 'X-SomeHeader' : 'somevalue' })
151
+ *
152
+ * @return {hash}
153
+ * @api public
154
+ */
155
+
156
+ function mockRequest() {
157
+ return { and_return : function(body, type, status, headers) {
158
+ XMLHttpRequest = MockXMLHttpRequest
159
+ ActiveXObject = false
160
+ status = status || 200
161
+ headers = headers || {}
162
+ headers['content-type'] = type
163
+ JSpec.extend(XMLHttpRequest.prototype, {
164
+ responseText: body,
165
+ responseHeaders: headers,
166
+ status: status,
167
+ statusText: JSpec.statusCodes[status]
168
+ })
169
+ }}
170
+ }
171
+
172
+ /**
173
+ * Unmock XMLHttpRequest requests.
174
+ *
175
+ * @api public
176
+ */
177
+
178
+ function unmockRequest() {
179
+ XMLHttpRequest = OriginalXMLHttpRequest
180
+ ActiveXObject = OriginalActiveXObject
181
+ }
182
+
183
+ JSpec.include({
184
+ name: 'Mock XHR',
185
+
186
+ // --- Utilities
187
+
188
+ utilities : {
189
+ mockRequest: mockRequest,
190
+ unmockRequest: unmockRequest
191
+ },
192
+
193
+ // --- Hooks
194
+
195
+ afterSpec : function() {
196
+ unmockRequest()
197
+ },
198
+
199
+ // --- DSLs
200
+
201
+ DSLs : {
202
+ snake : {
203
+ mock_request: mockRequest,
204
+ unmock_request: unmockRequest,
205
+ last_request: function(){ return lastRequest() }
206
+ }
207
+ }
208
+
209
+ })
210
+ })()
data/spec/node.js ADDED
@@ -0,0 +1,10 @@
1
+
2
+ require.paths.unshift('spec', './spec/lib', 'lib')
3
+ require('jspec')
4
+ require('unit/spec.helper')
5
+ require('yourlib')
6
+
7
+ JSpec
8
+ .exec('spec/unit/spec.js')
9
+ .run({ reporter: JSpec.reporters.Terminal, fixturePath: 'spec/fixtures', failuresOnly: true })
10
+ .report()
data/spec/rhino.js ADDED
@@ -0,0 +1,10 @@
1
+
2
+ load('./spec/lib/jspec.js')
3
+ load('./spec/lib/jspec.xhr.js')
4
+ load('lib/yourlib.js')
5
+ load('spec/unit/spec.helper.js')
6
+
7
+ JSpec
8
+ .exec('spec/unit/spec.js')
9
+ .run({ reporter: JSpec.reporters.Terminal, fixturePath: 'spec/fixtures' })
10
+ .report()