enumerize 0.3.0 → 0.4.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.
data/.travis.yml CHANGED
@@ -1,12 +1,15 @@
1
1
  language: ruby
2
+ services:
3
+ - mongodb
2
4
  before_install:
3
5
  - gem install bundler
4
6
  rvm:
5
- - 1.9.2
6
7
  - 1.9.3
7
- gemfile:
8
- - gemfiles/Gemfile-ar-3.1.x
9
- - Gemfile
8
+ - jruby-19mode
9
+ - rbx-19mode
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: jruby-19mode
10
13
  notifications:
11
14
  email:
12
15
  recipients:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.4.0 (September 6, 2012) ##
2
+
3
+ Legacy support was dropped. The following versions are supported:
4
+
5
+ * Ruby 1.9.3+ (including JRuby and Rubinius)
6
+ * Rails 3.2+
7
+ * Formtastic 2.2+
8
+ * SimpleForm 2+
9
+ * Mongoid 3+
10
+
11
+ ### enchancements
12
+ * Ability to define predicate methods on enumerized object. (by [@lest](https://github.com/lest))
13
+
1
14
  ## 0.3.0 (July 9, 2012) ##
2
15
 
3
16
  ### enhancements
data/Gemfile CHANGED
@@ -6,7 +6,8 @@ gem 'rake'
6
6
  gem 'minitest', '~> 3.1'
7
7
 
8
8
  gem 'activerecord', '~> 3.2.0'
9
- gem 'sqlite3'
9
+ gem 'sqlite3', :platform => [:ruby, :mswin, :mingw]
10
+ gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
10
11
 
11
12
  gem 'mongoid'
12
13
  gem 'simple_form'
data/README.md CHANGED
@@ -101,6 +101,39 @@ user.sex.male? #=> true
101
101
  user.sex.female? #=> false
102
102
  ```
103
103
 
104
+ Predicate methods:
105
+
106
+ ```ruby
107
+ class User
108
+ include Enumerize
109
+ enumerize :sex, in: %w(male female), predicates: true
110
+ end
111
+
112
+ user = User.new
113
+
114
+ user.male? # => false
115
+ user.female? # => false
116
+
117
+ user.sex = 'male'
118
+
119
+ user.male? # => true
120
+ user.female? # => false
121
+ ```
122
+
123
+ Using prefix:
124
+
125
+ ```ruby
126
+ class User
127
+ include Enumerize
128
+ enumerize :sex, in: %w(male female), predicates: { prefix: true }
129
+ end
130
+
131
+ user = User.new
132
+ user.sex = 'female'
133
+ user.sex_female? # => true
134
+ ```
135
+ Use `:only` and `:except` options to specify what values create predicate methods for.
136
+
104
137
  To make some attributes shared across different classes it's possible to define them in a separate module and then include it into classes:
105
138
 
106
139
  ```ruby
data/enumerize.gemspec CHANGED
@@ -15,5 +15,5 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Enumerize::VERSION
17
17
 
18
- gem.add_dependency('activesupport', '>= 3.1.3')
18
+ gem.add_dependency('activesupport', '>= 3.2')
19
19
  end
data/lib/enumerize.rb CHANGED
@@ -7,10 +7,13 @@ module Enumerize
7
7
  autoload :Value, 'enumerize/value'
8
8
  autoload :Base, 'enumerize/base'
9
9
  autoload :ActiveRecord, 'enumerize/activerecord'
10
+ autoload :Predicates, 'enumerize/predicates'
10
11
  autoload :ModuleAttributes, 'enumerize/module_attributes'
11
12
 
12
13
  def self.included(base)
13
14
  base.send :include, Enumerize::Base
15
+ base.extend Enumerize::Predicates
16
+
14
17
  if defined?(::ActiveRecord::Base) && base < ::ActiveRecord::Base
15
18
  base.extend Enumerize::ActiveRecord
16
19
  end
@@ -26,7 +26,7 @@ module Enumerize
26
26
  RUBY
27
27
 
28
28
  if respond_to?(:validates)
29
- validates name, :inclusion => {:in => enumerized_attributes[name].values.map(&:to_s), :allow_nil => true, :allow_blank => true}
29
+ validates name, :inclusion => { :in => enumerized_attributes[name].values, :allow_nil => true, :allow_blank => true }
30
30
  end
31
31
  end
32
32
 
@@ -60,8 +60,6 @@ module Enumerize
60
60
  def #{attr.name}
61
61
  if defined?(super)
62
62
  self.class.enumerized_attributes[:#{attr.name}].find_value(super)
63
- elsif respond_to?(:read_attribute, true)
64
- self.class.enumerized_attributes[:#{attr.name}].find_value(read_attribute(:#{attr.name}))
65
63
  else
66
64
  if defined?(@#{attr.name})
67
65
  self.class.enumerized_attributes[:#{attr.name}].find_value(@#{attr.name})
@@ -79,8 +77,6 @@ module Enumerize
79
77
 
80
78
  if defined?(super)
81
79
  super allowed_value_or_nil
82
- elsif respond_to?(:write_attribute, true)
83
- write_attribute :#{attr.name}, allowed_value_or_nil
84
80
  else
85
81
  @#{attr.name} = allowed_value_or_nil
86
82
  end
@@ -21,8 +21,4 @@ module Enumerize
21
21
  end
22
22
  end
23
23
 
24
- if defined? ::Formtastic::SemanticFormBuilder
25
- ::Formtastic::SemanticFormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
26
- else
27
- ::Formtastic::FormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
28
- end
24
+ ::Formtastic::FormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
@@ -0,0 +1,72 @@
1
+ module Enumerize
2
+ # Predicate methods.
3
+ #
4
+ # Basic usage:
5
+ #
6
+ # class User
7
+ # include Enumerize
8
+ # enumerize :sex, in: %w(male female), predicates: true
9
+ # end
10
+ #
11
+ # user = User.new
12
+ #
13
+ # user.male? # => false
14
+ # user.female? # => false
15
+ #
16
+ # user.sex = 'male'
17
+ #
18
+ # user.male? # => true
19
+ # user.female? # => false
20
+ #
21
+ # Using prefix:
22
+ #
23
+ # class User
24
+ # include Enumerize
25
+ # enumerize :sex, in: %w(male female), predicates: { prefix: true }
26
+ # end
27
+ #
28
+ # user = User.new
29
+ # user.sex = 'female'
30
+ # user.sex_female? # => true
31
+ #
32
+ # Use <tt>only</tt> and <tt>except</tt> options to specify what values create
33
+ # predicate methods for.
34
+ module Predicates
35
+ def enumerize(name, options={})
36
+ super
37
+
38
+ if options[:predicates]
39
+ Builder.new(enumerized_attributes[name], options[:predicates]).build(self)
40
+ end
41
+ end
42
+
43
+ class Builder
44
+ def initialize(attr, options)
45
+ @attr = attr
46
+ @options = options.is_a?(Hash) ? options : {}
47
+ end
48
+
49
+ def values
50
+ values = @attr.values
51
+
52
+ if @options[:only]
53
+ values &= Array(@options[:only]).map(&:to_s)
54
+ end
55
+
56
+ if @options[:except]
57
+ values -= Array(@options[:except]).map(&:to_s)
58
+ end
59
+
60
+ values
61
+ end
62
+
63
+ def names
64
+ values.map { |v| "#{v}?" }
65
+ end
66
+
67
+ def build(klass)
68
+ klass.delegate(*names, to: @attr.name, prefix: @options[:prefix], allow_nil: true)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -18,7 +18,7 @@ module Enumerize
18
18
  end
19
19
 
20
20
  def method_missing(method, *args, &block)
21
- if method[-1] == '?' && @attr.values.include?(method[0..-2])
21
+ if boolean_method?(method)
22
22
  define_query_methods
23
23
  send(method, *args, &block)
24
24
  else
@@ -26,13 +26,8 @@ module Enumerize
26
26
  end
27
27
  end
28
28
 
29
- def respond_to?(method, include_private=false)
30
- if super
31
- true
32
- elsif method[-1] == '?' && @attr.values.include?(method[0..-2])
33
- define_query_methods
34
- super
35
- end
29
+ def respond_to_missing?(method, include_private=false)
30
+ boolean_method?(method)
36
31
  end
37
32
 
38
33
  private
@@ -65,5 +60,9 @@ module Enumerize
65
60
  def i18n_suffix
66
61
  "#{@attr.i18n_suffix}." if @attr.i18n_suffix
67
62
  end
63
+
64
+ def boolean_method?(method)
65
+ method[-1] == '?' && @attr.values.include?(method[0..-2])
66
+ end
68
67
  end
69
68
  end
@@ -1,3 +1,3 @@
1
1
  module Enumerize
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1,13 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
- if defined? Formtastic::Helpers::InputHelper
4
- module Formtastic
5
- module Helpers
6
- module InputHelper
7
- remove_method :input_class
8
- def input_class(as)
9
- input_class_with_const_defined(as)
10
- end
3
+ module Formtastic
4
+ module Helpers
5
+ module InputHelper
6
+ remove_method :input_class
7
+ def input_class(as)
8
+ input_class_with_const_defined(as)
11
9
  end
12
10
  end
13
11
  end
@@ -15,11 +13,7 @@ end
15
13
 
16
14
  class FormtasticSpec < MiniTest::Spec
17
15
  include ViewTestHelper
18
- if defined? Formtastic::SemanticFormHelper
19
- include Formtastic::SemanticFormHelper
20
- else
21
- include Formtastic::Helpers::FormHelper
22
- end
16
+ include Formtastic::Helpers::FormHelper
23
17
 
24
18
  class User < Struct.new(:sex, :age)
25
19
  extend ActiveModel::Naming
data/test/mongoid_test.rb CHANGED
@@ -5,7 +5,7 @@ silence_warnings do
5
5
  end
6
6
 
7
7
  Mongoid.configure do |config|
8
- config.master = Mongo::Connection.new('127.0.0.1', 27017).db('enumerize-test-suite')
8
+ config.sessions = { :default => { :database => 'enumerize-test-suite', hosts: ['127.0.0.1:27017'] } }
9
9
  config.use_utc = true
10
10
  config.include_root_in_json = true
11
11
  end
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+ describe Enumerize::Predicates do
4
+ let(:klass) do
5
+ Class.new do
6
+ include Enumerize
7
+ end
8
+ end
9
+
10
+ let(:object) { klass.new }
11
+
12
+ it 'creates predicate methods' do
13
+ klass.enumerize(:foo, in: %w(a b), predicates: true)
14
+ object.must_respond_to :a?
15
+ object.must_respond_to :b?
16
+ end
17
+
18
+ it 'checks values' do
19
+ klass.enumerize(:foo, in: %w(a b), predicates: true)
20
+ object.foo = 'a'
21
+ object.a?.must_equal true
22
+ object.b?.must_equal false
23
+ end
24
+
25
+ it 'prefixes methods' do
26
+ klass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
27
+ object.wont_respond_to :a?
28
+ object.wont_respond_to :b?
29
+ object.must_respond_to :bar_a?
30
+ object.must_respond_to :bar_b?
31
+ end
32
+
33
+ it 'accepts only option' do
34
+ klass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
35
+ object.must_respond_to :a?
36
+ object.wont_respond_to :b?
37
+ end
38
+
39
+ it 'accepts except option' do
40
+ klass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
41
+ object.wont_respond_to :a?
42
+ object.must_respond_to :b?
43
+ end
44
+ end
data/test/value_test.rb CHANGED
@@ -42,6 +42,10 @@ describe Enumerize::Value do
42
42
  value.must_respond_to :other_value?
43
43
  end
44
44
 
45
+ it 'returns a method object' do
46
+ value.method(:test_value?).must_be_instance_of Method
47
+ end
48
+
45
49
  it "doesn't respond to a method for not existing value" do
46
50
  value.wont_respond_to :some_method?
47
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-09 00:00:00.000000000 Z
12
+ date: 2012-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 3.1.3
21
+ version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 3.1.3
29
+ version: '3.2'
30
30
  description: Enumerated attributes with I18n and ActiveRecord/Mongoid support
31
31
  email: team@brainspec.com
32
32
  executables: []
@@ -41,7 +41,6 @@ files:
41
41
  - README.md
42
42
  - Rakefile
43
43
  - enumerize.gemspec
44
- - gemfiles/Gemfile-ar-3.1.x
45
44
  - lib/enumerize.rb
46
45
  - lib/enumerize/activerecord.rb
47
46
  - lib/enumerize/attribute.rb
@@ -50,6 +49,7 @@ files:
50
49
  - lib/enumerize/hooks/formtastic.rb
51
50
  - lib/enumerize/hooks/simple_form.rb
52
51
  - lib/enumerize/module_attributes.rb
52
+ - lib/enumerize/predicates.rb
53
53
  - lib/enumerize/value.rb
54
54
  - lib/enumerize/version.rb
55
55
  - test/activerecord_test.rb
@@ -59,6 +59,7 @@ files:
59
59
  - test/formtastic_test.rb
60
60
  - test/module_attributes_test.rb
61
61
  - test/mongoid_test.rb
62
+ - test/predicates_test.rb
62
63
  - test/simple_form_test.rb
63
64
  - test/support/mock_controller.rb
64
65
  - test/support/view_test_helper.rb
@@ -78,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
78
79
  version: '0'
79
80
  segments:
80
81
  - 0
81
- hash: -3692164922268239392
82
+ hash: 1785538232513352876
82
83
  required_rubygems_version: !ruby/object:Gem::Requirement
83
84
  none: false
84
85
  requirements:
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
88
  version: '0'
88
89
  segments:
89
90
  - 0
90
- hash: -3692164922268239392
91
+ hash: 1785538232513352876
91
92
  requirements: []
92
93
  rubyforge_project:
93
94
  rubygems_version: 1.8.23
@@ -102,6 +103,7 @@ test_files:
102
103
  - test/formtastic_test.rb
103
104
  - test/module_attributes_test.rb
104
105
  - test/mongoid_test.rb
106
+ - test/predicates_test.rb
105
107
  - test/simple_form_test.rb
106
108
  - test/support/mock_controller.rb
107
109
  - test/support/view_test_helper.rb
@@ -1,13 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'enumerize', :path => '..'
4
-
5
- gem 'rake'
6
- gem 'minitest', '~> 3.0.0'
7
-
8
- gem 'activerecord', '~> 3.1.0'
9
- gem 'sqlite3'
10
-
11
- gem 'mongoid'
12
- gem 'simple_form', '~> 1.5.2'
13
- gem 'formtastic', '~> 1.2.4'