judge 1.5.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,79 +0,0 @@
1
- # src_files
2
- #
3
- # Return an array of filepaths relative to src_dir to include before jasmine specs.
4
- # Default: []
5
- #
6
- # EXAMPLE:
7
- #
8
- # src_files:
9
- # - lib/source1.js
10
- # - lib/source2.js
11
- # - dist/**/*.js
12
- #
13
- src_files:
14
- - spec/javascripts/helpers/jquery-1.5.1.min.js
15
- - spec/javascripts/helpers/json2.js
16
- - spec/javascripts/helpers/underscore.js
17
- - lib/generators/judge/templates/judge.js
18
-
19
- # stylesheets
20
- #
21
- # Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
22
- # Default: []
23
- #
24
- # EXAMPLE:
25
- #
26
- # stylesheets:
27
- # - css/style.css
28
- # - stylesheets/*.css
29
- #
30
- stylesheets:
31
-
32
- # helpers
33
- #
34
- # Return an array of filepaths relative to spec_dir to include before jasmine specs.
35
- # Default: ["helpers/**/*.js"]
36
- #
37
- # EXAMPLE:
38
- #
39
- # helpers:
40
- # - helpers/**/*.js
41
- #
42
- helpers:
43
- - helpers/jasmine-jquery.js
44
- - helpers/customMatchers.js
45
-
46
- # spec_files
47
- #
48
- # Return an array of filepaths relative to spec_dir to include.
49
- # Default: ["**/*[sS]pec.js"]
50
- #
51
- # EXAMPLE:
52
- #
53
- # spec_files:
54
- # - **/*[sS]pec.js
55
- #
56
- spec_files:
57
- - JudgeSpec.js
58
-
59
- # src_dir
60
- #
61
- # Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
62
- # Default: project root
63
- #
64
- # EXAMPLE:
65
- #
66
- # src_dir: public
67
- #
68
- src_dir:
69
-
70
- # spec_dir
71
- #
72
- # Spec directory path. Your spec_files must be returned relative to this path.
73
- # Default: spec/javascripts
74
- #
75
- # EXAMPLE:
76
- #
77
- # spec_dir: spec/javascripts
78
- #
79
- spec_dir:
@@ -1,6 +0,0 @@
1
- module Jasmine
2
- class Config
3
- attr_reader :jasmine_server_port
4
- end
5
- end
6
-
@@ -1,21 +0,0 @@
1
- $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
-
3
- require 'rubygems'
4
- require 'jasmine'
5
- jasmine_config_overrides = File.expand_path(File.join(File.dirname(__FILE__), 'jasmine_config.rb'))
6
- require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
7
- require 'rspec'
8
-
9
-
10
- jasmine_config = Jasmine::Config.new
11
- spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
12
-
13
- should_stop = false
14
-
15
- RSpec.configuration.after(:suite) do
16
- spec_builder.stop if should_stop
17
- end
18
-
19
- spec_builder.start
20
- should_stop = true
21
- spec_builder.declare_suites
@@ -1,51 +0,0 @@
1
- var casper = require('casper').create(),
2
- path = casper.cli.args[0],
3
- colorizer = require('colorizer').create(),
4
- data;
5
-
6
- casper
7
- .start(path)
8
- .then(function() {
9
- this.waitForSelector('.finished-at', function() {
10
- data = this.evaluate(readResults);
11
- });
12
- })
13
- .run(function() {
14
- this.echo(fmtTitle(data.desc, data.status));
15
- if (data.messages.length > 0) {
16
- this.echo(data.messages.join('\n\n') + '\n', colorType(data.status));
17
- }
18
- this.exit(data.status);
19
- });
20
-
21
- var readResults = function() {
22
- var desc = document.querySelector('.runner .description').innerHTML,
23
- msgs = [],
24
- status = 0;
25
- if (document.querySelector('.runner.failed')) {
26
- var f = document.querySelectorAll('.spec.failed');
27
- for (var i = 0, l = f.length; i < l; i += 1) {
28
- var msg = ' ' + (i + 1) + '. '
29
- + f[i].querySelector('.description').title
30
- + ' (' + f[i].querySelector('.messages .resultMessage').innerHTML + ')';
31
- msgs.push(msg);
32
- };
33
- status = 1;
34
- };
35
- return { desc: desc, messages: msgs, status: status };
36
- };
37
-
38
- var fmtTitle = function(string, status) {
39
- var fail = (status === 1);
40
- string = colorizer.format(string, {
41
- fg: (fail ? 'red' : 'green'),
42
- bold: true,
43
- underscore: !!fail
44
- });
45
- string = '\n' + string + '\n';
46
- return string;
47
- };
48
-
49
- var colorType = function(status) {
50
- return (status === 1) ? 'WARNING' : 'INFO';
51
- };
@@ -1,73 +0,0 @@
1
- require "support/spec_helper"
2
-
3
- describe Judge::MessageCollection do
4
-
5
- let(:user) { FactoryGirl.build(:user) }
6
-
7
- it "has to_hash method which returns messages hash" do
8
- amv = User.validators_on(:name).first
9
- message_collection = Judge::MessageCollection.new(user, :name, amv)
10
- message_collection.should respond_to :to_hash
11
- message_collection.to_hash.should be_a Hash
12
- end
13
-
14
- describe "base messages" do
15
- it "adds correct base message to messages hash" do
16
- amv = User.validators_on(:name).first
17
- messages = Judge::MessageCollection.new(user, :name, amv).to_hash
18
- messages[:blank].should eql "Name must not be blank"
19
- end
20
- end
21
-
22
- describe "options messages" do
23
- it "adds correct optional messages to messages hash when present (length)" do
24
- amv = User.validators_on(:username).first
25
- messages = Judge::MessageCollection.new(user, :username, amv).to_hash
26
- messages[:too_long].should eql "Username is too long (must be less than 10 characters)"
27
- end
28
-
29
- it "adds correct optional messages to messages hash when present (numericality)" do
30
- amv = User.validators_on(:age).first
31
- messages = Judge::MessageCollection.new(user, :age, amv).to_hash
32
- messages[:greater_than].should eql "Age must be greater than 13"
33
- end
34
-
35
- it "adds nothing to messages hash when optional messages not present" do
36
- amv = User.validators_on(:name).first
37
- messages = Judge::MessageCollection.new(user, :name, amv).to_hash
38
- messages[:too_long].should be_nil
39
- messages[:greater_than].should be_nil
40
- end
41
- end
42
-
43
- describe "blank messages" do
44
- it "adds blank message to messages hash if applicable" do
45
- amv = User.validators_on(:username).first
46
- messages = Judge::MessageCollection.new(user, :username, amv).to_hash
47
- messages[:blank].should eql "Username must not be blank"
48
- end
49
-
50
- it "does not add blank message to messages hash if allow_blank is true" do
51
- amv = User.validators_on(:country).first
52
- messages = Judge::MessageCollection.new(user, :country, amv).to_hash
53
- messages[:blank].should be_nil
54
- end
55
- end
56
-
57
- describe "integer messages" do
58
- it "adds not_an_integer message to messages hash if only_integer is true" do
59
- amv = User.validators_on(:age).first
60
- messages = Judge::MessageCollection.new(user, :age, amv).to_hash
61
- messages[:not_an_integer].should eql "Age must be an integer"
62
- end
63
- end
64
-
65
- describe "custom messages" do
66
- it "adds custom messages to messages hash if declared inside EachValidator" do
67
- amv = User.validators_on(:city).first
68
- messages = Judge::MessageCollection.new(user, :city, amv).to_hash
69
- messages[:not_valid_city].should eql "City must be an approved city"
70
- end
71
- end
72
-
73
- end
@@ -1,75 +0,0 @@
1
- # setup ActiveRecord classes for tests
2
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
3
- ActiveRecord::Schema.define(:version => 1) do
4
- create_table :users do |t|
5
- t.string :name
6
- t.string :username
7
- t.string :country
8
- t.integer :age
9
- t.text :bio
10
- t.string :password
11
- t.boolean :accepted
12
- t.text :gender
13
- t.date :dob
14
- t.integer :team_id
15
- t.string :time_zone
16
- t.integer :discipline_id
17
- t.string :city
18
- end
19
- create_table :teams do |t|
20
- t.string :name
21
- end
22
- create_table :categories do |t|
23
- t.string :name
24
- end
25
- create_table :sports do |t|
26
- t.string :name
27
- t.integer :category_id
28
- end
29
- create_table :disciplines do |t|
30
- t.string :name
31
- t.integer :sport_id
32
- end
33
- end
34
-
35
- class User < ActiveRecord::Base
36
- belongs_to :team
37
-
38
- validates :name, :presence => true
39
- validates :username, :length => { :maximum => 10 }
40
- validates :country, :format => { :with => /[A-Za-z]/, :allow_blank => true }
41
- validates :age, :numericality => { :only_integer => true, :greater_than => 13 }
42
- validates :bio, :presence => true
43
- validates :password, :format => { :with => /.+/ }, :confirmation => true
44
- validates :accepted, :acceptance => true
45
- validates :gender, :inclusion => { :in => ["male", "female", "other", "withheld"] }
46
- validates :dob, :presence => true
47
- validates :team_id, :presence => true
48
- validates :time_zone, :presence => true
49
- validates :discipline_id, :presence => true
50
- validates :city, :city => true
51
- end
52
-
53
- class Team < ActiveRecord::Base; end
54
-
55
- class Category < ActiveRecord::Base
56
- has_many :sports
57
- end
58
- class Sport < ActiveRecord::Base
59
- belongs_to :category
60
- has_many :disciplines
61
- end
62
- class Discipline < ActiveRecord::Base
63
- belongs_to :sport
64
- belongs_to :user
65
- end
66
-
67
- # i18n locale file
68
- I18n.load_path << File.expand_path("spec/support/locale/en.yml")
69
-
70
- # hack to stop #url_for error
71
- module ActionDispatch::Routing::PolymorphicRoutes
72
- def polymorphic_path(record_or_hash_or_array, options = {})
73
- ""
74
- end
75
- end
@@ -1,23 +0,0 @@
1
- FactoryGirl.define do
2
- factory :user do
3
- dob { Time.new(2011,11,5, 17,00,00) }
4
- end
5
-
6
- factory :team do
7
- sequence(:name) {|n| "Team #{n}" }
8
- end
9
-
10
- factory :category do
11
- sequence(:name) {|n| "Category #{n}" }
12
- end
13
-
14
- factory :sport do
15
- sequence(:name) {|n| "Sport #{n}" }
16
- category
17
- end
18
-
19
- factory :discipline do
20
- sequence(:name) {|n| "Discipline #{n}" }
21
- sport
22
- end
23
- end
@@ -1,18 +0,0 @@
1
- en:
2
- activerecord:
3
- errors:
4
- models:
5
- user:
6
- attributes:
7
- city:
8
- not_valid_city: "%{attribute} must be an approved city"
9
- errors:
10
- attributes:
11
- city:
12
- not_valid_city: "This is never reached"
13
-
14
- messages:
15
- not_an_integer: "%{attribute} must be an integer"
16
- blank: "%{attribute} must not be blank"
17
- greater_than: "%{attribute} must be greater than %{count}"
18
- too_long: "%{attribute} is too long (must be less than %{count} characters)"
@@ -1,72 +0,0 @@
1
- # setup fake ActiveRecord class for tests
2
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
3
- ActiveRecord::Schema.define(:version => 1) do
4
- create_table :users do |t|
5
- t.string :name
6
- t.string :username
7
- t.string :country
8
- t.integer :age
9
- t.text :bio
10
- t.string :password
11
- t.boolean :accepted
12
- t.text :gender
13
- t.date :dob
14
- t.integer :team_id
15
- t.string :time_zone
16
- t.integer :discipline_id
17
- t.string :foo
18
- end
19
- create_table :teams do |t|
20
- t.string :name
21
- end
22
- create_table :categories do |t|
23
- t.string :name
24
- end
25
- create_table :sports do |t|
26
- t.string :name
27
- t.integer :category_id
28
- end
29
- create_table :disciplines do |t|
30
- t.string :name
31
- t.integer :sport_id
32
- end
33
- end
34
-
35
- class User < ActiveRecord::Base
36
- belongs_to :team
37
-
38
- validates :name, :presence => true
39
- validates :username, :length => { :maximum => 10 }
40
- validates :country, :format => { :with => /[A-Za-z]/, :allow_blank => true }
41
- validates :age, :numericality => { :only_integer => true, :greater_than => 13 }
42
- validates :bio, :presence => true
43
- validates :password, :format => { :with => /.+/ }, :confirmation => true
44
- validates :accepted, :acceptance => true
45
- validates :gender, :inclusion => { :in => ["male", "female", "other", "withheld"] }
46
- validates :dob, :presence => true
47
- validates :team_id, :presence => true
48
- validates :time_zone, :presence => true
49
- validates :discipline_id, :presence => true
50
- validates :foo, :foo => true
51
- end
52
-
53
- class Team < ActiveRecord::Base; end
54
-
55
- class Category < ActiveRecord::Base
56
- has_many :sports
57
- end
58
- class Sport < ActiveRecord::Base
59
- belongs_to :category
60
- has_many :disciplines
61
- end
62
- class Discipline < ActiveRecord::Base
63
- belongs_to :sport
64
- belongs_to :user
65
- end
66
-
67
- # hack to stop #url_for error
68
- module ActionDispatch::Routing::PolymorphicRoutes
69
- def polymorphic_path(record_or_hash_or_array, options = {})
70
- ""
71
- end
72
- end
@@ -1,13 +0,0 @@
1
- require "bundler/setup"
2
- require "active_record"
3
- require "action_view"
4
- require "judge"
5
- require "rspec"
6
- require "factory_girl"
7
- require "support/validators/city_validator"
8
- require "setup"
9
- require "support/factories"
10
-
11
- RSpec.configure do |config|
12
- config.color_enabled = true
13
- end
@@ -1,9 +0,0 @@
1
- class CityValidator < ActiveModel::EachValidator
2
- declare_messages :not_valid_city
3
-
4
- def validate_each(record, attribute, value)
5
- unless ["London", "New York City"].include? value
6
- record.errors.add :attribute, :not_valid_city
7
- end
8
- end
9
- end