code-box 0.4.1 → 0.5.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/.ruby-version +1 -0
- data/Gemfile.lock +9 -1
- data/README.md +56 -9
- data/code-box.gemspec +1 -0
- data/lib/code-box/acts_as_code.rb +43 -87
- data/lib/code-box/version.rb +1 -1
- data/test/code-box/test_acts_as_code.rb +11 -9
- data/test/resources/locale/de.yml +1 -1
- metadata +19 -3
- data/.rvmrc +0 -1
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p125
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
code-box (0.
|
4
|
+
code-box (0.5.0)
|
5
5
|
activerecord (~> 3.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -20,9 +20,16 @@ GEM
|
|
20
20
|
multi_json (~> 1.0)
|
21
21
|
arel (3.0.2)
|
22
22
|
builder (3.0.0)
|
23
|
+
coderay (1.0.5)
|
23
24
|
i18n (0.6.0)
|
25
|
+
method_source (0.8.2)
|
24
26
|
multi_json (1.3.6)
|
27
|
+
pry (0.9.12.2)
|
28
|
+
coderay (~> 1.0.5)
|
29
|
+
method_source (~> 0.8)
|
30
|
+
slop (~> 3.4)
|
25
31
|
rake (0.9.2.2)
|
32
|
+
slop (3.4.6)
|
26
33
|
sqlite3 (1.3.6)
|
27
34
|
tzinfo (0.3.33)
|
28
35
|
|
@@ -32,5 +39,6 @@ PLATFORMS
|
|
32
39
|
DEPENDENCIES
|
33
40
|
activerecord (~> 3.0)
|
34
41
|
code-box!
|
42
|
+
pry
|
35
43
|
rake
|
36
44
|
sqlite3
|
data/README.md
CHANGED
@@ -122,26 +122,73 @@ The include and code specification will create the following methods in Person:
|
|
122
122
|
|
123
123
|
### Defining code classes (acts_as_code)
|
124
124
|
|
125
|
-
|
125
|
+
Above described code_attributes can reference code objects. Code objects can be defined using
|
126
126
|
|
127
|
-
|
127
|
+
acts_as_code(*codes, options)
|
128
128
|
|
129
|
-
|
130
|
-
<br/>Translates the code stored in `code`
|
129
|
+
Options are:
|
131
130
|
|
132
|
-
*
|
133
|
-
|
131
|
+
* `:code_attribute => :code`
|
132
|
+
Name of the attribute holding the code (default 'code').
|
133
|
+
* `:sti => false`
|
134
|
+
If `true` the uniqueness validation is scoped by the attribute `type` (default false).
|
135
|
+
* `:uniqueness_case_sensitive => true`
|
136
|
+
If `true` the the uniqueness validation is case sensitive (default true).
|
137
|
+
* `:position_attr => :position
|
138
|
+
If present, the order when fetching the codes is done with this expression (default scope - means - if you want to omit the order used `unscoped` on any AR operation).
|
134
139
|
|
135
|
-
|
140
|
+
All options except `:code_attribute` are used only for ActiveRecord models.
|
141
|
+
|
142
|
+
If `*codes` are provided the following code constants will be defined when calling `acts_as_code('male', 'female', code_attribute: 'code')`
|
143
|
+
|
144
|
+
__IMPORTANT__ Code object constants will only be created when the code object is not an ActiveRecord model!
|
145
|
+
|
146
|
+
class Gender
|
147
|
+
include CodeBox::ActsAsCode['male', 'female'] # Code attribute name will be 'code'
|
148
|
+
# Above is a shortcut for...
|
149
|
+
# include CodeBox::ActsAsCode
|
150
|
+
# acts_as_code('male', 'female') # Code attribute name will be 'code'
|
151
|
+
|
152
|
+
|
153
|
+
# Given codes 'male' an 'female' the following constants will be defined:
|
154
|
+
#
|
155
|
+
# module Codes
|
156
|
+
# Male = 'male'
|
157
|
+
# Female = 'female'
|
158
|
+
# All = [Male, Female]
|
159
|
+
# end
|
160
|
+
#
|
161
|
+
# Below constants pnly is is not ActiveRecod model!
|
162
|
+
# Male = Gender.new('male')
|
163
|
+
# Female = Gender.new('female')
|
164
|
+
# All = [Male, Female]
|
165
|
+
#
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
Furthermote àcts_as_code` defines the following methods:
|
170
|
+
|
171
|
+
* `.for_code(code)`
|
172
|
+
Answers the code object for the given code (fetched from cache)
|
173
|
+
|
174
|
+
* `#translated_code(locale=I18n.locale, *other_locale_options)`
|
175
|
+
Translates the code stored in `code`
|
176
|
+
|
177
|
+
* `#translated_code(locale=I18n.locale, *other_locale_options)`
|
178
|
+
Translates the code stored in `code`
|
179
|
+
|
180
|
+
* `.translate_code(codes_and_options)`
|
136
181
|
<br/>Translates a single code if `code` is a code, an array of codes of `code` is an array.
|
137
182
|
If code is an array the option :build => :zip can be used to build a select option capable array (e.g `[['Switzerland', 'SUI'],['Germany', 'GER'],['Denmark', 'DEN']]`)
|
138
183
|
|
139
|
-
* `.
|
140
|
-
|
184
|
+
* `.build_select_options(codes_and_options)`
|
185
|
+
Build an options array from the passed codes (all codes if no codes are passed). Add an empty option at the beginning if the option `:include_nil` is passed. The localization key is defined in CodeBox (CodeBox.i18n_empty_options_key). If you want the change the default key `shared.options.pls_select` you can do so in an initializer by calling `CodeBox.i18n_empty_options_key='your.key'`.
|
141
186
|
|
142
187
|
* `.clear_code_cache`
|
143
188
|
<br/>Clears the cache so its build up on need from all codes from scratch
|
144
189
|
|
190
|
+
* Passing
|
191
|
+
|
145
192
|
|
146
193
|
__Note:__ The code name can be configures using the `:code_attribute` option.
|
147
194
|
`:code_attribute => :iso_code` leads to methods like `#translate_iso_code` etc.
|
data/code-box.gemspec
CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.add_development_dependency "activerecord", "~> 3.0"
|
18
18
|
gem.add_development_dependency "sqlite3"
|
19
19
|
gem.add_development_dependency "rake"
|
20
|
+
gem.add_development_dependency "pry"
|
20
21
|
|
21
22
|
gem.files = `git ls-files`.split($\)
|
22
23
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -47,9 +47,8 @@ module CodeBox
|
|
47
47
|
|
48
48
|
module ClassMethods
|
49
49
|
DefaultOptions = {
|
50
|
-
:type => :poro,
|
51
50
|
:code_attribute => 'code',
|
52
|
-
:
|
51
|
+
:sti => false,
|
53
52
|
:uniqueness_case_sensitive => true,
|
54
53
|
:position_attr => :position,
|
55
54
|
}
|
@@ -61,26 +60,8 @@ module CodeBox
|
|
61
60
|
code_attr = opts[:code_attribute].to_s
|
62
61
|
position_attr = opts[:position_attribute]
|
63
62
|
case_sensitive = opts[:uniqueness_case_sensitive]
|
64
|
-
model_type = opts.delete(:type)
|
65
63
|
|
66
|
-
|
67
|
-
if !codes.empty?
|
68
|
-
code_constants = {}
|
69
|
-
codes.each do |code|
|
70
|
-
constant_name = "#{(code_attr+'_'+code.to_s).to_s.camelize}"
|
71
|
-
constant = const_set(constant_name, code.to_s) unless const_defined?(constant_name)
|
72
|
-
code_constants[constant_name] = constant
|
73
|
-
end
|
74
|
-
raise "Could not define all code constants. Only defined for #{code_constants.values.compact.inspect}" unless code_constants.values.compact.size == codes.size
|
75
|
-
|
76
|
-
pl_code_attr = code_attr.pluralize.camelize
|
77
|
-
constant_name = "All#{pl_code_attr}"
|
78
|
-
if const_defined?(constant_name)
|
79
|
-
raise "Could not define constant '#{const_name}' for all codes."
|
80
|
-
else
|
81
|
-
const_set(constant_name, code_constants.values.compact)
|
82
|
-
end
|
83
|
-
end
|
64
|
+
model_type = self.ancestors.include?('ActiveRecord::Base'.constantize) ? :active_record : :poro
|
84
65
|
|
85
66
|
class_eval <<-RUBY_
|
86
67
|
def translated_#{code_attr}(locale = I18n.locale, *options)
|
@@ -93,9 +74,9 @@ module CodeBox
|
|
93
74
|
class << self
|
94
75
|
attr_accessor :code_box_i18n_options_select_key
|
95
76
|
|
96
|
-
def translate_#{code_attr}(*
|
97
|
-
options =
|
98
|
-
codes =
|
77
|
+
def translate_#{code_attr}(*codes_and_options)
|
78
|
+
options = codes_and_options.extract_options!
|
79
|
+
codes = codes_and_options.first
|
99
80
|
is_parameter_array = codes.kind_of? Array
|
100
81
|
|
101
82
|
codes = Array(codes)
|
@@ -116,13 +97,13 @@ module CodeBox
|
|
116
97
|
code_cache[code]
|
117
98
|
end
|
118
99
|
|
119
|
-
def self.
|
100
|
+
def self.build_select_options(*args)
|
120
101
|
options = args.extract_options!
|
121
|
-
codes = args.empty? ?
|
102
|
+
codes = args.empty? ? #{code_attr.pluralize.camelize}::All : args
|
122
103
|
include_nil = !!options[:include_nil]
|
123
104
|
|
124
105
|
options = translate_#{code_attr}(codes, build: :zip)
|
125
|
-
options
|
106
|
+
options.unshift [I18n.t(CodeBox.i18n_empty_options_key), nil] if include_nil
|
126
107
|
|
127
108
|
options
|
128
109
|
end
|
@@ -134,12 +115,8 @@ module CodeBox
|
|
134
115
|
|
135
116
|
instance_eval <<-CODE
|
136
117
|
class << self
|
137
|
-
def
|
138
|
-
'#{
|
139
|
-
end
|
140
|
-
|
141
|
-
def code_box_code_attr_name
|
142
|
-
'#{code_attr}'
|
118
|
+
def _code_box_code_attr_name
|
119
|
+
'#{code_attr.to_s}'
|
143
120
|
end
|
144
121
|
|
145
122
|
def code_cache
|
@@ -163,7 +140,7 @@ module CodeBox
|
|
163
140
|
|
164
141
|
class_eval <<-CODE
|
165
142
|
validates_presence_of :#{code_attr}
|
166
|
-
validates_uniqueness_of :#{code_attr}#{opts[:
|
143
|
+
validates_uniqueness_of :#{code_attr}#{opts[:sti] ? ', :scope => :type' : ' '}, :case_sensitive => #{case_sensitive}
|
167
144
|
|
168
145
|
default_scope order('#{order_expression}')
|
169
146
|
CODE
|
@@ -178,6 +155,10 @@ module CodeBox
|
|
178
155
|
self.#{code_attr} = #{code_attr}
|
179
156
|
end
|
180
157
|
|
158
|
+
def self.all
|
159
|
+
raise 'Class responsibility'
|
160
|
+
end
|
161
|
+
|
181
162
|
def hash
|
182
163
|
(self.class.name + '#' + #{code_attr}).hash
|
183
164
|
end
|
@@ -190,81 +171,56 @@ module CodeBox
|
|
190
171
|
self.equal? other
|
191
172
|
end
|
192
173
|
CODE
|
193
|
-
|
194
|
-
if codes.empty?
|
195
|
-
class_eval <<-CODE
|
196
|
-
def self.all
|
197
|
-
raise 'Class responsibility'
|
198
|
-
end
|
199
|
-
CODE
|
200
|
-
else
|
201
|
-
code_constants = {}
|
202
|
-
codes.each do |code|
|
203
|
-
constant_name = "#{code.to_s.camelize}"
|
204
|
-
constant = const_set(constant_name, self.new(code.to_s)) unless const_defined?(constant_name)
|
205
|
-
code_constants[constant_name] = constant
|
206
|
-
end
|
207
|
-
raise "Could not define all code instance constants. Only defined for #{code_constants.values.compact.inspect}" unless code_constants.values.compact.size == codes.size
|
208
|
-
|
209
|
-
pl_code_attr = code_attr.pluralize.camelize
|
210
|
-
constant_name = 'All'
|
211
|
-
if const_defined?(constant_name)
|
212
|
-
raise "Could not define constant '#{const_name}' for all codes."
|
213
|
-
else
|
214
|
-
const_set(constant_name, code_constants.values.compact)
|
215
|
-
end
|
216
|
-
|
217
|
-
class_eval <<-CODE
|
218
|
-
def self.all
|
219
|
-
All
|
220
|
-
end
|
221
|
-
CODE
|
222
|
-
end
|
223
|
-
|
224
174
|
else
|
225
175
|
raise ArgumentError, "'#{model_type}' is not a valid type. Use :active_record or :poro(default) instead"
|
226
176
|
end
|
177
|
+
|
178
|
+
define_codes(*codes)
|
227
179
|
end
|
228
180
|
|
229
181
|
def define_codes(*codes)
|
230
|
-
code_attr = self.code_box_code_attr_name
|
231
|
-
model_type = self.code_box_model_type
|
232
|
-
|
233
182
|
return if codes.empty?
|
234
183
|
|
184
|
+
# --- Define the code constants...
|
185
|
+
|
186
|
+
code_attr = self._code_box_code_attr_name
|
187
|
+
model_type = self.ancestors.include?('ActiveRecord::Base'.constantize) ? :active_record : :poro
|
188
|
+
|
189
|
+
module_name = code_attr.pluralize.camelize
|
190
|
+
codes_module = const_set(module_name, Module.new)
|
191
|
+
|
235
192
|
# Create a constant for each code
|
236
|
-
|
193
|
+
constants = {}
|
237
194
|
codes.each do |code|
|
238
|
-
constant_name
|
239
|
-
constant
|
240
|
-
|
195
|
+
constant_name = code.to_s.camelize
|
196
|
+
constant = codes_module.const_set(constant_name, code.to_s) unless codes_module.const_defined?(constant_name)
|
197
|
+
constants[constant_name] = constant
|
241
198
|
end
|
242
|
-
raise "Could not define all code constants. Only defined for #{
|
199
|
+
raise "Could not define all code constants. Only defined for #{constants.values.compact.inspect}" unless constants.values.compact.size == codes.size
|
243
200
|
|
244
|
-
|
245
|
-
|
246
|
-
if const_defined?(constant_name)
|
247
|
-
raise "Could not define constant '#{const_name}' for all codes."
|
201
|
+
if const_defined?('All')
|
202
|
+
raise "Could not define constant 'All' for all codes."
|
248
203
|
else
|
249
|
-
const_set(
|
204
|
+
codes_module.const_set('All', constants.values.compact)
|
250
205
|
end
|
251
206
|
|
252
|
-
return if
|
207
|
+
return if model_type == :active_record
|
208
|
+
|
209
|
+
# --- Define the code instance constants...
|
253
210
|
|
254
|
-
|
211
|
+
constants = {}
|
255
212
|
codes.each do |code|
|
256
|
-
constant_name
|
257
|
-
constant
|
258
|
-
|
213
|
+
constant_name = "#{code.to_s.camelize}"
|
214
|
+
constant = const_set(constant_name, self.new(code.to_s)) unless const_defined?(constant_name)
|
215
|
+
constants[constant_name] = constant
|
259
216
|
end
|
260
|
-
raise "Could not define all code instance constants. Only defined for #{
|
217
|
+
raise "Could not define all code instance constants. Only defined for #{constants.values.compact.inspect}" unless constants.values.compact.size == codes.size
|
261
218
|
|
262
|
-
|
263
|
-
constant_name = 'All'
|
219
|
+
constant_name = 'All'
|
264
220
|
if const_defined?(constant_name)
|
265
221
|
raise "Could not define constant '#{const_name}' for all codes."
|
266
222
|
else
|
267
|
-
const_set(constant_name,
|
223
|
+
const_set(constant_name, constants.values.compact)
|
268
224
|
end
|
269
225
|
|
270
226
|
class_eval <<-CODE
|
data/lib/code-box/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'helper'
|
4
|
+
require 'pry'
|
4
5
|
|
5
6
|
class TestActsAsCode < Test::Unit::TestCase
|
6
7
|
|
@@ -30,14 +31,15 @@ class TestActsAsCode < Test::Unit::TestCase
|
|
30
31
|
|
31
32
|
def test_code_constant_definitiones
|
32
33
|
# Constants
|
33
|
-
assert Codes::CivilStatus.const_defined?('
|
34
|
-
assert Codes::CivilStatus.const_defined?('
|
35
|
-
assert Codes::CivilStatus.const_defined?('
|
34
|
+
assert Codes::CivilStatus.const_defined?('Codes')
|
35
|
+
assert Codes::CivilStatus::Codes.const_defined?('Single')
|
36
|
+
assert Codes::CivilStatus::Codes.const_defined?('Married')
|
37
|
+
assert Codes::CivilStatus::Codes.const_defined?('All')
|
36
38
|
|
37
39
|
# Constants-Values
|
38
|
-
assert_equal [Codes::CivilStatus::
|
39
|
-
assert_equal Codes::CivilStatus::
|
40
|
-
assert_equal Codes::CivilStatus::
|
40
|
+
assert_equal [Codes::CivilStatus::Codes::Single, Codes::CivilStatus::Codes::Married], Codes::CivilStatus::Codes::All
|
41
|
+
assert_equal Codes::CivilStatus::Codes::Married, 'married'
|
42
|
+
assert_equal Codes::CivilStatus::Codes::Single, 'single'
|
41
43
|
end
|
42
44
|
|
43
45
|
def test_code_instance_constant_definitions
|
@@ -74,12 +76,12 @@ class TestActsAsCode < Test::Unit::TestCase
|
|
74
76
|
end
|
75
77
|
|
76
78
|
def test_options_building
|
77
|
-
options_array = Codes::CivilStatus.
|
79
|
+
options_array = Codes::CivilStatus.build_select_options
|
78
80
|
assert_equal options_array.size, 2
|
79
81
|
|
80
|
-
options_array = Codes::CivilStatus.
|
81
|
-
puts arrrr: options_array
|
82
|
+
options_array = Codes::CivilStatus.build_select_options(include_nil: true)
|
82
83
|
assert_equal options_array.size, 3
|
84
|
+
puts options_array: options_array
|
83
85
|
end
|
84
86
|
|
85
87
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: code-box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.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-09-
|
12
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: pry
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: Specify attributes as code and provide lookup by I18n-, cache- or associated
|
79
95
|
and support for building code classes.
|
80
96
|
email:
|
@@ -84,7 +100,7 @@ extensions: []
|
|
84
100
|
extra_rdoc_files: []
|
85
101
|
files:
|
86
102
|
- .gitignore
|
87
|
-
- .
|
103
|
+
- .ruby-version
|
88
104
|
- Gemfile
|
89
105
|
- Gemfile.lock
|
90
106
|
- LICENSE
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm use 1.9.3-p125
|