lists_constant 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -12,7 +12,7 @@ out of your model classes.
12
12
 
13
13
  Add this line to your application's Gemfile:
14
14
 
15
- gem 'lists-constant'
15
+ gem 'lists_constant'
16
16
 
17
17
  And then execute:
18
18
 
@@ -20,7 +20,7 @@ And then execute:
20
20
 
21
21
  Or install it yourself as:
22
22
 
23
- $ gem install lists-constant
23
+ $ gem install lists_constant
24
24
 
25
25
  ## Usage
26
26
 
@@ -69,7 +69,7 @@ MyStateMachine::STEPS
69
69
  # => [:first, :second, :third]
70
70
  ```
71
71
 
72
- Using class-level localization:
72
+ Class-level localization:
73
73
 
74
74
  ``` ruby
75
75
  I18n.locale = :en
@@ -78,29 +78,30 @@ MyStateMachine.steps[:first]
78
78
 
79
79
  MyStateMachine.step_options
80
80
  # => {
81
- 'Initialize' => :first,
82
- 'Validate' => :second,
83
- 'Save' => :third
84
- }
81
+ # 'Initialize' => :first,
82
+ # 'Validate' => :second,
83
+ # 'Save' => :third
84
+ # }
85
85
 
86
86
  I18n.locale = :es
87
87
  MyStateMachine.steps[:first]
88
88
  # => 'Inicie'
89
89
  ```
90
90
 
91
- Instance query methods:
91
+ Class query method:
92
92
 
93
93
  ``` ruby
94
- msm = MyStateMachine.new(:second)
94
+ MyStateMachine.includes_step? :first
95
+ # => true
95
96
 
96
- msm.step_second?
97
+ MyStateMachine.includes_step? 'second'
97
98
  # => true
98
99
 
99
- msm.step_third?
100
+ MyStateMachine.includes_step? 'profit!'
100
101
  # => false
101
102
  ```
102
103
 
103
- Using instance-level localization:
104
+ Instance-level localization:
104
105
 
105
106
  ``` ruby
106
107
  I18n.locale = :en
@@ -112,6 +113,18 @@ msm.localized_step
112
113
  # => 'Valide'
113
114
  ```
114
115
 
116
+ Instance query methods:
117
+
118
+ ``` ruby
119
+ msm = MyStateMachine.new(:second)
120
+
121
+ msm.step_second?
122
+ # => true
123
+
124
+ msm.step_third?
125
+ # => false
126
+ ```
127
+
115
128
  Localization lookups may be scoped by assigning a namespace to
116
129
  the `ListsConstant` module:
117
130
 
@@ -0,0 +1,15 @@
1
+ module ListsConstant
2
+
3
+ module ClassMethods
4
+
5
+ def lists_constant *values
6
+ options = values.extract_options!
7
+ field = options[:as].to_s
8
+ raise ArgumentError.new('A constant name must be provided using the :as option') if field.empty?
9
+
10
+ const_set field.upcase, values.freeze
11
+ extend ListsConstant::Lookups::Class.new(field, values)
12
+ include ListsConstant::Lookups::Instance.new(field, values)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module ListsConstant
2
+
3
+ class Lookup
4
+
5
+ def initialize base, field
6
+ @base = base
7
+ @field = field
8
+ end
9
+
10
+ def lookup value
11
+ I18n.t(value, scope: "#{ListsConstant.namespace}#{@base.name.underscore}.#{@field}")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,51 @@
1
+ module ListsConstant
2
+
3
+ module Lookups
4
+
5
+ class Class < Module
6
+
7
+ def initialize field, values
8
+ @field = field
9
+ @values = values
10
+
11
+ super()
12
+ end
13
+
14
+ def extended base
15
+ add_lookup_query_method base
16
+ add_localized_hash_method base
17
+ add_inverted_hash_method base
18
+ end
19
+
20
+
21
+ private
22
+
23
+ def add_lookup_query_method base
24
+ field = @field
25
+
26
+ base.define_singleton_method "includes_#{field.singularize}?" do |value|
27
+ const_get(field.upcase).any? { |item| item.to_s == value.to_s }
28
+ end
29
+ end
30
+
31
+ def add_localized_hash_method base
32
+ field = @field
33
+
34
+ base.define_singleton_method field do
35
+ const_get(field.upcase).inject({}) do |hash, value|
36
+ hash[value] = ListsConstant::Lookup.new(self, field).lookup(value)
37
+ hash
38
+ end
39
+ end
40
+ end
41
+
42
+ def add_inverted_hash_method base
43
+ field = @field
44
+
45
+ base.define_singleton_method "#{field.singularize}_options" do
46
+ send(field).invert
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,44 @@
1
+ module ListsConstant
2
+
3
+ module Lookups
4
+
5
+ class Instance < Module
6
+
7
+ def initialize field, values
8
+ @field = field
9
+ @values = values
10
+
11
+ super()
12
+ end
13
+
14
+ def included base
15
+ add_localized_lookups base
16
+ add_query_methods base
17
+ end
18
+
19
+
20
+ private
21
+
22
+ def add_localized_lookups base
23
+ field = @field
24
+
25
+ base.send :define_method, "localized_#{field.singularize}" do
26
+ value = send(field.singularize)
27
+ return nil if value.nil? || value.empty?
28
+
29
+ ListsConstant::Lookup.new(self.class, field).lookup(value)
30
+ end
31
+ end
32
+
33
+ def add_query_methods base
34
+ field = @field
35
+
36
+ @values.each do |value|
37
+ base.send :define_method, "#{field.singularize}_#{value}?" do
38
+ send(field.singularize).to_s == value.to_s
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ require 'lists_constant/lookup'
2
+ require 'lists_constant/lookups/class'
3
+ require 'lists_constant/lookups/instance'
4
+
5
+ module ListsConstant::Lookups
6
+ end
@@ -1,3 +1,3 @@
1
1
  module ListsConstant
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,63 +1,20 @@
1
- require_relative './lists_constant/version'
2
1
  require 'active_support/inflector'
3
- require 'active_support/concern'
2
+
3
+ require 'lists_constant/version'
4
+ require 'lists_constant/lookups'
5
+ require 'lists_constant/class_methods'
4
6
 
5
7
  module ListsConstant
6
- extend ActiveSupport::Concern
7
8
 
8
9
  def self.namespace
9
10
  "#{@namespace}." if @namespace
10
11
  end
11
12
 
12
- def self.namespace=(namespace)
13
+ def self.namespace= namespace
13
14
  @namespace = namespace
14
15
  end
15
16
 
16
- module ClassMethods
17
-
18
- def lists_constant(*values)
19
- options = values.extract_options!
20
-
21
- field = options[:as].to_s
22
- raise ArgumentError.new('A constant name must be provided using the :as option') if field.empty?
23
-
24
- const_set(field.upcase, values.freeze)
25
- add_constant_list_getters(field)
26
- add_localized_lookups(field)
27
- add_query_methods(field, values)
28
- end
29
-
30
-
31
- private
32
-
33
- def add_constant_list_getters(field)
34
- define_singleton_method field do
35
- const_get(field.upcase).inject({}) do |hash, value|
36
- hash[value] = I18n.t(value, scope: "#{ListsConstant.namespace}#{name.underscore}.#{field}")
37
- hash
38
- end
39
- end
40
-
41
- define_singleton_method "#{field.singularize}_options" do
42
- send(field).invert
43
- end
44
- end
45
-
46
- def add_localized_lookups(field)
47
- define_method "localized_#{field.singularize}" do
48
- value = send(field.singularize)
49
- return nil if value.nil? || value.empty?
50
-
51
- I18n.t(value, scope: "#{ListsConstant.namespace}#{self.class.name.underscore}.#{field}")
52
- end
53
- end
54
-
55
- def add_query_methods(field, values)
56
- values.each do |value|
57
- define_method "#{field.singularize}_#{value}?" do
58
- send(field.singularize).to_s == value.to_s
59
- end
60
- end
61
- end
17
+ def self.included base
18
+ base.extend ClassMethods
62
19
  end
63
20
  end
@@ -0,0 +1,8 @@
1
+ class Lister
2
+
3
+ attr_accessor :color
4
+
5
+ def initialize(color)
6
+ @color = color
7
+ end
8
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe ListsConstant::ClassMethods do
4
+ before do
5
+ Lister.send :extend, ListsConstant::ClassMethods
6
+ end
7
+
8
+ it "requires a name for a list constant" do
9
+ assert_raises ArgumentError do
10
+ Lister.lists_constant :red, :blue, :yellow
11
+ end
12
+ end
13
+
14
+ describe "creating a constant list" do
15
+ before do
16
+ Lister.lists_constant :red,
17
+ :blue,
18
+ :yellow,
19
+ as: :colors
20
+ end
21
+
22
+ after do
23
+ Lister.send :remove_const, 'COLORS'
24
+ end
25
+
26
+ it "adds the constant to the includer" do
27
+ assert_equal Lister::COLORS, [:red, :blue, :yellow]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe ListsConstant::Lookup do
4
+ before do
5
+ @lookup = ListsConstant::Lookup.new(Lister, 'colors')
6
+ end
7
+
8
+ describe "given I18n translations" do
9
+ before do
10
+ @translations = {
11
+ red: 'rojo',
12
+ blue: 'azul',
13
+ yellow: 'amarillo'
14
+ }
15
+
16
+ I18n.backend.store_translations :es, {
17
+ lister: {
18
+ colors: @translations
19
+ }
20
+ }
21
+
22
+ I18n.locale = :es
23
+ end
24
+
25
+ it "generates a hash of the localized names with their values" do
26
+ assert_equal @lookup.lookup(:red), @translations[:red]
27
+ assert_equal @lookup.lookup(:blue), @translations[:blue]
28
+ assert_equal @lookup.lookup(:yellow), @translations[:yellow]
29
+ end
30
+ end
31
+
32
+ describe "with a specified namespace" do
33
+ before do
34
+ ListsConstant.namespace = :mistranslations
35
+
36
+ @mistranslations = {
37
+ red: 'sangriento',
38
+ blue: 'morado',
39
+ yellow: 'gallina'
40
+ }
41
+
42
+ I18n.backend.store_translations :es, {
43
+ mistranslations: {
44
+ lister: {
45
+ colors: @mistranslations
46
+ }
47
+ }
48
+ }
49
+ end
50
+
51
+ after do
52
+ ListsConstant.namespace = nil
53
+ end
54
+
55
+ it "scopes within the lookup for localization" do
56
+ assert_equal @lookup.lookup(:red), @mistranslations[:red]
57
+ assert_equal @lookup.lookup(:blue), @mistranslations[:blue]
58
+ assert_equal @lookup.lookup(:yellow), @mistranslations[:yellow]
59
+ end
60
+ end
61
+
62
+
63
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../../../test_helper'
2
+
3
+ describe ListsConstant::Lookups::Class do
4
+ before do
5
+ I18n.locale = :en
6
+
7
+ @colors = [:red, :blue, :yellow]
8
+ Lister.const_set 'COLORS', @colors
9
+ Lister.extend ListsConstant::Lookups::Class.new('colors', @colors)
10
+ end
11
+
12
+ after do
13
+ Lister.send :remove_const, 'COLORS'
14
+ end
15
+
16
+ it "determines if a passed value is available" do
17
+ assert Lister.includes_color?(:red)
18
+ assert Lister.includes_color?('blue')
19
+ refute Lister.includes_color?(:magenta)
20
+ end
21
+
22
+ describe "given I18n translations" do
23
+ before do
24
+ @translations = {
25
+ red: 'rojo',
26
+ blue: 'azul',
27
+ yellow: 'amarillo'
28
+ }
29
+
30
+ I18n.backend.store_translations :es, {
31
+ lister: {
32
+ colors: @translations
33
+ }
34
+ }
35
+
36
+ I18n.locale = :es
37
+ end
38
+
39
+ it "generates a hash of the localized names with their values" do
40
+ assert_equal Lister.colors, {
41
+ red: @translations[:red],
42
+ blue: @translations[:blue],
43
+ yellow: @translations[:yellow]
44
+ }
45
+ end
46
+
47
+ it "generates an inverted hash for option helpers" do
48
+ assert_equal Lister.color_options, {
49
+ @translations[:red] => :red,
50
+ @translations[:blue] => :blue,
51
+ @translations[:yellow] => :yellow
52
+ }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../../test_helper'
2
+
3
+ describe ListsConstant::Lookups::Instance do
4
+ before do
5
+ I18n.locale = :en
6
+
7
+ @colors = [:red, :blue, :yellow]
8
+ Lister.send :include, ListsConstant::Lookups::Instance.new('colors', @colors)
9
+ end
10
+
11
+ it "adds instance query methods for each value" do
12
+ listed = Lister.new(:red)
13
+
14
+ assert listed.color_red?
15
+ refute listed.color_yellow?
16
+ refute listed.color_blue?
17
+ end
18
+
19
+ describe "given I18n translations" do
20
+ before do
21
+ @translations = {
22
+ red: 'rojo',
23
+ blue: 'azul',
24
+ yellow: 'amarillo'
25
+ }
26
+
27
+ I18n.backend.store_translations :es, {
28
+ lister: {
29
+ colors: @translations
30
+ }
31
+ }
32
+
33
+ I18n.locale = :es
34
+ end
35
+
36
+ it "localizes the variable description" do
37
+ listed = Lister.new(:red)
38
+ assert_equal listed.localized_color, @translations[:red]
39
+ end
40
+ end
41
+ end
data/test/test_helper.rb CHANGED
@@ -1,2 +1,4 @@
1
1
  require 'minitest/autorun'
2
2
  require File.expand_path('../../lib/lists_constant.rb', __FILE__)
3
+
4
+ require_relative './fixtures/lister'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lists_constant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.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: 2013-05-31 00:00:00.000000000 Z
12
+ date: 2013-06-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -56,9 +56,18 @@ files:
56
56
  - README.md
57
57
  - Rakefile
58
58
  - lib/lists_constant.rb
59
+ - lib/lists_constant/class_methods.rb
60
+ - lib/lists_constant/lookup.rb
61
+ - lib/lists_constant/lookups.rb
62
+ - lib/lists_constant/lookups/class.rb
63
+ - lib/lists_constant/lookups/instance.rb
59
64
  - lib/lists_constant/version.rb
60
65
  - lists_constant.gemspec
61
- - test/lib/lists_constant/lists_constant_test.rb
66
+ - test/fixtures/lister.rb
67
+ - test/lib/lists_constant/class_methods_test.rb
68
+ - test/lib/lists_constant/lookup_test.rb
69
+ - test/lib/lists_constant/lookups/class_test.rb
70
+ - test/lib/lists_constant/lookups/instance_test.rb
62
71
  - test/lib/lists_constant/version_test.rb
63
72
  - test/test_helper.rb
64
73
  homepage: https://github.com/ahorner/lists-constant
@@ -89,6 +98,10 @@ summary: ListsConstant is a module which allows you to easily define lists of co
89
98
  library is intended to make it simple to keep view-specific information (like the
90
99
  text representations of your listed values) out of your model classes.
91
100
  test_files:
92
- - test/lib/lists_constant/lists_constant_test.rb
101
+ - test/fixtures/lister.rb
102
+ - test/lib/lists_constant/class_methods_test.rb
103
+ - test/lib/lists_constant/lookup_test.rb
104
+ - test/lib/lists_constant/lookups/class_test.rb
105
+ - test/lib/lists_constant/lookups/instance_test.rb
93
106
  - test/lib/lists_constant/version_test.rb
94
107
  - test/test_helper.rb
@@ -1,115 +0,0 @@
1
- require_relative '../../test_helper'
2
-
3
- class Lister
4
-
5
- attr_accessor :color
6
-
7
- def initialize(color)
8
- @color = color
9
- end
10
- end
11
-
12
- describe ListsConstant do
13
- before do
14
- I18n.locale = :en
15
- Lister.send :include, ListsConstant
16
- end
17
-
18
- it "requires a name for the constant list" do
19
- assert_raises ArgumentError do
20
- Lister.lists_constant :red, :blue, :yellow
21
- end
22
- end
23
-
24
- describe "creating a constant list" do
25
- before do
26
- Lister.lists_constant :red,
27
- :blue,
28
- :yellow,
29
- as: :colors
30
- end
31
-
32
- after do
33
- Lister.send :remove_const, 'COLORS'
34
- end
35
-
36
- it "adds the constant to the includer" do
37
- assert_equal Lister::COLORS, [:red, :blue, :yellow]
38
- end
39
-
40
- it "adds instance query methods for each value" do
41
- listed = Lister.new(:red)
42
-
43
- assert listed.color_red?
44
- refute listed.color_yellow?
45
- refute listed.color_blue?
46
- end
47
-
48
- describe "given I18n translations" do
49
- before do
50
- @translations = {
51
- red: 'rojo',
52
- blue: 'azul',
53
- yellow: 'amarillo'
54
- }
55
-
56
- I18n.backend.store_translations :es, {
57
- lister: {
58
- colors: @translations
59
- }
60
- }
61
-
62
- I18n.locale = :es
63
- end
64
-
65
- it "generates a hash of the localized names with their values" do
66
- assert_equal Lister.colors, {
67
- red: @translations[:red],
68
- blue: @translations[:blue],
69
- yellow: @translations[:yellow]
70
- }
71
- end
72
-
73
- it "generates an inverted hash for option helpers" do
74
- assert_equal Lister.color_options, {
75
- @translations[:red] => :red,
76
- @translations[:blue] => :blue,
77
- @translations[:yellow] => :yellow
78
- }
79
- end
80
-
81
- it "localizes the variable description" do
82
- listed = Lister.new(:red)
83
- assert_equal listed.localized_color, @translations[:red]
84
- end
85
-
86
- describe "with a namespace" do
87
- before do
88
- ListsConstant.namespace = :mistranslations
89
-
90
- @mistranslations = {
91
- red: 'sangriento',
92
- blue: 'morado',
93
- yellow: 'gallina'
94
- }
95
-
96
- I18n.backend.store_translations :es, {
97
- mistranslations: {
98
- lister: {
99
- colors: @mistranslations
100
- }
101
- }
102
- }
103
- end
104
-
105
- it "scopes within the namespace for localization" do
106
- assert_equal Lister.colors, {
107
- red: @mistranslations[:red],
108
- blue: @mistranslations[:blue],
109
- yellow: @mistranslations[:yellow]
110
- }
111
- end
112
- end
113
- end
114
- end
115
- end