ar-enums 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76780917d22a19979bf55349df98c76f027b56f2
4
- data.tar.gz: 684f4dd21c88e5afa078899e2fbd1b2a7c51e9a0
3
+ metadata.gz: 6c0a162df9f114bb7f98a9e3677f9c9f120410fa
4
+ data.tar.gz: 3b5e730a99f090bd33d8358ae7f0c956b56de9b7
5
5
  SHA512:
6
- metadata.gz: f4008e4235652e4079b753a12f7c06cabbe0f415699ce6ed1af4ae9845b8f13065c8a08b8d159a2dbb0b1e27c81fcb97edac660a960698221ce37df18c7b62a9
7
- data.tar.gz: 77fdae95b57878bf048128c3452cbdf7143b6547562c66d8498df7b3e752bda42fe41020449b4468ff976dff757ff4f3c6610578713cefb66e4c79c25b1f9fe8
6
+ metadata.gz: 0617d1dc6e15212c45ca6971755123e92f33221ce241369737b7f5cc800c087fe44e97b6e310f2c89fc137a4abf9d150c16f04604a7151adb5e9507b851da9e0
7
+ data.tar.gz: 0ff182905b261870a7b4f84fd86f5641894a9d1e1d3ee4f4262cb7606d8aa6db52377c85acd4a62d4bc4deaf13b12944889dd555c359445da80042b0d4ce641e
@@ -0,0 +1 @@
1
+ 2.3.1
@@ -1,52 +1,82 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ar-enums (2.0.1)
4
+ ar-enums (2.0.2)
5
5
  activerecord (>= 3.1.0)
6
- rake
7
6
 
8
7
  GEM
9
8
  remote: http://rubygems.org/
10
9
  specs:
11
- activemodel (4.1.4)
12
- activesupport (= 4.1.4)
13
- builder (~> 3.1)
14
- activerecord (4.1.4)
15
- activemodel (= 4.1.4)
16
- activesupport (= 4.1.4)
17
- arel (~> 5.0.0)
18
- activesupport (4.1.4)
19
- i18n (~> 0.6, >= 0.6.9)
20
- json (~> 1.7, >= 1.7.7)
10
+ activemodel (5.2.0)
11
+ activesupport (= 5.2.0)
12
+ activerecord (5.2.0)
13
+ activemodel (= 5.2.0)
14
+ activesupport (= 5.2.0)
15
+ arel (>= 9.0)
16
+ activesupport (5.2.0)
17
+ concurrent-ruby (~> 1.0, >= 1.0.2)
18
+ i18n (>= 0.7, < 2)
21
19
  minitest (~> 5.1)
22
- thread_safe (~> 0.1)
23
20
  tzinfo (~> 1.1)
24
- arel (5.0.1.20140414130214)
25
- builder (3.2.2)
26
- diff-lcs (1.1.2)
27
- guard (1.4.0)
28
- listen (>= 0.4.2)
29
- thor (>= 0.14.6)
30
- guard-rspec (0.4.5)
31
- guard (>= 0.4.0)
32
- i18n (0.6.11)
33
- json (1.8.1)
34
- listen (0.5.3)
35
- minitest (5.4.0)
21
+ arel (9.0.0)
22
+ coderay (1.1.2)
23
+ concurrent-ruby (1.0.5)
24
+ diff-lcs (1.3)
25
+ ffi (1.9.25)
26
+ formatador (0.2.5)
27
+ guard (2.14.2)
28
+ formatador (>= 0.2.4)
29
+ listen (>= 2.7, < 4.0)
30
+ lumberjack (>= 1.0.12, < 2.0)
31
+ nenv (~> 0.1)
32
+ notiffany (~> 0.0)
33
+ pry (>= 0.9.12)
34
+ shellany (~> 0.0)
35
+ thor (>= 0.18.1)
36
+ guard-compat (1.2.1)
37
+ guard-rspec (4.7.3)
38
+ guard (~> 2.1)
39
+ guard-compat (~> 1.1)
40
+ rspec (>= 2.99.0, < 4.0)
41
+ i18n (1.0.1)
42
+ concurrent-ruby (~> 1.0)
43
+ listen (3.1.5)
44
+ rb-fsevent (~> 0.9, >= 0.9.4)
45
+ rb-inotify (~> 0.9, >= 0.9.7)
46
+ ruby_dep (~> 1.2)
47
+ lumberjack (1.0.13)
48
+ method_source (0.9.0)
49
+ minitest (5.11.3)
50
+ nenv (0.3.0)
51
+ notiffany (0.1.1)
52
+ nenv (~> 0.1)
53
+ shellany (~> 0.0)
54
+ pry (0.11.3)
55
+ coderay (~> 1.1.0)
56
+ method_source (~> 0.9.0)
36
57
  rake (10.3.2)
37
- rb-fsevent (0.9.3)
38
- rspec (2.4.0)
39
- rspec-core (~> 2.4.0)
40
- rspec-expectations (~> 2.4.0)
41
- rspec-mocks (~> 2.4.0)
42
- rspec-core (2.4.0)
43
- rspec-expectations (2.4.0)
44
- diff-lcs (~> 1.1.2)
45
- rspec-mocks (2.4.0)
58
+ rb-fsevent (0.10.3)
59
+ rb-inotify (0.9.10)
60
+ ffi (>= 0.5.0, < 2)
61
+ rspec (3.7.0)
62
+ rspec-core (~> 3.7.0)
63
+ rspec-expectations (~> 3.7.0)
64
+ rspec-mocks (~> 3.7.0)
65
+ rspec-core (3.7.1)
66
+ rspec-support (~> 3.7.0)
67
+ rspec-expectations (3.7.0)
68
+ diff-lcs (>= 1.2.0, < 2.0)
69
+ rspec-support (~> 3.7.0)
70
+ rspec-mocks (3.7.0)
71
+ diff-lcs (>= 1.2.0, < 2.0)
72
+ rspec-support (~> 3.7.0)
73
+ rspec-support (3.7.1)
74
+ ruby_dep (1.5.0)
75
+ shellany (0.0.1)
46
76
  sqlite3 (1.3.9)
47
- thor (0.19.1)
48
- thread_safe (0.3.4)
49
- tzinfo (1.2.1)
77
+ thor (0.20.0)
78
+ thread_safe (0.3.6)
79
+ tzinfo (1.2.5)
50
80
  thread_safe (~> 0.1)
51
81
 
52
82
  PLATFORMS
@@ -55,6 +85,9 @@ PLATFORMS
55
85
  DEPENDENCIES
56
86
  ar-enums!
57
87
  guard-rspec
58
- rb-fsevent
88
+ rake
59
89
  rspec
60
90
  sqlite3 (>= 1.3.4)
91
+
92
+ BUNDLED WITH
93
+ 1.16.0
data/Guardfile CHANGED
@@ -1,21 +1,5 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- guard 'rspec', :version => 2 do
1
+ guard :rspec, cmd: 'bundle exec rspec' do
5
2
  watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
4
  watch('spec/spec_helper.rb') { "spec" }
8
-
9
- # Rails example
10
- watch(%r{^spec/.+_spec\.rb$})
11
- watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
12
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
13
- watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
14
- watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
15
- watch('spec/spec_helper.rb') { "spec" }
16
- watch('config/routes.rb') { "spec/routing" }
17
- watch('app/controllers/application_controller.rb') { "spec/controllers" }
18
- # Capybara request specs
19
- watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
20
5
  end
21
-
@@ -0,0 +1,129 @@
1
+ # ar-enums
2
+
3
+ This is a simple solution for defining enumerations in your Rails models.
4
+
5
+ [![Build Status](https://travis-ci.org/eeng/ar-enums.svg?branch=master)](https://travis-ci.org/eeng/ar-enums)
6
+
7
+ ## Description
8
+
9
+ It provides two forms of enumerations:
10
+ * Internal, i.e. defined within the owner of the enum, for the simple cases.
11
+ * External, i.e. defined on it's own class, for the complex ones.
12
+
13
+ In both cases the enum values are stored in-memory. Let's see some examples of both kinds.
14
+
15
+ ## Internal enumerations
16
+
17
+ Can be defined in three flavours:
18
+
19
+ ### Array of values style
20
+
21
+ This is the simplest and probably the most frecuent case:
22
+
23
+ ```ruby
24
+ class TrafficLight < ActiveRecord::Base
25
+ enum :state, %w[red green yellow]
26
+ end
27
+
28
+ tl = TrafficLight.new(:state => :green)
29
+ tl.state # => #<TrafficLight::State @name="green", @id=2>
30
+ tl.state_id # => 2
31
+ tl.state.green? # => true
32
+ ```
33
+
34
+ As you can see each enum value is an instance of a dinamically generated class (which inherits from ArEnums::Base) and has an ordinal value, id, autogenerated staring on 1.
35
+
36
+ The enumerations array is accessed with a class method:
37
+
38
+ ```ruby
39
+ TrafficLight.states # => [#<TrafficLight::State @name="red", @id=1>, #<TrafficLight::State @name="green", @id=2>, ...]
40
+ ```
41
+
42
+ By default when `#to_s` is called on a Enum instance it returns the name titleized, but this behaviour can be overrided. See Displaying Enums section below.
43
+
44
+ ### Array of hashes style
45
+
46
+ This allows you to define new columns in the Enum value. If the :id is not specified is generated for you.
47
+
48
+ ```ruby
49
+ class TrafficLight < ActiveRecord::Base
50
+ enum :state, [
51
+ { :name => :red, :stop_traffic => true, :rgb => 0xF00 },
52
+ { :name => :green, :stop_traffic => false, :rgb => 0x0F0 }
53
+ ]
54
+ end
55
+
56
+ tl = TrafficLight.new(:state => :green)
57
+ tl.state_id # => 2
58
+ tl.state.stop_traffic # => false
59
+ tl.state.rgb # => 0x0F0
60
+ ```
61
+
62
+ ### Block style
63
+
64
+ ```ruby
65
+ class TrafficLight < ActiveRecord::Base
66
+ enum :state do
67
+ red :stop_traffic => true, :rgb => 0xF00
68
+ green :stop_traffic => false, :rgb => 0x0F0
69
+ end
70
+ end
71
+ ```
72
+
73
+ ## External enumerations
74
+
75
+ When you have shared enumerations or just don't want to clutter the owner model with enums definitions,
76
+ the enumeration can be on it's own class, as the State enum in the following example:
77
+
78
+ ```ruby
79
+ class TrafficLight < ActiveRecord::Base
80
+ enum :state
81
+ end
82
+
83
+ class State < ArEnums::Base
84
+ enumeration do
85
+ red :stop_traffic => true, :rgb => 0xF00, :desc => 'Rojo'
86
+ green :stop_traffic => false, :rgb => 0x0F0, :desc => 'Verde'
87
+ end
88
+ end
89
+
90
+ State[:red] # => #<State @name="red", @id=1, ...>
91
+ State[:red].to_s # => "Rojo"
92
+ ```
93
+
94
+ Note the block style sintax is exactly the same as in the internal enumerations. In fact any of the 3 styles mencioned above can be used on external enumerations.
95
+
96
+ Also note the `#to_s` by default return the value of the `:desc` column. Of course you can override the `#to_s` method as usual.
97
+
98
+ Then you can access the enumerations collection from both places:
99
+
100
+ ```ruby
101
+ TrafficLight.states # => [#<State @name="red", @id=1, ...>, #<State @name="green", @id=2, ...>]
102
+ States.all # => [#<State @name="red", @id=1, ...>, #<State @name="green", @id=2, ...>]
103
+ ```
104
+
105
+ The `enum` method accept a `:class_method` option similar to the one in `belongs_to` and others to specify the class of the enum.
106
+
107
+ ## Displaying Enums
108
+
109
+ In the array of values style the default is the name titleized but you can pass a `:label` options to override:
110
+
111
+ ```ruby
112
+ class TrafficLight < ActiveRecord::Base
113
+ enum :state, %w[red green yellow], :label => :upcase
114
+ end
115
+
116
+ TrafficLight.states.map(&:to_s) # => ["RED", "GREEN", "YELLOW"]
117
+ ```
118
+
119
+ If you use the block o array of hashes sintax and add a `:desc` column it will be used as `#to_s`, unless a `:label` option is passed.
120
+
121
+ ## Note on Patches/Pull Requests
122
+
123
+ * Fork the project.
124
+ * Make your feature addition or bug fix.
125
+ * Add tests for it. This is important so I don't break it in a
126
+ future version unintentionally.
127
+ * Commit, do not mess with rakefile, version, or history.
128
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
129
+ * Send me a pull request. Bonus points for topic branches.
data/Rakefile CHANGED
@@ -4,4 +4,4 @@ Bundler::GemHelper.install_tasks
4
4
 
5
5
  require "rspec/core/rake_task"
6
6
  RSpec::Core::RakeTask.new :spec
7
- task :default => :spec
7
+ task default: :spec
@@ -16,12 +16,10 @@ Gem::Specification.new do |s|
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
18
  s.require_paths = ["lib"]
19
-
19
+
20
20
  s.add_development_dependency "rspec"
21
21
  s.add_development_dependency "guard-rspec"
22
- s.add_development_dependency "rb-fsevent"
23
- # s.add_development_dependency "ruby-debug19"
24
22
  s.add_development_dependency "sqlite3", ">= 1.3.4"
23
+ s.add_development_dependency "rake"
25
24
  s.add_dependency "activerecord", ">= 3.1.0"
26
- s.add_dependency "rake"
27
25
  end
@@ -1,27 +1,25 @@
1
- require 'rubygems'
2
- require 'active_record'
3
1
  require 'ar-enums'
4
2
 
5
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
3
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
6
4
  load(File.dirname(__FILE__) + "/../spec/schema.rb")
7
5
 
8
6
  class TrafficLight < ActiveRecord::Base
9
7
  enum :state, %w[red green yellow]
10
8
  end
11
9
 
12
- tl = TrafficLight.new(:state => :green)
10
+ tl = TrafficLight.new(state: :green)
13
11
  p tl.state # => #<TrafficLight::State @name="green", @id=2>
14
- p tl.state_id # => 2
12
+ p tl.state_id # => 2
15
13
  p TrafficLight.states.map(&:to_s)
16
14
 
17
15
  # class TrafficLight < ActiveRecord::Base
18
16
  # enum :state, [
19
- # { :name => :red, :stop_traffic => true, :rgb => 0xF00 },
20
- # { :name => :green, :stop_traffic => false, :rgb => 0x0F0 }
17
+ # { name: :red, stop_traffic: true, rgb: 0xF00 },
18
+ # { name: :green, stop_traffic: false, rgb: 0x0F0 }
21
19
  # ]
22
20
  # end
23
- #
24
- # tl = TrafficLight.new(:state => :green)
25
- # p tl.state_id # => 2
21
+ #
22
+ # tl = TrafficLight.new(state: :green)
23
+ # p tl.state_id # => 2
26
24
  # p tl.state.stop_traffic # => false
27
25
  # p tl.state.rgb # => 0x0F0
@@ -1,3 +1,3 @@
1
1
  module ArEnums
2
- VERSION = "2.0.1"
2
+ VERSION = "2.0.2"
3
3
  end
@@ -4,7 +4,7 @@ describe "Enum" do
4
4
  it "should provide :to_sym method returning name as symbols" do
5
5
  ArEnums::Base.new(name: :green).to_sym.should == :green
6
6
  end
7
-
7
+
8
8
  it "should store extra columns as a hash without the :enum_class that is passed from other classes" do
9
9
  ArEnums::Base.new(name: :green, factor: 1.5, enum_class: Class.new).extra_columns.should == { factor: 1.5 }
10
10
  end
@@ -17,30 +17,30 @@ describe "Enum" do
17
17
  green rgb: 0x0F0
18
18
  blue rgb: 0x00F
19
19
  end
20
- end
20
+ end
21
21
 
22
22
  define_model_class 'State', 'ArEnums::Base' do
23
23
  enumeration do
24
24
  on id: 80
25
25
  off id: 90
26
26
  end
27
- end
27
+ end
28
28
  end
29
-
29
+
30
30
  it "should provide :all method to access the enums" do
31
31
  Color.all[0].should be_enum_with(name: 'red', rgb: 0xF00)
32
32
  Color.all[1].should be_enum_with(name: 'green', rgb: 0x0F0)
33
33
  State.all[0].should be_enum_with(name: 'on', id: 80)
34
34
  State.all[1].should be_enum_with(name: 'off', id: 90)
35
35
  end
36
-
36
+
37
37
  it "should provide [] method to access the enums" do
38
38
  Color[:red].should be_enum_with(name: 'red')
39
39
  Color['green'].should be_enum_with(name: 'green')
40
40
  Color[2].should be_enum_with(name: 'green')
41
41
  end
42
42
  end
43
-
43
+
44
44
  context "finders" do
45
45
  it "find_all_by_id" do
46
46
  Color.find_all_by_id([1, 2, 3, 4]).should == Color.all
@@ -48,7 +48,7 @@ describe "Enum" do
48
48
  Color.find_all_by_id([]).should == []
49
49
  end
50
50
  end
51
-
51
+
52
52
  it "in? should check if == to any" do
53
53
  define_model_class 'Color', 'ArEnums::Base' do
54
54
  enumeration do
@@ -56,16 +56,16 @@ describe "Enum" do
56
56
  green rgb: 0x0F0
57
57
  blue rgb: 0x00F
58
58
  end
59
- end
60
-
59
+ end
60
+
61
61
  Color[:red].should be_in :red, :blue
62
62
  Color[:red].should be_in :green, :red, :blue
63
63
  Color[:red].should be_in Color[:red]
64
64
  Color[:red].should_not be_in :blue
65
65
  end
66
-
66
+
67
67
  it "should work with sets" do
68
- Set.new([Color[:red]]).intersection(Set.new([Color[:red].dup])).should have(1).item
68
+ Set.new([Color[:red]]).intersection(Set.new([Color[:red].dup])).size.should == 1
69
69
  end
70
70
 
71
71
  it "should be sortable" do
@@ -10,60 +10,60 @@ describe "Internal enumerations" do
10
10
  before do
11
11
  define_traffic_light :state, %w[red green yellow]
12
12
  end
13
-
13
+
14
14
  context "getter and setter" do
15
15
  it "getter should return an Enum" do
16
- TrafficLight.new(:state_id => 3).state.should be_enum_with(:id => 3, :name => 'yellow')
16
+ TrafficLight.new(state_id: 3).state.should be_enum_with(id: 3, name: 'yellow')
17
17
  end
18
18
 
19
19
  it "should store ordinal by default as foreign key" do
20
- TrafficLight.new(:state => :green).state_id.should == 2
20
+ TrafficLight.new(state: :green).state_id.should == 2
21
21
  end
22
22
 
23
23
  it "should store nil if enum doesn't exists" do
24
- TrafficLight.new(:state => :black).state_id.should be_nil
24
+ TrafficLight.new(state: :black).state_id.should be_nil
25
25
  end
26
26
 
27
27
  it "should allow to set enum with symbol" do
28
- TrafficLight.new(:state => :red).state.should == :red
29
- TrafficLight.new(:state => :green).state.should == :green
28
+ TrafficLight.new(state: :red).state.should == :red
29
+ TrafficLight.new(state: :green).state.should == :green
30
30
  end
31
31
 
32
32
  it "should allow to set enum with string" do
33
- TrafficLight.new(:state => 'red').state.should == :red
34
- TrafficLight.new(:state => 'green').state.should == :green
33
+ TrafficLight.new(state: 'red').state.should == :red
34
+ TrafficLight.new(state: 'green').state.should == :green
35
35
  end
36
36
 
37
37
  it "should allow to set enum with ordinal" do
38
- TrafficLight.new(:state_id => 1).state.should == :red
39
- TrafficLight.new(:state_id => 2).state.should == :green
40
- end
38
+ TrafficLight.new(state_id: 1).state.should == :red
39
+ TrafficLight.new(state_id: 2).state.should == :green
40
+ end
41
41
  end
42
-
42
+
43
43
  context "options" do
44
44
  it "should pass the options to the factory" do
45
- define_traffic_light :state, %w[green red], :label => :upcase
46
- TrafficLight.new(:state => :green).state.to_s.should == 'GREEN'
47
- TrafficLight.new(:state => :red).state.to_s.should == 'RED'
45
+ define_traffic_light :state, %w[green red], label: :upcase
46
+ TrafficLight.new(state: :green).state.to_s.should == 'GREEN'
47
+ TrafficLight.new(state: :red).state.to_s.should == 'RED'
48
48
  end
49
49
  end
50
-
50
+
51
51
  context "question methods" do
52
52
  before do
53
53
  define_traffic_light :state, %w[green red]
54
54
  end
55
-
55
+
56
56
  it "should provide question method" do
57
- TrafficLight.new(:state => :green).state.should be_green
58
- TrafficLight.new(:state => :green).state.should_not be_red
59
- TrafficLight.new(:state => :red).state.should_not be_green
60
- TrafficLight.new(:state => :red).state.should be_red
57
+ TrafficLight.new(state: :green).state.should be_green
58
+ TrafficLight.new(state: :green).state.should_not be_red
59
+ TrafficLight.new(state: :red).state.should_not be_green
60
+ TrafficLight.new(state: :red).state.should be_red
61
61
  end
62
-
62
+
63
63
  it "should raise error if tested with inexistant enum" do
64
- lambda { TrafficLight.new(:state => :green).state.blue? }.should raise_error(NameError)
64
+ lambda { TrafficLight.new(state: :green).state.blue? }.should raise_error(NameError)
65
65
  end
66
-
66
+
67
67
  it "block style should also provide question method" do
68
68
  define_model_class 'TrafficLight' do
69
69
  enum :state do
@@ -71,11 +71,11 @@ describe "Internal enumerations" do
71
71
  red
72
72
  end
73
73
  end
74
- TrafficLight.new(:state => :green).state.should be_green
75
- TrafficLight.new(:state => :green).state.should_not be_red
74
+ TrafficLight.new(state: :green).state.should be_green
75
+ TrafficLight.new(state: :green).state.should_not be_red
76
76
  end
77
77
  end
78
-
78
+
79
79
  it "should be instances of a new subclass of Enum" do
80
80
  TrafficLight.states.first.should be_a(TrafficLight::State)
81
81
  end
@@ -89,26 +89,26 @@ describe "External enumerations" do
89
89
  tx
90
90
  end
91
91
  end
92
-
92
+
93
93
  define_model_class 'Country' do
94
94
  enum :state
95
95
  end
96
-
96
+
97
97
  define_model_class 'TrafficLightState', 'ArEnums::Base' do
98
98
  enumeration do
99
- green :rgb => 0x0F0
100
- red :rgb => 0xF00
99
+ green rgb: 0x0F0
100
+ red rgb: 0xF00
101
101
  end
102
102
  end
103
-
103
+
104
104
  define_model_class 'TrafficLight' do
105
- enum :state, :class_name => 'TrafficLightState'
105
+ enum :state, class_name: 'TrafficLightState'
106
106
  end
107
107
  end
108
-
108
+
109
109
  context "enums creation" do
110
110
  it "should allow to define enumerations on it's own class" do
111
- TrafficLight.new(:state => :red).state.should be_enum_with(:name => 'red', :rgb => 0xF00, :id => 2)
111
+ TrafficLight.new(state: :red).state.should be_enum_with(name: 'red', rgb: 0xF00, id: 2)
112
112
  end
113
113
 
114
114
  it "should be posible to access all enums from withing the owner" do
@@ -118,34 +118,34 @@ describe "External enumerations" do
118
118
 
119
119
  it "should accept :class_name options to override de class of the external enum" do
120
120
  define_model_class 'TrafficLight' do
121
- enum :state_on_weekdays, :class_name => 'TrafficLightState'
122
- enum :state_on_weekends, :class_name => 'TrafficLightState'
121
+ enum :state_on_weekdays, class_name: 'TrafficLightState'
122
+ enum :state_on_weekends, class_name: 'TrafficLightState'
123
123
  end
124
124
  TrafficLight.state_on_weekdays.should equal(TrafficLightState.all)
125
125
  TrafficLight.state_on_weekends.should equal(TrafficLightState.all)
126
- end
127
-
126
+ end
127
+
128
128
  it "external enums should be instances of the subclass of Enum" do
129
129
  TrafficLightState.all.each { |s| s.should be_a(TrafficLightState) }
130
130
  end
131
-
131
+
132
132
  it "should be posible to define new methods in Enum subclass" do
133
133
  define_model_class 'State', 'ArEnums::Base' do
134
134
  enumeration do
135
- green :factor => 1
136
- red :factor => 2
135
+ green factor: 1
136
+ red factor: 2
137
137
  end
138
-
138
+
139
139
  def double_factor() factor * 2 end
140
- end
140
+ end
141
141
  State.all.map(&:double_factor).should == [2, 4]
142
- end
143
-
142
+ end
143
+
144
144
  it "should not define new constant form enum class" do
145
145
  define_model_class 'TrafficLight' do
146
- enum :estado, :class_name => 'TrafficLightState'
146
+ enum :estado, class_name: 'TrafficLightState'
147
147
  end
148
- expect { TrafficLight.const_get(:Estado) }.to raise_error NameError
149
- end
148
+ lambda { TrafficLight.const_get(:Estado) }.should raise_error NameError
149
+ end
150
150
  end
151
151
  end
@@ -7,7 +7,7 @@ describe "Enums creation styles" do
7
7
  add_option config, class_name: ArEnums::Base
8
8
  ArEnums::Factory.make_enums *config, &block
9
9
  end
10
-
10
+
11
11
  context "array of values style" do
12
12
  it "should generate ids" do
13
13
  enums = make_enums %w[red green blue]
@@ -15,23 +15,23 @@ describe "Enums creation styles" do
15
15
  enums[1].should be_enum_with(id: 2, name: 'green')
16
16
  enums[2].should be_enum_with(id: 3, name: 'blue')
17
17
  end
18
-
18
+
19
19
  it "default to_s should be name titleized" do
20
- make_enums(%w[green red]).map(&:to_s).should == %w[Green Red]
20
+ make_enums(%w[green red]).map(&:to_s).should == %w[Green Red]
21
21
  end
22
22
 
23
23
  it "should override default to_s" do
24
24
  make_enums(%w[green red], label: :upcase).map(&:to_s).should == %w[GREEN RED]
25
25
  end
26
26
  end
27
-
27
+
28
28
  context "array of hashes style" do
29
29
  it "should accept ids if provided" do
30
30
  enums = make_enums [{ id: 20, name: :red }, { id: 10, name: :green }]
31
31
  enums[0].should be_enum_with(id: 20, name: 'red')
32
32
  enums[1].should be_enum_with(id: 10, name: 'green')
33
33
  end
34
-
34
+
35
35
  it "should generate ids if not provided" do
36
36
  enums = make_enums [{ name: :red }, { name: :green }]
37
37
  enums[0].should be_enum_with(id: 1, name: 'red')
@@ -41,18 +41,18 @@ describe "Enums creation styles" do
41
41
  it "default to_s should be :desc column" do
42
42
  enums = make_enums [{ name: :red, desc: 'Rojo' }, { name: :green, desc: 'Verde' }]
43
43
  enums.map(&:to_s).should == %w[Rojo Verde]
44
- end
45
-
44
+ end
45
+
46
46
  it ":label options can be a method to call on name" do
47
47
  enums = make_enums [{ name: :red }, { name: :green }], label: :upcase
48
48
  enums.map(&:to_s).should == %w[RED GREEN]
49
- end
50
-
49
+ end
50
+
51
51
  it ":label option can be a enum column" do
52
52
  enums = make_enums [{ name: :red, title: 'Rojo' }, { name: :green, title: 'Verde' }], label: :title
53
53
  enums.map(&:to_s).should == %w[Rojo Verde]
54
- end
55
-
54
+ end
55
+
56
56
  it "should accept extra columns" do
57
57
  enums = make_enums [
58
58
  { name: :red, factor: 1.5, stop_traffic: true },
@@ -62,7 +62,7 @@ describe "Enums creation styles" do
62
62
  enums.map(&:stop_traffic).should == [true, false]
63
63
  end
64
64
  end
65
-
65
+
66
66
  context "block style" do
67
67
  it "can be created with a block" do
68
68
  enums = make_enums do
@@ -71,8 +71,8 @@ describe "Enums creation styles" do
71
71
  end
72
72
  enums[0].should be_enum_with(id: 1, name: 'red', rgb: 0xF00)
73
73
  enums[1].should be_enum_with(id: 2, name: 'green', rgb: 0x0F0)
74
- end
75
-
74
+ end
75
+
76
76
  it "should accept :label option" do
77
77
  enums = make_enums label: :title do
78
78
  red title: 'Rojo'
@@ -80,7 +80,7 @@ describe "Enums creation styles" do
80
80
  end
81
81
  enums.map(&:to_s).should == %w[Rojo Verde]
82
82
  end
83
-
83
+
84
84
  it "should accept extra columns" do
85
85
  enums = make_enums do
86
86
  red factor: 1.5
@@ -1,12 +1,15 @@
1
- require 'rspec'
2
1
  require 'ar-enums'
3
2
 
3
+ ActiveRecord::Migration.verbose = false
4
+
4
5
  RSpec.configure do |config|
6
+ config.expect_with(:rspec) { |c| c.syntax = :should }
7
+
5
8
  config.before :suite do
6
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
9
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
7
10
  load(File.dirname(__FILE__) + "/schema.rb")
8
11
  end
9
-
12
+
10
13
  def define_model_class(name = "TestClass", parent_class_name = "ActiveRecord::Base", &block)
11
14
  ActiveSupport::Dependencies.send :remove_const, name rescue nil
12
15
  eval("class #{name} < #{parent_class_name}; end", TOPLEVEL_BINDING)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar-enums
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emmanuel Nicolau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-29 00:00:00.000000000 Z
11
+ date: 2018-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -39,33 +39,33 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rb-fsevent
42
+ name: sqlite3
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 1.3.4
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 1.3.4
55
55
  - !ruby/object:Gem::Dependency
56
- name: sqlite3
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 1.3.4
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 1.3.4
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activerecord
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 3.1.0
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  description:
98
84
  email:
99
85
  - emmanicolau@gmail.com
@@ -101,15 +87,14 @@ executables: []
101
87
  extensions: []
102
88
  extra_rdoc_files: []
103
89
  files:
104
- - ".autotest"
105
90
  - ".gitignore"
106
- - ".rbenv-version"
107
91
  - ".rspec"
92
+ - ".ruby-version"
108
93
  - Gemfile
109
94
  - Gemfile.lock
110
95
  - Guardfile
111
96
  - LICENSE
112
- - README.rdoc
97
+ - README.md
113
98
  - Rakefile
114
99
  - ar_enums.gemspec
115
100
  - autotest/discover.rb
@@ -147,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
132
  version: '0'
148
133
  requirements: []
149
134
  rubyforge_project: ar-enums
150
- rubygems_version: 2.4.1
135
+ rubygems_version: 2.5.1
151
136
  signing_key:
152
137
  specification_version: 4
153
138
  summary: Provides a simple way for defining enumerations in ActiveRecord models
data/.autotest DELETED
@@ -1,2 +0,0 @@
1
- require 'autotest/growl'
2
- require 'autotest/fsevent'
@@ -1 +0,0 @@
1
- 2.1.0
@@ -1,122 +0,0 @@
1
- = ar-enums
2
-
3
- This is a simple solution for defining enumerations in your Rails models.
4
-
5
- == Description
6
-
7
- It provides two forms of enumerations:
8
- * Internal, i.e. defined within the owner of the enum, for the simple cases.
9
- * External, i.e. defined on it's own class, for the complex ones.
10
-
11
- In both cases the enum values are stored in-memory. Let's see some examples of both kinds.
12
-
13
- == Internal enumerations
14
-
15
- Can be defined in three flavours:
16
-
17
- === Array of values style
18
-
19
- This is the simplest and probably the most frecuent case:
20
-
21
- class TrafficLight < ActiveRecord::Base
22
- enum :state, %w[red green yellow]
23
- end
24
-
25
- tl = TrafficLight.new(:state => :green)
26
- tl.state # => #<TrafficLight::State @name="green", @id=2>
27
- tl.state_id # => 2
28
- tl.state.green? # => true
29
-
30
- As you can see each enum value is an instance of a dinamically generated class (which inherits from ArEnums::Base) and has an ordinal value, id, autogenerated staring on 1.
31
-
32
- The enumerations array is accessed with a class method:
33
-
34
- TrafficLight.states # => [#<TrafficLight::State @name="red", @id=1>, #<TrafficLight::State @name="green", @id=2>, ...]
35
-
36
- By default when <tt>#to_s</tt> is called on a Enum instance it returns the name titleized, but this behaviour can be overrided. See Displaying Enums section below.
37
-
38
- === Array of hashes style
39
-
40
- This allows you to define new columns in the Enum value. If the :id is not specified is generated for you.
41
-
42
- class TrafficLight < ActiveRecord::Base
43
- enum :state, [
44
- { :name => :red, :stop_traffic => true, :rgb => 0xF00 },
45
- { :name => :green, :stop_traffic => false, :rgb => 0x0F0 }
46
- ]
47
- end
48
-
49
- tl = TrafficLight.new(:state => :green)
50
- tl.state_id # => 2
51
- tl.state.stop_traffic # => false
52
- tl.state.rgb # => 0x0F0
53
-
54
- === Block style
55
-
56
- class TrafficLight < ActiveRecord::Base
57
- enum :state do
58
- red :stop_traffic => true, :rgb => 0xF00
59
- green :stop_traffic => false, :rgb => 0x0F0
60
- end
61
- end
62
-
63
- == External enumerations
64
-
65
- When you have shared enumerations or just don't want to clutter the owner model with enums definitions,
66
- the enumeration can be on it's own class, as the State enum in the following example:
67
-
68
- class TrafficLight < ActiveRecord::Base
69
- enum :state
70
- end
71
-
72
- class State < ArEnums::Base
73
- enumeration do
74
- red :stop_traffic => true, :rgb => 0xF00, :desc => 'Rojo'
75
- green :stop_traffic => false, :rgb => 0x0F0, :desc => 'Verde'
76
- end
77
- end
78
-
79
- State[:red] # => #<State @name="red", @id=1, ...>
80
- State[:red].to_s # => "Rojo"
81
-
82
- Note the block style sintax is exactly the same as in the internal enumerations. In fact any of the 3 styles mencioned above can be used on external enumerations.
83
-
84
- Also note the <tt>#to_s</tt> by default return the value of the <tt>:desc</tt> column. Of course you can override the <tt>#to_s</tt> method as usual.
85
-
86
- Then you can access the enumerations collection from both places:
87
-
88
- TrafficLight.states # => [#<State @name="red", @id=1, ...>, #<State @name="green", @id=2, ...>]
89
- States.all # => [#<State @name="red", @id=1, ...>, #<State @name="green", @id=2, ...>]
90
-
91
- The <tt>enum</tt> method accept a <tt>:class_method</tt> option similar to the one in <tt>belongs_to</tt> and others to specify the class of the enum.
92
-
93
- == Displaying Enums
94
-
95
- In the array of values style the default is the name titleized but you can pass a <tt>:label</tt> options to override:
96
-
97
- class TrafficLight < ActiveRecord::Base
98
- enum :state, %w[red green yellow], :label => :upcase
99
- end
100
-
101
- TrafficLight.states.map(&:to_s) # => ["RED", "GREEN", "YELLOW"]
102
-
103
- If you use the block o array of hashes sintax and add a <tt>:desc</tt> column it will be used as <tt>#to_s</tt>, unless a <tt>:label</tt> option is passed.
104
-
105
- == TODO
106
-
107
- * Remove the dependency with ActiveRecord so it can be used outside Rails.
108
- * Allow to store enums in the database.
109
-
110
- == Note on Patches/Pull Requests
111
-
112
- * Fork the project.
113
- * Make your feature addition or bug fix.
114
- * Add tests for it. This is important so I don't break it in a
115
- future version unintentionally.
116
- * Commit, do not mess with rakefile, version, or history.
117
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
118
- * Send me a pull request. Bonus points for topic branches.
119
-
120
- == Copyright
121
-
122
- Copyright (c) 2010 Emmanuel Nicolau. See LICENSE for details.