enumerize 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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'