selections 0.1.13 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ ## 0.1.14
2
+ * https://github.com/nigelr/selections/issues/7 - add selection items as booleans method names to attached model
3
+
1
4
  ## 0.1.13
2
5
 
3
6
  * https://github.com/nigelr/selections/issues/4 - selections-4 create selection Management scaffold generator
data/README.md CHANGED
@@ -10,6 +10,7 @@ Selection list management and form and view helpers.
10
10
  - f.selections :priorities # dropdowns
11
11
  - f.radios :priorities # radio buttons
12
12
  * Model helpers for joining tables ( eg. belongs_to_selection :priority )
13
+ * Matchers eg. @ticket.priority_high?
13
14
  * Handling of archived items ( displaying if selected only )
14
15
  * Ordering of lists based on alpha or numbered
15
16
  * Default item handling
@@ -44,19 +45,17 @@ can change the name), and should be generated such as:
44
45
 
45
46
  ```ruby
46
47
  rails generate model Selection name parent_id:integer system_code position_value:integer is_default:boolean is_system:boolean archived_at:datetime
47
- ```
48
48
 
49
- ### Selection Model
50
- And next, edit this class to look like:
51
49
 
52
- ```ruby
53
50
  class Selection < ActiveRecord::Base
54
51
  selectable
55
52
  end
56
53
  ```
57
54
 
55
+ ## Selections
56
+
58
57
  Selections table can contain one or many lists, it uses the acts_as_tree so each root is a new list
59
- meta example: (see below for example YAML file).
58
+ meta example: (see below for example YML file).
60
59
 
61
60
  * priority
62
61
  - high
@@ -180,6 +179,20 @@ eg: show.html.erb
180
179
  </p>
181
180
  ```
182
181
 
182
+ ## Matchers
183
+
184
+ Selections supports lookup using the boolean ? method, as an example:
185
+
186
+ instead of needing to do
187
+ ```ruby
188
+ if @ticket.priority == Selection.ticket_priority_high
189
+ ```
190
+ you can check directly on the instance:
191
+ ```ruby
192
+ if @ticket.priority_high?
193
+ ```
194
+ Thanks to @mattconnolly
195
+
183
196
  ## Automatic Features
184
197
  #### Include Blank
185
198
 
@@ -3,13 +3,42 @@ module Selections
3
3
 
4
4
  # Helper for belongs_to and accepts all the standard rails options
5
5
  #
6
- #Example
7
- # belongs_to_selection :priority
6
+ # Example
7
+ # class Thing < ActiveRecord::Base
8
+ # belongs_to_selection :priority
8
9
  #
9
10
  # by default adds - class_name: "Selection"
10
-
11
+ #
12
+ # This macro also adds a number of methods onto the class if there is a selection
13
+ # named as the class underscore name (eg: "thing_priority"), then methods are created
14
+ # for all of the selection values under that parent. For example:
15
+ #
16
+ # thing = Thing.find(x)
17
+ # thing.priority = Selection.thing_priority_high
18
+ # thing.priority_high? #=> true
19
+ # thing.priority_low? #=> false
20
+ #
21
+ # thing.priority_high? is equivalent to thing.priority == Selection.thing_priority_high
22
+ # except that the id of the selection is cached at the time the class is loaded.
23
+ #
24
+ # Note that this is only appropriate to use for system selection values that are known
25
+ # at development time, and not to values that the users can edit in the live system.
11
26
  def belongs_to_selection(target, options={})
12
27
  belongs_to target, options.merge(:class_name => "Selection")
28
+
29
+ prefix = self.name.downcase
30
+ parent = Selection.where(system_code: "#{prefix}_#{target}").first
31
+ if parent
32
+ target_id = "#{target}_id".to_sym
33
+ parent.children.each do |s|
34
+ method_name = "#{s.system_code.sub("#{prefix}_", '')}?".to_sym
35
+ class_eval do
36
+ define_method method_name do
37
+ send(target_id) == s.id
38
+ end
39
+ end
40
+ end
41
+ end
13
42
  end
14
43
 
15
44
  ActiveSupport.on_load :active_record do
@@ -17,4 +46,4 @@ module Selections
17
46
  end
18
47
 
19
48
  end
20
- end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module Selections
2
- VERSION = '0.1.13'
2
+ VERSION = '0.1.14'
3
3
  end
@@ -34,5 +34,5 @@ Gem::Specification.new do |gem|
34
34
  gem.add_development_dependency 'rspec'
35
35
  gem.add_development_dependency 'sqlite3'
36
36
  gem.add_development_dependency 'nokogiri'
37
-
37
+ gem.add_development_dependency "shoulda-matchers", "~> 2.4.0"
38
38
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+ require 'shoulda/matchers'
3
+
4
+ describe Selections::BelongsToSelection do
5
+
6
+ let(:parent) { Selection.create(name: "priority", system_code: "ticket_priority") }
7
+ let(:selection_1) { Selection.create(name: "low", parent_id: parent.id, system_code: "ticket_priority_low") }
8
+ let(:selection_2) { Selection.create(name: "medium", parent_id: parent.id, system_code: "ticket_priority_medium") }
9
+ let(:selection_3) { Selection.create(name: "high", parent_id: parent.id, system_code: "ticket_priority_high") }
10
+
11
+ let(:ticket_class) do
12
+ # create the priority records *before* using belongs_to_selection on the class.
13
+ selection_1; selection_2; selection_3
14
+
15
+ Class.new(ActiveRecord::Base) do
16
+ self.table_name = "tickets"
17
+
18
+ # anonymous class has no name, so fake the "Ticket" name
19
+ def self.name
20
+ "Ticket"
21
+ end
22
+
23
+ belongs_to_selection :priority
24
+ end
25
+ end
26
+
27
+ before do
28
+ ticket_class
29
+ end
30
+
31
+ context 'relationships' do
32
+ it "creates a belongs to relationship" do
33
+ expect(ticket_class.new).to belong_to(:priority)
34
+ end
35
+ end
36
+
37
+ context 'dynamic methods' do
38
+ subject { ticket_class.new }
39
+ %w{low medium high}.each do |p|
40
+ it "creates the method #priority_#{p}?" do
41
+ expect(subject.respond_to? "priority_#{p}?".to_sym).to be_true
42
+ end
43
+ end
44
+
45
+ context 'high priority' do
46
+ before { subject.priority = selection_3 }
47
+
48
+ it("#priority_high? is true") do
49
+ expect(subject.priority_high?).to be_true
50
+ end
51
+ it("#priority_medium? is false") do
52
+ expect(subject.priority_medium?).to be_false
53
+ end
54
+ it("#priority_low? is false") do
55
+ expect(subject.priority_low?).to be_false
56
+ end
57
+ end
58
+
59
+ context 'with no matching selections' do
60
+ it "does not create any methods" do
61
+ expect(ticket_class).not_to receive(:define_method).with { |x|
62
+ # the relationship will define this method, but there should be no others.
63
+ x != :autosave_associated_records_for_wrong
64
+ }
65
+ ticket_class.belongs_to_selection :wrong
66
+ end
67
+ end
68
+ end
69
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selections
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.13
4
+ version: 0.1.14
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: 2013-05-07 00:00:00.000000000 Z
12
+ date: 2014-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -123,6 +123,22 @@ dependencies:
123
123
  - - ! '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: shoulda-matchers
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 2.4.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 2.4.0
126
142
  description: ! "Selection list management and form and view helpers.\n Manages one
127
143
  table to hold all selections items/dropdown lists ( tree ).\n Dynamic lookup to
128
144
  find parent or children ( eg. Selection.priorities ).\n Form helper to display lists
@@ -141,7 +157,6 @@ files:
141
157
  - README.md
142
158
  - Rakefile
143
159
  - lib/generators/selections_scaffold/selections_scaffold_generator.rb
144
- - lib/generators/selections_scaffold/templates/.DS_Store
145
160
  - lib/generators/selections_scaffold/templates/_form.html.haml
146
161
  - lib/generators/selections_scaffold/templates/create_selections.rb
147
162
  - lib/generators/selections_scaffold/templates/edit.html.erb
@@ -162,6 +177,7 @@ files:
162
177
  - lib/selections/selectable.rb
163
178
  - lib/selections/version.rb
164
179
  - selections.gemspec
180
+ - spec/selections/belongs_to_selection_spec.rb
165
181
  - spec/selections/selectable_spec.rb
166
182
  - spec/selections/selections_tag_spec.rb
167
183
  - spec/spec_helper.rb
@@ -193,6 +209,7 @@ summary: Selection list management and form and view helpers. Manages one table
193
209
  or children ( eg. Selection.priorities ). Form helper to display lists ( eg. f.selections
194
210
  :priorities ). Handling of archived items ( displaying if selected only ).
195
211
  test_files:
212
+ - spec/selections/belongs_to_selection_spec.rb
196
213
  - spec/selections/selectable_spec.rb
197
214
  - spec/selections/selections_tag_spec.rb
198
215
  - spec/spec_helper.rb