enumerations 1.1.0 → 1.3.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0301fc3454228a9bfb34210934af6e60396179b4
4
+ data.tar.gz: 76ea564324b2e3e79565009e6ae2182a56d84a84
5
+ SHA512:
6
+ metadata.gz: 8c9a14f99e311b3e65a41bb9d03cee5788b288352270f3cbbc0b5c19b2dd4e823573613267d03c73a239a6c5b9039d2c10ccce9c4e2326e9e9f4b27427486ae7
7
+ data.tar.gz: aeff9a7fcf7ce2177831dadc13eaf940b534112a31fe51e0f2167cf31d57acf3d85ae3c409b3b5c0e670e893707216d8b85e2c52b65e7cd20b5cec29b413223b
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  .DS_Store
2
+ *.gem
3
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.3.1
5
+ script: rake
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'rake'
2
2
  require 'rake/testtask'
3
+ require 'bundler/gem_tasks'
3
4
 
4
5
  desc 'Default: run unit tests.'
5
- task :default => :test
6
+ task default: :test
6
7
 
7
8
  desc 'Run unit tests.'
8
9
  Rake::TestTask.new(:test) do |t|
data/Readme.md CHANGED
@@ -1,73 +1,128 @@
1
1
  Enumerations
2
- ==========
2
+ ============
3
3
 
4
4
  Rails plugin for enumerations in ActiveRecord models.
5
5
 
6
- Install
7
- =======
6
+ [![Build Status](https://travis-ci.org/infinum/enumerations.svg?branch=master)](https://travis-ci.org/infinum/enumerations)
8
7
 
9
- If you are using Bundler (and you should be), just add it as a gem.
8
+ Installation
9
+ ============
10
10
 
11
- gem 'enumerations'
11
+ Inside your `Gemfile` add the following:
12
12
 
13
- If not, then install it as a plugin.
14
-
15
- rails plugin install git://github.com/infinum/enumerations.git
13
+ ```ruby
14
+ gem 'enumerations'
15
+ ```
16
16
 
17
17
  Usage
18
18
  =====
19
19
 
20
- Create a model for your enumerations
20
+ Create a model for your enumerations:
21
21
 
22
- class Status < Enumeration::Base
23
- values :draft => {:id => 1, :name => 'Draft'},
24
- :review_pending => {:id => 2, :name => 'Review pending'},
25
- :published => {:id => 3, :name => 'Published'}
26
- end
22
+ ```ruby
23
+ class Status < Enumeration::Base
24
+ values draft: { id: 1, name: 'Draft' },
25
+ review_pending: { id: 2, name: 'Review pending' },
26
+ published: { id: 3, name: 'Published' }
27
+ end
28
+ ```
27
29
 
28
- Include enumerations for integer fields in other models
30
+ Or you can use `value` method for defining your enumerations:
29
31
 
30
- class Post < ActiveRecord::Base
31
- enumeration :status
32
- validates_presence_of :body, :title, :status_id
33
- end
32
+ ```ruby
33
+ class Status < Enumeration::Base
34
+ value :draft, id: 1, name: 'Draft'
35
+ value :review_pending, id: 2, name: 'Review pending'
36
+ value :published, id: 3, name: 'Published'
37
+ end
38
+ ```
34
39
 
35
- Set enumerations, find enumerations by symbol
40
+ Include enumerations for integer fields in other models:
36
41
 
37
- @post = Post.first
38
- @post.status = Status.find(:draft)
39
- @post.save
42
+ ```ruby
43
+ class Post < ActiveRecord::Base
44
+ enumeration :status
45
+ validates :status_id, presence: true
46
+ end
47
+ ```
40
48
 
41
- Find enumerations by id
49
+ You can pass attributes to specify which enumeratior and which column to use:
42
50
 
43
- @post.status = Status.find(2) # => Review pending
44
- @post.save
51
+ ```ruby
52
+ class Post < ActiveRecord::Base
53
+ enumeration :status,
54
+ foreign_key: :post_status_id, # specifies which column to use
55
+ class_name: Post::Status # specifies the class of the enumerator
56
+ validates :post_status_id, presence: true
57
+ end
58
+ ```
45
59
 
46
- Compare enumerations
60
+ Set enumerations, find enumerations by `symbol`:
47
61
 
48
- @post.status == :published # => true
49
- @post.status == 3 # => true
50
- @post.status == Status.find(:published) # => true
51
- @post.status.published? # => true
62
+ ```ruby
63
+ @post = Post.first
64
+ @post.status = Status.find(:draft)
65
+ @post.save
66
+ ```
52
67
 
53
- Get all enumerations
68
+ Or you can set enumerations on this way:
54
69
 
55
- Status.all
70
+ ```ruby
71
+ @post.status = Status.draft
72
+ ```
56
73
 
57
- Use in forms
74
+ Find enumerations by `id`:
58
75
 
59
- %p
60
- = f.label :status_id
61
- %br
62
- = f.collection_select :status_id, Status.all, :id, :name
76
+ ```ruby
77
+ @post.status = Status.find(2) # => Review pending
78
+ @post.save
79
+ ```
63
80
 
64
- TODO
65
- ====
81
+ Compare enumerations:
66
82
 
67
- * support for object values (not just symbols and strings)
83
+ ```ruby
84
+ @post.status == :published # => true
85
+ @post.status == 3 # => true
86
+ @post.status == Status.find(:published) # => true
87
+ @post.status.published? # => true
88
+ ```
89
+
90
+ Get all enumerations:
91
+
92
+ ```ruby
93
+ Status.all
94
+ ```
95
+
96
+ Use in forms:
97
+
98
+ ```ruby
99
+ %p
100
+ = f.label :status_id
101
+ %br
102
+ = f.collection_select :status_id, Status.all, :id, :name
103
+ ```
104
+
105
+ Advance Usage
106
+ =====
107
+
108
+ Except `id` and `name` you can specify other attributes to your enumerations:
109
+
110
+ ```ruby
111
+ class Status < Enumeration::Base
112
+ value :draft, id: 1, name: 'Draft'
113
+ value :review_pending, id: 2, name: 'Review pending', description: 'Some description...'
114
+ value :published, id: 3, name: 'Published'
115
+ end
116
+ ```
117
+
118
+ Every enumeration has `id`, `name` and `description` methods. If you call method that is not in attribute list for enumeration, it will return `nil`.
119
+
120
+ ```ruby
121
+ Status.review_pending.description # => 'Some description...'
122
+ Status.draft.description # => nil
123
+ ```
68
124
 
69
125
  Author
70
126
  ======
71
127
 
72
- Copyright (c) 2010 Tomislav Car, Infinum
73
-
128
+ Copyright © 2010 Tomislav Car, Infinum Ltd.
data/enumerations.gemspec CHANGED
@@ -1,16 +1,19 @@
1
+ require File.expand_path('../lib/enumerations/version', __FILE__)
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = 'enumerations'
3
- s.version = '1.1.0'
5
+ s.version = Enumeration::VERSION
4
6
  s.date = '2010-08-20'
5
7
  s.summary = "Enumerations for ActiveRecord!"
6
- s.description = "Extends ActiveRecord with enumeration capabilites."
7
- s.authors = ["Tomislav Car", "Nikica Jokic", "Nikola Santic"]
8
- s.email = ["tomislav@infinum.hr", "nikica.jokic@infinum.hr", "nikola.santic@infinum.hr"]
8
+ s.description = 'Extends ActiveRecord with enumeration capabilites.'
9
+ s.authors = ['Tomislav Car', 'Nikica Jokic', 'Nikola Santic']
10
+ s.email = ['tomislav@infinum.hr', 'nikica.jokic@infinum.hr', 'nikola.santic@infinum.hr']
9
11
  s.homepage = 'https://github.com/infinum/enumerations'
10
-
12
+
11
13
  s.add_dependency 'activerecord'
12
14
  s.add_dependency 'activesupport'
13
-
15
+ s.add_development_dependency 'pry-byebug'
16
+
14
17
  s.files = `git ls-files`.split("\n")
15
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
19
  end
data/lib/enumerations.rb CHANGED
@@ -1,132 +1,96 @@
1
- require 'active_support/core_ext/class/attribute.rb'
2
- require 'active_support/core_ext/string/inflections.rb'
1
+ require 'active_support'
2
+ require 'active_support/concern'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/string/inflections'
3
5
 
6
+ require 'enumerations/version'
7
+ require 'enumerations/base'
8
+ require 'enumerations/reflection'
9
+
10
+ # TODO: rename to Enumeration(s) in a major version change
4
11
  module Enumeration
5
- VERSION = "1.1"
6
-
7
- def self.included(receiver)
8
- receiver.extend ClassMethods
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ class_attribute :_enumerations
16
+ self._enumerations = []
9
17
  end
10
-
18
+
11
19
  module ClassMethods
12
- # create an enumeration for the symbol <tt>name</tt>. Options include <tt>foreign key</tt> attribute and Class name
20
+ # Create an enumeration for the symbol <tt>name</tt>.
21
+ # Options include <tt>foreign_key</tt> attribute and <tt>class_name</tt>
22
+ #
23
+ # Example:
24
+ #
25
+ # class User < ActiveRecord::Base
26
+ # enumeration :role
27
+ # end
28
+ #
29
+ # user.role_id = 1
30
+ # user.role => #<Enumeration::Value:0x007fff45d7ec30 @base=Role, @symbol=:admin...>
31
+ #
32
+ # user.role = Role.staff
33
+ # user.role_id => 2
34
+ #
35
+ # TODO: add documentation for foreign_key and class_name
13
36
  def enumeration(name, options = {})
14
37
  options[:foreign_key] ||= "#{name}_id".to_sym
15
38
  options[:class_name] ||= name.to_s.camelize
16
-
17
- # getter for belongs_to
18
- define_method name do
19
- options[:class_name].constantize.find(send(options[:foreign_key]))
20
- end
21
-
22
- # setter for belongs_to
23
- define_method "#{name}=" do |other|
24
- send("#{options[:foreign_key]}=", other.id)
25
- end
26
-
27
- # store a list of used enumerations
28
- @_all_enumerations ||= []
29
- @_all_enumerations << EnumerationReflection.new(name, options)
39
+
40
+ add_enumeration(name, options)
30
41
  end
31
42
 
32
- # output all the enumerations that this model has defined
43
+ # Output all the enumerations that this model has defined
44
+ # Returns an array of Reflection objects for all the
45
+ # enumerations in the class.
46
+ #
47
+ # Example:
48
+ #
49
+ # User.reflect_on_all_enumerations => # [
50
+ # #<Enumeration::Reflection:0x007fe894724320 @name=:role...>,
51
+ # #<Enumeration::Reflection:0x007fe89471d020 @name=:status...>]
52
+ #
33
53
  def reflect_on_all_enumerations
34
- @_all_enumerations
35
- end
36
- end
37
-
38
- class EnumerationReflection < Struct.new(:name, :options)
39
- def class_name
40
- options[:class_name]
41
- end
42
-
43
- def foreign_key
44
- options[:foreign_key]
54
+ _enumerations
45
55
  end
46
- end
47
-
48
- # used as a base class for enumeration classes
49
- class Base < Struct.new(:id, :name, :symbol)
50
- class_attribute :all, :id_index, :symbol_index
51
-
52
- def singleton_class
53
- class << self
54
- self
55
- end
56
- end
57
-
58
- def self.values(values)
59
- # all values
60
- self.all = []
61
- # for id based lookup
62
- self.id_index = {}
63
- # for symbol based lookup
64
- self.symbol_index = {}
65
-
66
- values.each_pair do |symbol, attributes|
67
- attributes[:name] ||= symbol.to_s.humanize
68
- object = self.new(attributes[:id], attributes[:name], symbol)
69
56
 
70
- self.singleton_class.send(:define_method, symbol) do
71
- object
72
- end
73
-
74
- raise "Duplicate id #{attributes[:id]}" if self.id_index[attributes[:id]]
75
- raise "Duplicate symbol #{symbol}" if self.symbol_index[symbol]
76
-
77
- self.id_index[attributes[:id]] = object
78
- self.symbol_index[symbol] = object
79
- self.all << object
80
- end
81
- end
82
-
83
- # lookup a specific enum
84
- def self.find(id)
85
- if id.is_a?(Fixnum)
86
- self.id_index[id]
87
- elsif id.is_a?(Symbol) || id.is_a?(String)
88
- self.symbol_index[id.to_sym]
89
- end
90
- end
91
-
92
- # FIXME for some reason this doesn't work for case..when expressions
93
- def ==(object)
94
- if object.is_a?(Fixnum)
95
- object == self.id
96
- elsif object.is_a?(Symbol)
97
- object == self.symbol
98
- elsif object.is_a?(self.class)
99
- object.id == self.id
57
+ private
58
+
59
+ def add_enumeration(name, options)
60
+ # Getter for belongs_to
61
+ #
62
+ # Example:
63
+ #
64
+ # user.role_id = 1
65
+ # user.role => #<Enumeration::Value:0x007fff45d7ec30 @base=Role, @symbol=:admin...>
66
+ #
67
+ define_method name do
68
+ enumerator_class = if options[:class_name].is_a?(Class)
69
+ options[:class_name]
70
+ else
71
+ options[:class_name].constantize
72
+ end
73
+
74
+ enumerator_class.find(send(options[:foreign_key]))
100
75
  end
101
- end
102
-
103
- # TODO alias method??
104
- def to_s
105
- name
106
- end
107
-
108
- def to_i
109
- id
110
- end
111
-
112
- def to_sym
113
- symbol
114
- end
115
-
116
- def to_param
117
- id
118
- end
119
-
120
- def method_missing(method_name, *args)
121
- symbol = method_name.to_s.gsub(/[?]$/, '')
122
- if self.class.find(symbol) && method_name =~ /[?]$/
123
- self.symbol == symbol.to_sym
124
- else
125
- super(method_name, args)
76
+
77
+ # Setter for belongs_to
78
+ #
79
+ # Example:
80
+ #
81
+ # user.role = Role.admin
82
+ # user.role_id => 1
83
+ #
84
+ define_method "#{name}=" do |other|
85
+ send("#{options[:foreign_key]}=", other.id)
126
86
  end
87
+
88
+ self._enumerations += [Reflection.new(name, options)]
127
89
  end
128
90
  end
129
91
  end
130
92
 
131
93
  # Extend ActiveRecord with Enumeration capabilites
132
- ActiveRecord::Base.send(:include, Enumeration) if defined? ActiveRecord
94
+ ActiveSupport.on_load(:active_record) do
95
+ include Enumeration
96
+ end
@@ -0,0 +1,187 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'active_support/core_ext/string/inflections'
3
+
4
+ module Enumeration
5
+ class Base
6
+ class_attribute :_values, :_symbol_index
7
+ self._values = {}
8
+ self._symbol_index = {}
9
+
10
+ # Adding new value to enumeration
11
+ #
12
+ # Example:
13
+ #
14
+ # value :admin, id: 1, name: 'Admin', description: 'Some description...'
15
+ #
16
+ # Role.admin.id => # 1
17
+ # Role.find(:admin).name => # "Admin"
18
+ # Role.find(1).description => # "Some description..."
19
+ #
20
+ def self.value(symbol, attributes)
21
+ # TODO: make this errors better if needed
22
+ # TODO: test this errors
23
+ raise 'Enumeration id is required' if attributes[:id].nil?
24
+ raise "Duplicate symbol #{symbol}" if find(symbol)
25
+ raise "Duplicate id #{attributes[:id]}" if find(attributes[:id])
26
+
27
+ self._values = _values.merge(symbol => new(symbol, attributes))
28
+ self._symbol_index = _symbol_index.merge(symbol => attributes[:id])
29
+
30
+ # Adds name base finder methods
31
+ #
32
+ # Example:
33
+ #
34
+ # Role.admin => #<Enumeration::Value:0x007fff45d7ec30 @base=Role, @symbol=:admin...>
35
+ # Role.staff => #<Enumeration::Value:0x007f980e9cb0a0 @base=Role, @symbol=:staff...>
36
+ #
37
+ singleton_class.send(:define_method, symbol) do
38
+ find(symbol)
39
+ end
40
+ end
41
+
42
+ # Adding multiple values to enumeration
43
+ #
44
+ # Example:
45
+ #
46
+ # values admin: { id: 1, name: 'Admin' },
47
+ # manager: { id: 2, name: 'Manager' },
48
+ # staff: { id: 3, name: 'Staff', description: 'Some description...' }
49
+ #
50
+ # Role.admin.id => # 1
51
+ # Role.find(:manager).name => # "Manager"
52
+ # Role.find(3).description => # "Some description..."
53
+ #
54
+ def self.values(values)
55
+ values.each do |symbol, attributes|
56
+ value(symbol, attributes)
57
+ end
58
+ end
59
+
60
+ # Returns an array of all enumeration symbols
61
+ #
62
+ # Example:
63
+ #
64
+ # Role.symbols => # [:admin, :manager, :staff]
65
+ #
66
+ def self.symbols
67
+ _values.keys
68
+ end
69
+
70
+ # Returns an array of all enumeration values
71
+ #
72
+ # Example:
73
+ #
74
+ # Role.all => # [#<Enumeration::Value:0x007f8ed7f46100 @base=Role, @symbol=:admin...>,
75
+ # #<Enumeration::Value:0x007f8ed7f45de0 @base=Role, @symbol=:manager...>,
76
+ # #<Enumeration::Value:0x007f8ed7f45ae8 @base=Role, @symbol=:staff...>]
77
+ #
78
+ def self.all
79
+ _values.values
80
+ end
81
+
82
+ # Finds an enumeration by symbol, id or name
83
+ #
84
+ # Example:
85
+ #
86
+ # Role.find(:admin) => #<Enumeration::Value:0x007f8ed7f46100 @base=Role, @symbol=:admin...>
87
+ # Role.find(2) => #<Enumeration::Value:0x007f8ed7f45de0 @base=Role, @symbol=:manager...>
88
+ # Role.find('2') => #<Enumeration::Value:0x007f8ed7f45de0 @base=Role, @symbol=:manager...>
89
+ # Role.find('staff') => #<Enumeration::Value:0x007f8ed7f45ae8 @base=Role, @symbol=:staff...>
90
+ #
91
+ def self.find(key)
92
+ case key
93
+ when Symbol then find_by_key(key)
94
+ when String then find_by_key(key.to_sym) || find_by_id(key.to_i)
95
+ when Fixnum then find_by_id(key)
96
+ end
97
+ end
98
+
99
+ # Finds an enumeration by defined attribute. Simmilar to AcriveRecord::FinderMethods#find_by
100
+ #
101
+ # Example:
102
+ #
103
+ # Role.find_by(name: 'Admin') => #<Enumeration::Value:0x007f8ed7f46100 @base=Role, @symbol=:admin...>
104
+ #
105
+ def self.find_by(**args)
106
+ _values.values.find { |value| args.map { |k, v| value.send(k) == v }.all? }
107
+ end
108
+
109
+ def self.find_by_key(key)
110
+ _values[key]
111
+ end
112
+
113
+ def self.find_by_id(id)
114
+ _values[_symbol_index.key(id)]
115
+ end
116
+
117
+ def initialize(symbol, attributes)
118
+ @symbol = symbol
119
+ @attributes = attributes
120
+ create_instance_methods
121
+ end
122
+
123
+ attr_reader :symbol
124
+
125
+ def to_i
126
+ id
127
+ end
128
+
129
+ def to_s
130
+ name
131
+ end
132
+
133
+ def to_sym
134
+ @symbol
135
+ end
136
+
137
+ def to_param
138
+ id
139
+ end
140
+
141
+ # Comparison by id, symbol or object
142
+ #
143
+ # Example:
144
+ #
145
+ # Role.admin == 1 => true
146
+ # Role.admin == :admin => true
147
+ # Role.admin == Role.admin => true
148
+ # Role.admin == 2 => false
149
+ # Role.admin == :staff => false
150
+ # Role.admin == Role.staff => false
151
+ #
152
+ # TODO: test if case..when is working with this
153
+ def ==(other)
154
+ case other
155
+ when Fixnum then other == id
156
+ when Symbol then other == @symbol
157
+ else super
158
+ end
159
+ end
160
+
161
+ private
162
+
163
+ # Getters for all attributes
164
+ #
165
+ # Example:
166
+ #
167
+ # Role.admin => #<Enumeration::Value:0x007fff45d7ec30 @base=Role, @symbol=:admin,
168
+ # @attributes={:id=>1, :name=>"Admin", :description=>"Some description..."}>
169
+ # user.role.id => # 1
170
+ # user.role.name => # "Admin"
171
+ # user.role.description => # "Some description..."
172
+ # user.role.admin? => # true
173
+ # user.role.staff? => # false
174
+ #
175
+ def create_instance_methods
176
+ @attributes.each do |key, _|
177
+ self.class.send :define_method, key do
178
+ @attributes[key]
179
+ end
180
+ end
181
+
182
+ self.class.send :define_method, "#{@symbol}?" do
183
+ __callee__[0..-2].to_sym == @symbol
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,18 @@
1
+ module Enumeration
2
+ class Reflection
3
+ attr_reader :name
4
+
5
+ def initialize(name, options)
6
+ @name = name
7
+ @options = options
8
+ end
9
+
10
+ def class_name
11
+ @options[:class_name]
12
+ end
13
+
14
+ def foreign_key
15
+ @options[:foreign_key]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Enumeration
2
+ VERSION = '1.3.0'
3
+ end
data/test/base_test.rb ADDED
@@ -0,0 +1,101 @@
1
+ require_relative 'test_helper'
2
+
3
+ class BaseTest < Minitest::Test
4
+ def test_lookup_by_symbol
5
+ status = Status.find(:draft)
6
+
7
+ assert_equal :draft, status.symbol
8
+ end
9
+
10
+ def test_lookup_fail_by_symbol
11
+ status = Status.find(:draft)
12
+
13
+ refute_same :published, status.symbol
14
+ end
15
+
16
+ def test_find_by
17
+ status = Status.find_by(name: 'Draft')
18
+
19
+ assert_equal :draft, status.symbol
20
+ end
21
+
22
+ def test_fail_find_by
23
+ status = Status.find_by(name: 'Draft1')
24
+
25
+ assert_equal nil, status
26
+ end
27
+
28
+ def test_all
29
+ statuses = Status.all
30
+
31
+ assert_equal 5, statuses.size
32
+ assert_equal statuses.first, Status.draft
33
+ end
34
+
35
+ def test_duplicated_id
36
+ assert_raises 'Duplicate id 1' do
37
+ Class.new.values draft: { id: 1, name: 'Draft' },
38
+ test: { id: 1, name: 'Draft' }
39
+ end
40
+ end
41
+
42
+ def test_duplicated_symbol
43
+ assert_raises 'Duplicate symbol draft' do
44
+ obj = Class.new
45
+
46
+ obj.value :draft, id: 1, name: 'Draft'
47
+ obj.value :draft, id: 2, name: 'Draft Again'
48
+ end
49
+ end
50
+
51
+ def test_all_has_custom_attributes
52
+ statuses = Status.all
53
+
54
+ assert_silent do
55
+ statuses.map(&:visible)
56
+ statuses.map(&:deleted)
57
+ end
58
+ end
59
+
60
+ def test_with_defined_custom_attributes_visible
61
+ status = Status.find(:none)
62
+
63
+ assert_equal true, status.visible
64
+ end
65
+
66
+ def test_with_defined_custom_attributes_deleted
67
+ status = Status.find(:deleted)
68
+
69
+ assert_equal true, status.deleted
70
+ end
71
+
72
+ def test_without_defined_custom_attributes
73
+ status = Status.find(:draft)
74
+
75
+ assert_equal nil, status.visible
76
+ end
77
+
78
+ def test_equal_by_id
79
+ status = Status.find(:draft)
80
+
81
+ assert_equal true, status == 1
82
+ end
83
+
84
+ def test_equal_by_symbol
85
+ status = Status.draft
86
+
87
+ assert_equal true, status == :draft
88
+ end
89
+
90
+ def test_equal_by_enumeration
91
+ status = Status.draft
92
+
93
+ assert_equal true, status == Status.draft
94
+ end
95
+
96
+ def test_not_equal_by_enumeration
97
+ status = Status.draft
98
+
99
+ assert_equal false, status == Status.published
100
+ end
101
+ end
@@ -1,61 +1,41 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
2
 
3
- class EnumerationsTest < Test::Unit::TestCase
4
-
5
- def test_lookup_by_symbol
6
- status = Status.find(:draft)
7
-
8
- assert_equal :draft, status.symbol
9
- end
10
-
11
- def test_lookup_fail_by_symbol
12
- status = Status.find(:draft)
13
-
14
- assert_not_equal :published, status.symbol
15
- end
16
-
17
- def test_all
18
- statuses = Status.all
19
-
20
- assert_equal 3, statuses.size
21
- assert_equal statuses.first, Status.draft
22
- end
23
-
24
- def test_reflections
3
+ class EnumerationsTest < Minitest::Test
4
+ def test_reflect_on_all_enumerations
25
5
  enumerations = Post.reflect_on_all_enumerations
26
6
 
27
7
  assert_equal 2, enumerations.size
28
8
  assert_equal :status, enumerations.first.name
29
9
  assert_equal 'Status', enumerations.first.class_name
30
-
10
+
31
11
  assert_equal :some_other_status_id, enumerations[1].foreign_key
32
12
  end
33
-
13
+
34
14
  def test_model_enumeration_assignment
35
15
  p = Post.new
36
- p.status = Status.draft
37
-
38
- assert_equal "Draft", p.status.to_s
16
+ p.status = Status.draft
17
+
18
+ assert_equal 'Draft', p.status.to_s
39
19
  end
40
-
20
+
41
21
  def test_model_via_id_assignment
42
- p = Post.new
22
+ p = Post.new
43
23
  p.some_other_status_id = Status.published.id
44
-
45
- assert_equal "Published", p.different_status.to_s
24
+
25
+ assert_equal 'Published', p.different_status.to_s
46
26
  end
47
-
27
+
48
28
  def test_boolean_lookup
49
29
  p = Post.new
50
30
  p.status = Status.draft
51
-
31
+
52
32
  assert_equal true, p.status.draft?
53
33
  end
54
-
34
+
55
35
  def test_false_boolean_lookup
56
36
  p = Post.new
57
37
  p.status = Status.draft
58
-
38
+
59
39
  assert_equal false, p.status.published?
60
40
  end
61
- end
41
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'test_helper'
2
+
3
+ class ReflectionTest < Minitest::Test
4
+ def test_reflections
5
+ reflection = Enumeration::Reflection.new(:role, class_name: 'Role', foreign_key: :role_id)
6
+
7
+ assert_equal :role, reflection.name
8
+ assert_equal 'Role', reflection.class_name
9
+ assert_equal :role_id, reflection.foreign_key
10
+ end
11
+ end
data/test/test_helper.rb CHANGED
@@ -1,24 +1,25 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../lib')
1
+ # TODO: improve tests
2
+ require 'minitest/autorun'
3
+ require 'enumerations'
4
+ require 'pry'
2
5
 
3
- #require 'rubygems' # not sure if i need this
4
-
5
- require 'test/unit'
6
- require 'enumerations'
7
-
8
- # faking activerecord
6
+ # Faking ActiveRecord
9
7
  class MockActiveRecordBase
10
8
  include Enumeration
11
9
  end
12
10
 
13
11
  class Status < Enumeration::Base
14
- values :draft => {:id => 1, :name => 'Draft'},
15
- :review_pending => {:id => 2, :name => 'Review pending'},
16
- :published => {:id => 3, :name => 'Published'}
12
+ values draft: { id: 1, name: 'Draft' },
13
+ review_pending: { id: 2, name: 'Review pending' },
14
+ published: { id: 3, name: 'Published' }
15
+
16
+ value :none, id: 4, name: 'None', visible: true
17
+ value :deleted, id: 5, deleted: true
17
18
  end
18
19
 
19
20
  class Post < MockActiveRecordBase
20
21
  attr_accessor :status_id, :some_other_status_id
21
-
22
+
22
23
  enumeration :status
23
- enumeration :different_status, :foreign_key => :some_other_status_id, :class_name => 'Status'
24
- end
24
+ enumeration :different_status, foreign_key: :some_other_status_id, class_name: 'Status'
25
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'test_helper'
2
+
3
+ class VersionTest < Minitest::Test
4
+ def test_version
5
+ assert_equal '1.3.0', Enumeration::VERSION
6
+ end
7
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerations
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tomislav Car
@@ -11,30 +10,50 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2010-08-20 00:00:00.000000000Z
13
+ date: 2010-08-20 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: activerecord
18
- requirement: &70144752765260 !ruby/object:Gem::Requirement
19
- none: false
17
+ requirement: !ruby/object:Gem::Requirement
20
18
  requirements:
21
- - - ! '>='
19
+ - - ">="
22
20
  - !ruby/object:Gem::Version
23
21
  version: '0'
24
22
  type: :runtime
25
23
  prerelease: false
26
- version_requirements: *70144752765260
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
27
29
  - !ruby/object:Gem::Dependency
28
30
  name: activesupport
29
- requirement: &70144752764520 !ruby/object:Gem::Requirement
30
- none: false
31
+ requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
- - - ! '>='
33
+ - - ">="
33
34
  - !ruby/object:Gem::Version
34
35
  version: '0'
35
36
  type: :runtime
36
37
  prerelease: false
37
- version_requirements: *70144752764520
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: pry-byebug
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
38
57
  description: Extends ActiveRecord with enumeration capabilites.
39
58
  email:
40
59
  - tomislav@infinum.hr
@@ -44,37 +63,48 @@ executables: []
44
63
  extensions: []
45
64
  extra_rdoc_files: []
46
65
  files:
47
- - .gitignore
66
+ - ".gitignore"
67
+ - ".travis.yml"
68
+ - Gemfile
48
69
  - Rakefile
49
70
  - Readme.md
50
71
  - enumerations.gemspec
51
72
  - lib/enumerations.rb
73
+ - lib/enumerations/base.rb
74
+ - lib/enumerations/reflection.rb
75
+ - lib/enumerations/version.rb
76
+ - test/base_test.rb
52
77
  - test/enumerations_test.rb
78
+ - test/reflection_test.rb
53
79
  - test/test_helper.rb
80
+ - test/version_test.rb
54
81
  homepage: https://github.com/infinum/enumerations
55
82
  licenses: []
83
+ metadata: {}
56
84
  post_install_message:
57
85
  rdoc_options: []
58
86
  require_paths:
59
87
  - lib
60
88
  required_ruby_version: !ruby/object:Gem::Requirement
61
- none: false
62
89
  requirements:
63
- - - ! '>='
90
+ - - ">="
64
91
  - !ruby/object:Gem::Version
65
92
  version: '0'
66
93
  required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
94
  requirements:
69
- - - ! '>='
95
+ - - ">="
70
96
  - !ruby/object:Gem::Version
71
97
  version: '0'
72
98
  requirements: []
73
99
  rubyforge_project:
74
- rubygems_version: 1.8.10
100
+ rubygems_version: 2.5.1
75
101
  signing_key:
76
- specification_version: 3
102
+ specification_version: 4
77
103
  summary: Enumerations for ActiveRecord!
78
104
  test_files:
105
+ - test/base_test.rb
79
106
  - test/enumerations_test.rb
107
+ - test/reflection_test.rb
80
108
  - test/test_helper.rb
109
+ - test/version_test.rb
110
+ has_rdoc: