judge 1.5.0 → 2.0.0

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 (52) hide show
  1. data/README.md +273 -14
  2. data/app/assets/javascripts/judge.js +391 -0
  3. data/app/controllers/judge/validations_controller.rb +9 -0
  4. data/app/models/judge/validation.rb +53 -0
  5. data/config/routes.rb +3 -0
  6. data/lib/generators/judge/install/install_generator.rb +42 -0
  7. data/lib/judge.rb +13 -8
  8. data/lib/judge/config.rb +39 -0
  9. data/lib/judge/controller.rb +35 -0
  10. data/lib/judge/each_validator.rb +5 -4
  11. data/lib/judge/engine.rb +5 -0
  12. data/lib/judge/form_builder.rb +19 -24
  13. data/lib/judge/html.rb +5 -7
  14. data/lib/judge/message_collection.rb +2 -1
  15. data/lib/judge/message_config.rb +2 -1
  16. data/lib/judge/validator.rb +3 -1
  17. data/lib/judge/validator_collection.rb +1 -1
  18. data/lib/judge/version.rb +2 -2
  19. data/lib/tasks/judge_tasks.rake +4 -0
  20. data/{lib/generators/judge/templates → vendor/assets/javascripts}/json2.js +4 -5
  21. data/{lib/generators/judge/templates → vendor/assets/javascripts}/underscore.js +451 -285
  22. metadata +94 -87
  23. data/.gitignore +0 -9
  24. data/.travis.yml +0 -21
  25. data/Gemfile +0 -3
  26. data/Rakefile +0 -11
  27. data/judge.gemspec +0 -23
  28. data/lib/generators/judge/judge_generator.rb +0 -21
  29. data/lib/generators/judge/templates/judge.js +0 -330
  30. data/spec/each_validator_spec.rb +0 -17
  31. data/spec/form_builder_spec.rb +0 -68
  32. data/spec/html_spec.rb +0 -14
  33. data/spec/javascripts/JudgeSpec.js +0 -509
  34. data/spec/javascripts/fixtures/form.html +0 -538
  35. data/spec/javascripts/helpers/customMatchers.js +0 -20
  36. data/spec/javascripts/helpers/jasmine-jquery.js +0 -204
  37. data/spec/javascripts/helpers/jquery-1.5.1.min.js +0 -18
  38. data/spec/javascripts/helpers/json2.js +0 -487
  39. data/spec/javascripts/helpers/underscore.js +0 -1060
  40. data/spec/javascripts/support/jasmine.yml +0 -79
  41. data/spec/javascripts/support/jasmine_config.rb +0 -6
  42. data/spec/javascripts/support/jasmine_runner.rb +0 -21
  43. data/spec/javascripts/support/runner.js +0 -51
  44. data/spec/message_collection_spec.rb +0 -73
  45. data/spec/setup.rb +0 -75
  46. data/spec/support/factories.rb +0 -23
  47. data/spec/support/locale/en.yml +0 -18
  48. data/spec/support/setup.rb +0 -72
  49. data/spec/support/spec_helper.rb +0 -13
  50. data/spec/support/validators/city_validator.rb +0 -9
  51. data/spec/validator_collection_spec.rb +0 -21
  52. data/spec/validator_spec.rb +0 -33
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-12 00:00:00.000000000 Z
12
+ date: 2013-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: jasmine
16
- requirement: &2168506340 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
17
33
  none: false
18
34
  requirements:
19
35
  - - ~>
@@ -21,70 +37,107 @@ dependencies:
21
37
  version: 1.1.2
22
38
  type: :development
23
39
  prerelease: false
24
- version_requirements: *2168506340
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.2
25
46
  - !ruby/object:Gem::Dependency
26
- name: rails
27
- requirement: &2168505620 !ruby/object:Gem::Requirement
47
+ name: rspec-rails
48
+ requirement: !ruby/object:Gem::Requirement
28
49
  none: false
29
50
  requirements:
30
51
  - - ~>
31
52
  - !ruby/object:Gem::Version
32
- version: '3.2'
53
+ version: 2.13.0
33
54
  type: :development
34
55
  prerelease: false
35
- version_requirements: *2168505620
36
- - !ruby/object:Gem::Dependency
37
- name: rspec
38
- requirement: &2168504460 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
39
57
  none: false
40
58
  requirements:
41
59
  - - ~>
42
60
  - !ruby/object:Gem::Version
43
- version: '2.8'
61
+ version: 2.13.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: jquery-rails
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
44
70
  type: :development
45
71
  prerelease: false
46
- version_requirements: *2168504460
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
47
78
  - !ruby/object:Gem::Dependency
48
79
  name: sqlite3
49
- requirement: &2168503260 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
50
81
  none: false
51
82
  requirements:
52
83
  - - ~>
53
84
  - !ruby/object:Gem::Version
54
- version: 1.3.5
85
+ version: 1.3.7
55
86
  type: :development
56
87
  prerelease: false
57
- version_requirements: *2168503260
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.3.7
58
94
  - !ruby/object:Gem::Dependency
59
95
  name: factory_girl
60
- requirement: &2168501980 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '2.6'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
61
105
  none: false
62
106
  requirements:
63
107
  - - ~>
64
108
  - !ruby/object:Gem::Version
65
109
  version: '2.6'
110
+ - !ruby/object:Gem::Dependency
111
+ name: appraisal
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.5.1
66
118
  type: :development
67
119
  prerelease: false
68
- version_requirements: *2168501980
69
- description: Validate Rails 3 forms on the client side, cleanly
70
- email: joe@tribesports.com
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.5.1
126
+ description: Validate Rails 3 forms on the client side, simply
127
+ email: joecorcoran@gmail.com
71
128
  executables: []
72
129
  extensions: []
73
130
  extra_rdoc_files: []
74
131
  files:
75
- - .gitignore
76
- - .travis.yml
77
- - Gemfile
78
- - LICENSE.txt
79
- - README.md
80
- - Rakefile
81
- - judge.gemspec
82
- - lib/generators/judge/judge_generator.rb
83
- - lib/generators/judge/templates/json2.js
84
- - lib/generators/judge/templates/judge.js
85
- - lib/generators/judge/templates/underscore.js
86
- - lib/judge.rb
132
+ - app/assets/javascripts/judge.js
133
+ - app/controllers/judge/validations_controller.rb
134
+ - app/models/judge/validation.rb
135
+ - config/routes.rb
136
+ - lib/generators/judge/install/install_generator.rb
137
+ - lib/judge/config.rb
138
+ - lib/judge/controller.rb
87
139
  - lib/judge/each_validator.rb
140
+ - lib/judge/engine.rb
88
141
  - lib/judge/form_builder.rb
89
142
  - lib/judge/html.rb
90
143
  - lib/judge/message_collection.rb
@@ -92,30 +145,13 @@ files:
92
145
  - lib/judge/validator.rb
93
146
  - lib/judge/validator_collection.rb
94
147
  - lib/judge/version.rb
148
+ - lib/judge.rb
95
149
  - lib/tasks/js.rake
96
- - spec/each_validator_spec.rb
97
- - spec/form_builder_spec.rb
98
- - spec/html_spec.rb
99
- - spec/javascripts/JudgeSpec.js
100
- - spec/javascripts/fixtures/form.html
101
- - spec/javascripts/helpers/customMatchers.js
102
- - spec/javascripts/helpers/jasmine-jquery.js
103
- - spec/javascripts/helpers/jquery-1.5.1.min.js
104
- - spec/javascripts/helpers/json2.js
105
- - spec/javascripts/helpers/underscore.js
106
- - spec/javascripts/support/jasmine.yml
107
- - spec/javascripts/support/jasmine_config.rb
108
- - spec/javascripts/support/jasmine_runner.rb
109
- - spec/javascripts/support/runner.js
110
- - spec/message_collection_spec.rb
111
- - spec/setup.rb
112
- - spec/support/factories.rb
113
- - spec/support/locale/en.yml
114
- - spec/support/setup.rb
115
- - spec/support/spec_helper.rb
116
- - spec/support/validators/city_validator.rb
117
- - spec/validator_collection_spec.rb
118
- - spec/validator_spec.rb
150
+ - lib/tasks/judge_tasks.rake
151
+ - vendor/assets/javascripts/json2.js
152
+ - vendor/assets/javascripts/underscore.js
153
+ - LICENSE.txt
154
+ - README.md
119
155
  homepage: http://github.com/joecorcoran/judge
120
156
  licenses: []
121
157
  post_install_message:
@@ -128,45 +164,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
164
  - - ! '>='
129
165
  - !ruby/object:Gem::Version
130
166
  version: '0'
131
- segments:
132
- - 0
133
- hash: -172077303514846172
134
167
  required_rubygems_version: !ruby/object:Gem::Requirement
135
168
  none: false
136
169
  requirements:
137
170
  - - ! '>='
138
171
  - !ruby/object:Gem::Version
139
172
  version: '0'
140
- segments:
141
- - 0
142
- hash: -172077303514846172
143
173
  requirements: []
144
174
  rubyforge_project:
145
- rubygems_version: 1.8.15
175
+ rubygems_version: 1.8.24
146
176
  signing_key:
147
177
  specification_version: 3
148
- summary: Simple client side ActiveModel::Validators
149
- test_files:
150
- - spec/each_validator_spec.rb
151
- - spec/form_builder_spec.rb
152
- - spec/html_spec.rb
153
- - spec/javascripts/JudgeSpec.js
154
- - spec/javascripts/fixtures/form.html
155
- - spec/javascripts/helpers/customMatchers.js
156
- - spec/javascripts/helpers/jasmine-jquery.js
157
- - spec/javascripts/helpers/jquery-1.5.1.min.js
158
- - spec/javascripts/helpers/json2.js
159
- - spec/javascripts/helpers/underscore.js
160
- - spec/javascripts/support/jasmine.yml
161
- - spec/javascripts/support/jasmine_config.rb
162
- - spec/javascripts/support/jasmine_runner.rb
163
- - spec/javascripts/support/runner.js
164
- - spec/message_collection_spec.rb
165
- - spec/setup.rb
166
- - spec/support/factories.rb
167
- - spec/support/locale/en.yml
168
- - spec/support/setup.rb
169
- - spec/support/spec_helper.rb
170
- - spec/support/validators/city_validator.rb
171
- - spec/validator_collection_spec.rb
172
- - spec/validator_spec.rb
178
+ summary: Client side validation for Rails
179
+ test_files: []
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- *.gem
2
- .bundle
3
- Gemfile.lock
4
- pkg/*
5
- docs
6
- doc
7
- rdoc
8
- gem_graph.png
9
- .rvmrc
@@ -1,21 +0,0 @@
1
- rvm:
2
- - 1.9.2
3
- - 1.9.3
4
-
5
- before_script:
6
- - "export DISPLAY=:99.0"
7
- - "sh -e /etc/init.d/xvfb start"
8
- - "git clone git://github.com/n1k0/casperjs.git"
9
- - "cd casperjs"
10
- - "git checkout tags/0.6.5"
11
- - "sudo ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs"
12
-
13
- script: "bundle exec rake"
14
-
15
- notifications:
16
- recipients:
17
- - joe@tribesports.com
18
-
19
- branches:
20
- only:
21
- - master
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec
data/Rakefile DELETED
@@ -1,11 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "jasmine"
3
- require 'rspec/core/rake_task'
4
-
5
- RSpec::Core::RakeTask.new("spec")
6
-
7
- load "jasmine/tasks/jasmine.rake"
8
- load "lib/tasks/js.rake"
9
-
10
- desc "Run all tests"
11
- task :default => ["spec", "jasmine:headless"]
@@ -1,23 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "judge/version"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = "judge"
7
- s.version = Judge::VERSION
8
- s.homepage = "http://github.com/joecorcoran/judge"
9
- s.summary = "Simple client side ActiveModel::Validators"
10
- s.description = "Validate Rails 3 forms on the client side, cleanly"
11
- s.email = "joe@tribesports.com"
12
- s.authors = ["Joe Corcoran"]
13
-
14
- s.files = `git ls-files`.split("\n")
15
- s.test_files = `git ls-files -- spec/*`.split("\n")
16
- s.require_paths = ["lib"]
17
-
18
- s.add_development_dependency "jasmine", "~> 1.1.2"
19
- s.add_development_dependency "rails", "~> 3.2"
20
- s.add_development_dependency "rspec", "~> 2.8"
21
- s.add_development_dependency "sqlite3", "~> 1.3.5"
22
- s.add_development_dependency "factory_girl", "~> 2.6"
23
- end
@@ -1,21 +0,0 @@
1
- class JudgeGenerator < Rails::Generators::Base
2
- source_root File.expand_path("../templates", __FILE__)
3
- argument :path, :type => :string, :default => "public/javascripts"
4
- class_option :dep, :type => :boolean, :default => true, :desc => "Copy underscore.js and json2.js"
5
-
6
- desc %Q{
7
- This copies judge.js (and dependencies) to your application.
8
- The default path is public/javascripts, but you can set your own as follows:
9
-
10
- rails generate judge my/super/cool/path
11
-
12
- Use the --no-dep option if you don't want to copy underscore.js and json2.js too.
13
- }
14
- def copy_files
15
- copy_file "judge.js", "#{path}/judge.js"
16
- if options.dep?
17
- copy_file "underscore.js", "#{path}/underscore.js"
18
- copy_file "json2.js", "#{path}/json2.js"
19
- end
20
- end
21
- end
@@ -1,330 +0,0 @@
1
- // Judge 1.5.0
2
- // (c) 2011–2012 Joe Corcoran
3
- // http://raw.github.com/joecorcoran/judge/master/LICENSE.txt
4
- // This is the JavaScript part of Judge, a client-side validation gem for Rails 3.
5
- // You can find a guide and some more traditional API documentation at <http://joecorcoran.github.com/judge/>.
6
- // Hopefully the comments here will help you understand what's happening under the hood.
7
-
8
- /*jshint curly: true, evil: true, newcap: true, noarg: true, strict: false */
9
- /*global _: false, JSON: false */
10
-
11
- (function(root) {
12
-
13
- // The judge namespace.
14
- var judge = {};
15
-
16
- judge.VERSION = '1.5.0';
17
-
18
- // A judge.Watcher is a DOM element wrapper that judge uses to store validation info and instance methods.
19
- judge.Watcher = function (element) {
20
- // Throw dependency errors.
21
- if (typeof root._ === 'undefined') {
22
- throw new DependencyError('Ensure underscore.js is loaded');
23
- }
24
- if (_(root.JSON).isUndefined()) {
25
- throw new DependencyError('Ensure that your browser provides the JSON object or that json2.js is loaded');
26
- }
27
-
28
- // Throw some constructor usage errors.
29
- if (_(element).isUndefined()) {
30
- throw new ReferenceError('No DOM element passed to judge.Watcher constructor');
31
- }
32
- if (element.getAttribute('data-validate') === null) {
33
- throw new ReferenceError('DOM element does not have data-validate attribute – please use Judge::FormBuilder');
34
- }
35
-
36
- // Watcher instance properties.
37
- this.element = element;
38
- this.validators = JSON.parse(this.element.getAttribute('data-validate'));
39
- };
40
-
41
- // The `validate` method returns an object which describes the current validity of the
42
- // value of the watched element.
43
- judge.Watcher.prototype.validate = function(callback) {
44
- var allMessages = [], isValid;
45
- _(this.validators).each(function(v) {
46
- if (this.element.value.length || v.options.allow_blank !== true) {
47
- var messages = this.validates()[v.kind](this.element.value, v.options, v.messages);
48
- if (messages.length) {
49
- allMessages.push(messages);
50
- }
51
- }
52
- }, this);
53
- allMessages = _(allMessages).flatten();
54
- isValid = (allMessages.length < 1);
55
- if (_.isFunction(callback)) {
56
- callback(isValid, allMessages, this.element);
57
- }
58
- return {
59
- valid: isValid,
60
- messages: allMessages,
61
- element: this.element
62
- };
63
- };
64
-
65
- // Ported ActiveModel validators.
66
- // See <http://api.rubyonrails.org/classes/ActiveModel/Validations.html> for the originals.
67
- judge.eachValidators = (function() {
68
- return {
69
- // ActiveModel::Validations::PresenceValidator
70
- presence: function(value, options, messages) {
71
- return (value.length) ? [] : [messages.blank];
72
- },
73
-
74
- // ActiveModel::Validations::LengthValidator
75
- length: function(value, options, messages) {
76
- var msgs = [],
77
- types = {
78
- minimum: { operator: '<', message: 'too_short' },
79
- maximum: { operator: '>', message: 'too_long' },
80
- is: { operator: '!=', message: 'wrong_length' }
81
- };
82
- _(types).each(function(properties, type) {
83
- var invalid = operate(value.length, properties.operator, options[type]);
84
- if (_(options).has(type) && invalid) {
85
- msgs.push(messages[properties.message]);
86
- }
87
- });
88
- return msgs;
89
- },
90
-
91
- // ActiveModel::Validations::ExclusionValidator
92
- exclusion: function(value, options, messages) {
93
- var stringIn = _(options['in']).map(function(o) { return o.toString(); });
94
- return (_(stringIn).include(value)) ? [messages.exclusion] : [];
95
- },
96
-
97
- // ActiveModel::Validations::InclusionValidator
98
- inclusion: function(value, options, messages) {
99
- var stringIn = _(options['in']).map(function(o) { return o.toString(); });
100
- return (!_(stringIn).include(value)) ? [messages.inclusion] : [];
101
- },
102
-
103
- // ActiveModel::Validations::NumericalityValidator
104
- numericality: function(value, options, messages) {
105
- var operators = {
106
- greater_than: '>',
107
- greater_than_or_equal_to: '>=',
108
- equal_to: '==',
109
- less_than: '<',
110
- less_than_or_equal_to: '<='
111
- },
112
- msgs = [],
113
- parsedValue = parseFloat(value, 10);
114
-
115
- if (isNaN(Number(value))) {
116
- msgs.push(messages.not_a_number);
117
- } else {
118
- if (options.odd && isEven(parsedValue)) {
119
- msgs.push(messages.odd);
120
- }
121
- if (options.even && isOdd(parsedValue)) {
122
- msgs.push(messages.even);
123
- }
124
- if (options.only_integer && !isInt(parsedValue)) {
125
- msgs.push(messages.not_an_integer);
126
- }
127
- _(operators).each(function(operator, key) {
128
- var valid = operate(parsedValue, operators[key], parseFloat(options[key], 10));
129
- if (_(options).has(key) && !valid) {
130
- msgs.push(messages[key]);
131
- }
132
- });
133
- }
134
- return msgs;
135
- },
136
-
137
- // ActiveModel::Validations::FormatValidator
138
- format: function(value, options, messages) {
139
- var msgs = [];
140
- if (_(options).has('with')) {
141
- var withReg = convertRegExp(options['with']);
142
- if (!withReg.test(value)) {
143
- msgs.push(messages.invalid);
144
- }
145
- }
146
- if (_(options).has('without')) {
147
- var withoutReg = convertRegExp(options.without);
148
- if (withoutReg.test(value)) {
149
- msgs.push(messages.invalid);
150
- }
151
- }
152
- return msgs;
153
- },
154
-
155
- // ActiveModel::Validations::AcceptanceValidator
156
- acceptance: function(value, options, messages) {
157
- return (this._element.checked === true) ? [] : [messages.accepted];
158
- },
159
-
160
- // ActiveModel::Validations::ConfirmationValidator
161
- confirmation: function(value, options, messages) {
162
- var id = this._element.getAttribute('id'),
163
- confId = id + '_confirmation',
164
- confElem = document.getElementById(confId);
165
- return (value === confElem.value) ? [] : [messages.confirmation];
166
- }
167
- };
168
-
169
- })();
170
-
171
- // This object should contain any judge validation methods
172
- // that correspond to custom validators used in the model.
173
- judge.customValidators = {};
174
-
175
- // Return all validation methods, including those found in judge.customValidators.
176
- // If you name a custom validation method the same as a default one, for example
177
- // `judge.customValidators.presence = function() {};`
178
- // then the custom method _will overwrite_ the default one, so be careful!
179
- judge.Watcher.prototype.validates = function() {
180
- return _.extend({_element: this.element}, judge.eachValidators, judge.customValidators);
181
- };
182
-
183
- // Validate all given element(s) without storing. Watcher creation is handled for you,
184
- // but the created Watchers will not be returned, so it's less flexible.
185
- judge.validate = function(elements, callback) {
186
- var results = [];
187
- elements = isCollection(elements) ? elements : [elements];
188
- _(elements).each(function(element) {
189
- var j = new judge.Watcher(element);
190
- results.push(j.validate(callback));
191
- });
192
- return results;
193
- };
194
-
195
- // The judge store is now open :)
196
- judge.store = (function() {
197
- var store = {};
198
-
199
- return {
200
-
201
- // Stores watcher(s) for element(s) against a user defined key.
202
- save: function(key, element) {
203
- var elements = isCollection(element) ? element : [element];
204
- _(elements).each(function(element) {
205
- if (!_(store).has(key)) { store[key] = []; }
206
- var watchedInstance = new judge.Watcher(element),
207
- currentStored = _(store[key]).pluck('element');
208
- if (!_(currentStored).include(element)) {
209
- store[key].push(watchedInstance);
210
- }
211
- });
212
- return store;
213
- },
214
-
215
- // Removes stored watcher(s).
216
- remove: function(key, element) {
217
- if (!_(store).has(key)) { return null; }
218
- var elements = isCollection(element) ? element : [element];
219
- store[key] = _(store[key]).reject(function(j) { return _(elements).include(j.element); });
220
- if (store[key].length === 0) {
221
- delete store[key];
222
- }
223
- return store[key];
224
- },
225
-
226
- // Returns the entire store object, or an array of watchers stored against
227
- // the given key.
228
- get: function(key) {
229
- if (_(key).isUndefined()) { return store; }
230
- return _(store).has(key) ? store[key] : null;
231
- },
232
-
233
- // Returns the entire store object with watchers converted to elements,
234
- // or all DOM elements stored within all watchers stored against the given key.
235
- getDOM: function(key) {
236
- if (_(key).isUndefined()) {
237
- var convertedStore = {};
238
- _(store).each(function(array, key) {
239
- convertedStore[key] = _(array).pluck('element');
240
- });
241
- return convertedStore;
242
- }
243
- return _(store).has(key) ? _(store[key]).pluck('element') : null;
244
- },
245
-
246
- // Shortcut for `judge.validate(judge.store.getDOM(key));`.
247
- // Returns null if no stored elements are found for the given key.
248
- validate: function(key, callback) {
249
- var elements = judge.store.getDOM(key);
250
- return (key && !_(elements).isNull()) ? judge.validate(elements, callback) : null;
251
- },
252
-
253
- // Wipes the entire store object, or wipes all watchers stored against
254
- // the given key.
255
- clear: function(key) {
256
- if (_(key).isUndefined()) {
257
- store = {};
258
- } else {
259
- if (!_(store).has(key)) { return null; }
260
- delete store[key];
261
- }
262
- return store;
263
- }
264
-
265
- };
266
- })();
267
-
268
- // Trying to be a bit more descriptive than the basic error types allow.
269
- var DependencyError = function(message) {
270
- this.name = 'DependencyError';
271
- this.message = message;
272
- };
273
- DependencyError.prototype = new Error();
274
- DependencyError.prototype.constructor = DependencyError;
275
-
276
- // A way of checking isArray, but including weird object types that are returned from collection queries.
277
- var isCollection = function(object) {
278
- var type = objectString(object),
279
- types = [
280
- 'Array',
281
- 'NodeList',
282
- 'StaticNodeList',
283
- 'HTMLCollection',
284
- 'HTMLFormElement',
285
- 'HTMLAllCollection'
286
- ];
287
- return _(types).include(type);
288
- };
289
-
290
- // Returns the object type as represented in `Object.prototype.toString`.
291
- var objectString = function(object) {
292
- var string = Object.prototype.toString.call(object);
293
- return string.replace(/\[|\]/g, '').split(' ')[1];
294
- };
295
-
296
- // OMG! How can you use eval, you monster! It's totally evil!
297
- // (It's used here for stuff like `(3, '<', 4) => '3 < 4' => true`.)
298
- var operate = function(input, operator, validInput) {
299
- return eval(input+' '+operator+' '+validInput);
300
- };
301
-
302
- // Some nifty numerical helpers.
303
- var
304
- isInt = function(value) { return value === +value && value === (value|0); },
305
- isFloat = function(value) { return value === +value && value !== (value|0); },
306
- isEven = function(value) { return (value % 2 === 0) ? true : false; },
307
- isOdd = function(value) { return !isEven(value); };
308
-
309
- // Converts a Ruby regular expression, given as a string, into JavaScript.
310
- // This is rudimentary at best, as there are many, many differences between Ruby
311
- // and JavaScript when it comes to regexp-fu. Basically, if you validate your records
312
- // using complex regular expressions AND you hope that this will "just work"
313
- // on the client-side too&hellip; you are going to be pretty disappointed.
314
- // If you know of a better way (or an existing library) to convert regular expressions
315
- // from Ruby to JavaScript, I would really love to hear from you.
316
- var convertRegExp = function(string) {
317
- var parts = string.slice(1, -1).split(':'),
318
- flags = parts.shift().replace('?', ''),
319
- source = parts.join(':').replace(/\\\\/g, '\\');
320
- return new RegExp(source, convertFlags(flags));
321
- };
322
- var convertFlags = function(string) {
323
- var on = string.split('-')[0];
324
- return (/m/.test(on)) ? 'm' : '';
325
- };
326
-
327
- // Make judge object available.
328
- root.judge = judge;
329
-
330
- })(window);