selectable_attr_rails 0.3.11 → 0.3.12
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/Rakefile +56 -38
- data/VERSION.yml +2 -2
- data/lib/selectable_attr_i18n.rb +2 -2
- data/lib/selectable_attr_rails/db_loadable.rb +9 -9
- data/lib/selectable_attr_rails/helpers/abstract_selection_helper.rb +6 -6
- data/lib/selectable_attr_rails/helpers/check_box_group_helper.rb +8 -7
- data/lib/selectable_attr_rails/helpers/radio_button_group_helper.rb +9 -9
- data/lib/selectable_attr_rails/helpers/select_helper.rb +5 -5
- data/lib/selectable_attr_rails.rb +4 -4
- data/selectable_attr_rails.gemspec +23 -7
- data/spec/introduction_spec.rb +80 -80
- data/spec/schema.rb +3 -3
- data/spec/selectable_attr_i18n_spec.rb +28 -20
- data/spec/spec_helper.rb +14 -0
- metadata +91 -21
data/Rakefile
CHANGED
@@ -1,42 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
gem 'rspec', '>= 1.1.4'
|
3
2
|
require 'rake'
|
4
|
-
require 'rake/rdoctask'
|
5
|
-
require 'spec/rake/spectask'
|
6
|
-
require 'spec/rake/verify_rcov'
|
7
|
-
|
8
|
-
desc 'Default: run unit tests.'
|
9
|
-
task :default => :spec
|
10
|
-
|
11
|
-
task :pre_commit => [:spec, 'coverage:verify']
|
12
|
-
|
13
|
-
desc 'Run all specs under spec/**/*_spec.rb'
|
14
|
-
Spec::Rake::SpecTask.new(:spec => 'coverage:clean') do |t|
|
15
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
16
|
-
t.spec_opts = ["-c", "--diff"]
|
17
|
-
t.rcov = true
|
18
|
-
t.rcov_opts = ["--include-file", "lib\/*\.rb", "--exclude", "spec\/"]
|
19
|
-
end
|
20
|
-
|
21
|
-
desc 'Generate documentation for the selectable_attr_rails plugin.'
|
22
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
23
|
-
rdoc.rdoc_dir = 'rdoc'
|
24
|
-
rdoc.title = 'SelectableAttrRails'
|
25
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
26
|
-
rdoc.rdoc_files.include('README')
|
27
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
|
-
end
|
29
|
-
|
30
|
-
namespace :coverage do
|
31
|
-
desc "Delete aggregate coverage data."
|
32
|
-
task(:clean) { rm_f "coverage" }
|
33
|
-
|
34
|
-
desc "verify coverage threshold via RCov"
|
35
|
-
RCov::VerifyTask.new(:verify => :spec) do |t|
|
36
|
-
t.threshold = 100.0 # Make sure you have rcov 0.7 or higher!
|
37
|
-
t.index_html = 'coverage/index.html'
|
38
|
-
end
|
39
|
-
end
|
40
3
|
|
41
4
|
begin
|
42
5
|
require 'jeweler'
|
@@ -51,7 +14,62 @@ begin
|
|
51
14
|
s.add_dependency("activerecord", ">= 2.0.2")
|
52
15
|
s.add_dependency("actionpack", ">= 2.0.2")
|
53
16
|
s.add_dependency("selectable_attr", ">= 0.3.11")
|
17
|
+
s.add_development_dependency "rspec", ">= 1.3.1"
|
18
|
+
s.add_development_dependency "sqlite3-ruby"
|
19
|
+
s.add_development_dependency "rcov"
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
require 'spec/rake/spectask'
|
27
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
28
|
+
spec.libs << 'lib' << 'spec'
|
29
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
30
|
+
end
|
31
|
+
|
32
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
33
|
+
spec.libs << 'lib' << 'spec'
|
34
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
35
|
+
spec.rcov = true
|
36
|
+
end
|
37
|
+
|
38
|
+
task :spec => :check_dependencies
|
39
|
+
|
40
|
+
begin
|
41
|
+
require 'reek/adapters/rake_task'
|
42
|
+
Reek::RakeTask.new do |t|
|
43
|
+
t.fail_on_error = true
|
44
|
+
t.verbose = false
|
45
|
+
t.source_files = 'lib/**/*.rb'
|
46
|
+
end
|
47
|
+
rescue LoadError
|
48
|
+
task :reek do
|
49
|
+
abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
begin
|
54
|
+
require 'roodi'
|
55
|
+
require 'roodi_task'
|
56
|
+
RoodiTask.new do |t|
|
57
|
+
t.verbose = false
|
54
58
|
end
|
55
59
|
rescue LoadError
|
56
|
-
|
60
|
+
task :roodi do
|
61
|
+
abort "Roodi is not available. In order to run roodi, you must: sudo gem install roodi"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
task :default => :spec
|
66
|
+
|
67
|
+
require 'rake/rdoctask'
|
68
|
+
Rake::RDocTask.new do |rdoc|
|
69
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
70
|
+
|
71
|
+
rdoc.rdoc_dir = 'rdoc'
|
72
|
+
rdoc.title = "range_dsl #{version}"
|
73
|
+
rdoc.rdoc_files.include('README*')
|
74
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
57
75
|
end
|
data/VERSION.yml
CHANGED
data/lib/selectable_attr_i18n.rb
CHANGED
@@ -9,7 +9,7 @@ if defined?(I18n)
|
|
9
9
|
enums.each do |instance|
|
10
10
|
unless instance.i18n_scope
|
11
11
|
SelectableAttrRails.logger.debug("no i18n_scope of #{instance.inspect}")
|
12
|
-
next
|
12
|
+
next
|
13
13
|
end
|
14
14
|
paths = instance.i18n_scope.dup
|
15
15
|
current = result
|
@@ -27,7 +27,7 @@ if defined?(I18n)
|
|
27
27
|
@i18n_scope = path unless path.empty?
|
28
28
|
@i18n_scope
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
class Entry
|
32
32
|
def name
|
33
33
|
I18n.locale.nil? ? @name :
|
@@ -7,7 +7,7 @@ module SelectableAttrRails
|
|
7
7
|
@update_timing = options[:when]
|
8
8
|
self.extend(InstanceMethods) unless respond_to?(:update_entries)
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
module Entry
|
12
12
|
|
13
13
|
if defined?(I18n)
|
@@ -20,18 +20,18 @@ module SelectableAttrRails
|
|
20
20
|
@names_from_db ||= {}
|
21
21
|
@names_from_db[I18n.locale.to_s] = value
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def name_with_from_db
|
25
25
|
name_from_db || name_without_from_db
|
26
26
|
end
|
27
27
|
|
28
28
|
else
|
29
|
-
|
29
|
+
|
30
30
|
attr_accessor :name_from_db
|
31
31
|
def name_with_from_db
|
32
32
|
@name_from_db || name_without_from_db
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
end
|
36
36
|
|
37
37
|
def self.extended(obj)
|
@@ -42,18 +42,18 @@ module SelectableAttrRails
|
|
42
42
|
end
|
43
43
|
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
module InstanceMethods
|
47
47
|
def entries
|
48
48
|
update_entries if must_be_updated?
|
49
49
|
@entries
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
def must_be_updated?
|
53
53
|
return false if @update_timing == :never
|
54
54
|
return true if @update_timing == :everytime
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def update_entries
|
58
58
|
unless @original_entries
|
59
59
|
@original_entries = @entries.dup
|
@@ -68,7 +68,7 @@ module SelectableAttrRails
|
|
68
68
|
sql = @sql_to_update.gsub(/\:locale/, I18n.locale.to_s.inspect)
|
69
69
|
records = ActiveRecord::Base.connection.select_rows(sql)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
new_entries = []
|
73
73
|
records.each do |r|
|
74
74
|
if entry = @original_entries.detect{|entry| entry.id == r.first}
|
@@ -90,6 +90,6 @@ module SelectableAttrRails
|
|
90
90
|
@entries = new_entries
|
91
91
|
end
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
end
|
95
95
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module SelectableAttrRails::Helpers
|
2
2
|
class AbstractSelectionBuilder
|
3
3
|
attr_reader :entry_hash
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(object, object_name, method, options, template)
|
6
6
|
@object, @object_name, @method = object, object_name, method
|
7
7
|
@base_name = @object.class.enum_base_name(method.to_s)
|
@@ -15,7 +15,7 @@ module SelectableAttrRails::Helpers
|
|
15
15
|
base_name = @object.class.enum_base_name(@method.to_s)
|
16
16
|
@object.send("#{base_name}_hash_array")
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def enum_hash_array_from_class
|
20
20
|
base_name = @object.class.enum_base_name(@method.to_s)
|
21
21
|
@object.class.send("#{base_name}_hash_array")
|
@@ -26,19 +26,19 @@ module SelectableAttrRails::Helpers
|
|
26
26
|
tag.scan(/ id\=\"(.*?)\"/){|s|result = s}
|
27
27
|
return result
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def add_class_name(options, class_name)
|
31
31
|
(options ||= {}).stringify_keys!
|
32
32
|
(options['class'] ||= '') << ' ' << class_name
|
33
33
|
options
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def camelize_keys(hash, first_letter = :lower)
|
37
37
|
result = {}
|
38
38
|
hash.each{|key, value|result[key.to_s.camelize(first_letter)] = value}
|
39
39
|
result
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def update_options(dest, *options_array)
|
43
43
|
result = dest || {}
|
44
44
|
options_array.each do |options|
|
@@ -50,6 +50,6 @@ module SelectableAttrRails::Helpers
|
|
50
50
|
end
|
51
51
|
result
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
end
|
55
55
|
end
|
@@ -2,22 +2,23 @@ require 'selectable_attr_rails/helpers/abstract_selection_helper'
|
|
2
2
|
module SelectableAttrRails::Helpers
|
3
3
|
module CheckBoxGroupHelper
|
4
4
|
class Builder < SelectableAttrRails::Helpers::AbstractSelectionBuilder
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(object, object_name, method, options, template)
|
7
7
|
super(object, object_name, method, options, template)
|
8
8
|
@entry_hash_array ||= enum_hash_array_from_object
|
9
9
|
@param_name = "#{@base_name}_ids"
|
10
10
|
@check_box_options = @options.delete(:check_box) || {}
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def each(&block)
|
14
|
-
@entry_hash_array.each do
|
14
|
+
@entry_hash_array.each do |entry_hash|
|
15
|
+
@entry_hash= entry_hash
|
15
16
|
@tag_value = @entry_hash[:id].to_s.gsub(/\s/, "_").gsub(/\W/, "")
|
16
17
|
@check_box_id = "#{@object_name}_#{@param_name}_#{@tag_value}"
|
17
18
|
yield(self)
|
18
19
|
end
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
def check_box(options = nil)
|
22
23
|
options = update_options({
|
23
24
|
:id => @check_box_id, :type => 'checkbox', :value => @tag_value,
|
@@ -26,7 +27,7 @@ module SelectableAttrRails::Helpers
|
|
26
27
|
options[:checked] = 'checked' if @entry_hash[:select]
|
27
28
|
@template.content_tag("input", nil, options)
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
def label(text = nil, options = nil)
|
31
32
|
@template.content_tag("label", text || @entry_hash[:name],
|
32
33
|
update_options({:for => @check_box_id}, options))
|
@@ -52,10 +53,10 @@ module SelectableAttrRails::Helpers
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
module FormBuilder
|
57
58
|
def check_box_group(method, options = nil, &block)
|
58
|
-
@template.check_box_group(@object_name, method,
|
59
|
+
@template.check_box_group(@object_name, method,
|
59
60
|
(options || {}).merge(:object => @object), &block)
|
60
61
|
end
|
61
62
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module SelectableAttrRails::Helpers
|
2
2
|
module RadioButtonGroupHelper
|
3
3
|
class Builder < SelectableAttrRails::Helpers::AbstractSelectionBuilder
|
4
|
-
|
5
|
-
attr_reader :entry_hash_array
|
6
|
-
attr_reader :entry_hash
|
7
|
-
attr_accessor :radio_button_id
|
4
|
+
|
5
|
+
attr_reader :entry_hash_array
|
6
|
+
attr_reader :entry_hash
|
7
|
+
attr_accessor :radio_button_id
|
8
8
|
|
9
9
|
def initialize(object, object_name, method, options, template)
|
10
10
|
super(object, object_name, method, options, template)
|
@@ -19,12 +19,12 @@ module SelectableAttrRails::Helpers
|
|
19
19
|
yield(self)
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def radio_button(options = nil)
|
24
|
-
@template.radio_button(@object_name, @method, @entry_hash[:id],
|
24
|
+
@template.radio_button(@object_name, @method, @entry_hash[:id],
|
25
25
|
update_options({:id => @radio_button_id}, options))
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def label(text = nil, options = nil)
|
29
29
|
@template.content_tag("label", text || @entry_hash[:name],
|
30
30
|
update_options({:for => @radio_button_id}, options))
|
@@ -48,10 +48,10 @@ module SelectableAttrRails::Helpers
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
module FormBuilder
|
53
53
|
def radio_button_group(method, options = nil, &block)
|
54
|
-
@template.radio_button_group(@object_name, method,
|
54
|
+
@template.radio_button_group(@object_name, method,
|
55
55
|
(options || {}).merge(:object => @object), &block)
|
56
56
|
end
|
57
57
|
end
|
@@ -6,7 +6,7 @@ module SelectableAttrRails::Helpers
|
|
6
6
|
alias_method_chain :select, :attr_enumeable
|
7
7
|
end
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
# def select_with_attr_enumeable(object, method, choices, options = {}, html_options = {})
|
11
11
|
def select_with_attr_enumeable(object_name, method, *args, &block)
|
12
12
|
if args.length > 3
|
@@ -23,7 +23,7 @@ module SelectableAttrRails::Helpers
|
|
23
23
|
return single_enum_select(object_name, method, options, html_options, &block) if object.class.respond_to?("#{base_name}_hash_array")
|
24
24
|
raise ArgumentError, "invaliad argument"
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def single_enum_select(object_name, method, options = {}, html_options = {}, &block)
|
28
28
|
options = update_enum_select_options(options, object_name, method)
|
29
29
|
object = options[:object] # options.delete(:object)
|
@@ -32,7 +32,7 @@ module SelectableAttrRails::Helpers
|
|
32
32
|
container = entry_hash_array.map{|hash| [hash[:name].to_s, hash[:id]]}
|
33
33
|
select_without_attr_enumeable(object_name, method, container, options, html_options || {}, &block)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def multi_enum_select(object_name, method, options = {}, html_options = {}, &block)
|
37
37
|
html_options = {:size => 5, :multiple => 'multiple'}.update(html_options || {})
|
38
38
|
options = update_enum_select_options(options, object_name, method)
|
@@ -43,7 +43,7 @@ module SelectableAttrRails::Helpers
|
|
43
43
|
attr = "#{base_name}_ids"
|
44
44
|
select_without_attr_enumeable(object_name, attr, container, options, html_options, &block)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def update_enum_select_options(options, object_name, method)
|
48
48
|
options ||= {}
|
49
49
|
object = (options[:object] ||= instance_variable_get("@#{object_name}"))
|
@@ -51,7 +51,7 @@ module SelectableAttrRails::Helpers
|
|
51
51
|
options
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
module FormBuilder
|
56
56
|
def self.included(base)
|
57
57
|
base.module_eval do
|
@@ -13,19 +13,19 @@ module SelectableAttrRails
|
|
13
13
|
def logger=(value)
|
14
14
|
@logger = value
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def add_features_to_active_record
|
18
|
-
ActiveRecord::Base.module_eval do
|
18
|
+
ActiveRecord::Base.module_eval do
|
19
19
|
include ::SelectableAttr::Base
|
20
20
|
include ::SelectableAttrRails::Validatable::Base
|
21
21
|
end
|
22
|
-
SelectableAttr::Enum.module_eval do
|
22
|
+
SelectableAttr::Enum.module_eval do
|
23
23
|
include ::SelectableAttrRails::DbLoadable
|
24
24
|
include ::SelectableAttrRails::Validatable::Enum
|
25
25
|
end
|
26
26
|
logger.debug("#{self.name}.add_features_to_active_record")
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def add_features_to_action_view
|
30
30
|
ActionView::Base.module_eval do
|
31
31
|
include ::SelectableAttrRails::Helpers::SelectHelper::Base
|
@@ -1,12 +1,15 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
7
|
s.name = %q{selectable_attr_rails}
|
5
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.12"
|
6
9
|
|
7
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
11
|
s.authors = ["Takeshi Akima"]
|
9
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-11-01}
|
10
13
|
s.description = %q{selectable_attr_rails makes possible to use selectable_attr in rails application}
|
11
14
|
s.email = %q{akima@gmail.com}
|
12
15
|
s.extra_rdoc_files = [
|
@@ -28,6 +31,9 @@ Gem::Specification.new do |s|
|
|
28
31
|
"lib/selectable_attr_rails/helpers/check_box_group_helper.rb",
|
29
32
|
"lib/selectable_attr_rails/helpers/radio_button_group_helper.rb",
|
30
33
|
"lib/selectable_attr_rails/helpers/select_helper.rb",
|
34
|
+
"lib/selectable_attr_rails/validatable.rb",
|
35
|
+
"lib/selectable_attr_rails/validatable/base.rb",
|
36
|
+
"lib/selectable_attr_rails/validatable/enum.rb",
|
31
37
|
"lib/selectable_attr_rails/version.rb",
|
32
38
|
"selectable_attr_rails.gemspec",
|
33
39
|
"spec/database.yml",
|
@@ -41,7 +47,7 @@ Gem::Specification.new do |s|
|
|
41
47
|
s.homepage = %q{http://github.com/akm/selectable_attr_rails/}
|
42
48
|
s.rdoc_options = ["--charset=UTF-8"]
|
43
49
|
s.require_paths = ["lib"]
|
44
|
-
s.rubygems_version = %q{1.3.
|
50
|
+
s.rubygems_version = %q{1.3.7}
|
45
51
|
s.summary = %q{selectable_attr_rails makes possible to use selectable_attr in rails application}
|
46
52
|
s.test_files = [
|
47
53
|
"spec/introduction_spec.rb",
|
@@ -54,21 +60,31 @@ Gem::Specification.new do |s|
|
|
54
60
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
55
61
|
s.specification_version = 3
|
56
62
|
|
57
|
-
if Gem::Version.new(Gem::
|
63
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
58
64
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
59
65
|
s.add_runtime_dependency(%q<activerecord>, [">= 2.0.2"])
|
60
66
|
s.add_runtime_dependency(%q<actionpack>, [">= 2.0.2"])
|
61
|
-
s.add_runtime_dependency(%q<
|
67
|
+
s.add_runtime_dependency(%q<selectable_attr>, [">= 0.3.11"])
|
68
|
+
s.add_development_dependency(%q<rspec>, [">= 1.3.1"])
|
69
|
+
s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
|
70
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
62
71
|
else
|
63
72
|
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
64
73
|
s.add_dependency(%q<activerecord>, [">= 2.0.2"])
|
65
74
|
s.add_dependency(%q<actionpack>, [">= 2.0.2"])
|
66
|
-
s.add_dependency(%q<
|
75
|
+
s.add_dependency(%q<selectable_attr>, [">= 0.3.11"])
|
76
|
+
s.add_dependency(%q<rspec>, [">= 1.3.1"])
|
77
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
78
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
67
79
|
end
|
68
80
|
else
|
69
81
|
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
70
82
|
s.add_dependency(%q<activerecord>, [">= 2.0.2"])
|
71
83
|
s.add_dependency(%q<actionpack>, [">= 2.0.2"])
|
72
|
-
s.add_dependency(%q<
|
84
|
+
s.add_dependency(%q<selectable_attr>, [">= 0.3.11"])
|
85
|
+
s.add_dependency(%q<rspec>, [">= 1.3.1"])
|
86
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
87
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
73
88
|
end
|
74
89
|
end
|
90
|
+
|
data/spec/introduction_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require File.
|
2
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
3
3
|
|
4
4
|
describe SelectableAttr do
|
5
5
|
|
@@ -13,81 +13,81 @@ describe SelectableAttr do
|
|
13
13
|
p3 = klass.new(:name => '未来派野郎', :product_type_cd => '03', :price => 3000)
|
14
14
|
p3.discount_price.should == 1500
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# 定数をガンガン定義した場合
|
18
18
|
# 大文字が多くて読みにくいし、関連するデータ(ここではDISCOUNT)が増える毎に定数も増えていきます。
|
19
19
|
class LegacyProduct1 < ActiveRecord::Base
|
20
20
|
set_table_name 'products'
|
21
|
-
|
21
|
+
|
22
22
|
PRODUCT_TYPE_BOOK = '01'
|
23
23
|
PRODUCT_TYPE_DVD = '02'
|
24
24
|
PRODUCT_TYPE_CD = '03'
|
25
25
|
PRODUCT_TYPE_OTHER = '09'
|
26
|
-
|
26
|
+
|
27
27
|
PRODUCT_TYPE_OPTIONS = [
|
28
28
|
['書籍', PRODUCT_TYPE_BOOK],
|
29
29
|
['DVD', PRODUCT_TYPE_DVD],
|
30
30
|
['CD', PRODUCT_TYPE_CD],
|
31
31
|
['その他', PRODUCT_TYPE_OTHER]
|
32
32
|
]
|
33
|
-
|
34
|
-
DISCOUNT = {
|
33
|
+
|
34
|
+
DISCOUNT = {
|
35
35
|
PRODUCT_TYPE_BOOK => 0.8,
|
36
36
|
PRODUCT_TYPE_DVD => 0.2,
|
37
37
|
PRODUCT_TYPE_CD => 0.5,
|
38
38
|
PRODUCT_TYPE_OTHER => 1
|
39
39
|
}
|
40
|
-
|
40
|
+
|
41
41
|
def discount_price
|
42
42
|
(DISCOUNT[product_type_cd] * price).to_i
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it "test_legacy_product" do
|
47
47
|
assert_product_discount(LegacyProduct1)
|
48
|
-
|
48
|
+
|
49
49
|
# 選択肢を表示するためのデータは以下のように取得できる
|
50
50
|
LegacyProduct1::PRODUCT_TYPE_OPTIONS.should ==
|
51
51
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
52
52
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
57
|
# できるだけ定数定義をまとめた場合
|
58
58
|
# 結構すっきりするけど、同じことをいろんなモデルで書くかと思うと気が重い。
|
59
59
|
class LegacyProduct2 < ActiveRecord::Base
|
60
60
|
set_table_name 'products'
|
61
|
-
|
61
|
+
|
62
62
|
PRODUCT_TYPE_DEFS = [
|
63
63
|
{:id => '01', :name => '書籍', :discount => 0.8},
|
64
64
|
{:id => '02', :name => 'DVD', :discount => 0.2},
|
65
65
|
{:id => '03', :name => 'CD', :discount => 0.5},
|
66
66
|
{:id => '09', :name => 'その他', :discount => 1}
|
67
67
|
]
|
68
|
-
|
68
|
+
|
69
69
|
PRODUCT_TYPE_OPTIONS = PRODUCT_TYPE_DEFS.map{|t| [t[:name], t[:id]]}
|
70
|
-
DISCOUNT = PRODUCT_TYPE_DEFS.inject({}){|dest, t|
|
70
|
+
DISCOUNT = PRODUCT_TYPE_DEFS.inject({}){|dest, t|
|
71
71
|
dest[t[:id]] = t[:discount]; dest}
|
72
|
-
|
72
|
+
|
73
73
|
def discount_price
|
74
74
|
(DISCOUNT[product_type_cd] * price).to_i
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
it "test_legacy_product" do
|
79
79
|
assert_product_discount(LegacyProduct2)
|
80
|
-
|
80
|
+
|
81
81
|
# 選択肢を表示するためのデータは以下のように取得できる
|
82
|
-
LegacyProduct2::PRODUCT_TYPE_OPTIONS.should ==
|
82
|
+
LegacyProduct2::PRODUCT_TYPE_OPTIONS.should ==
|
83
83
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
# selectable_attrを使った場合
|
87
87
|
# 定義は一カ所にまとめられて、任意の属性(ここでは:discount)も一緒に書くことができてすっきり〜
|
88
88
|
class Product1 < ActiveRecord::Base
|
89
89
|
set_table_name 'products'
|
90
|
-
|
90
|
+
|
91
91
|
selectable_attr :product_type_cd do
|
92
92
|
entry '01', :book, '書籍', :discount => 0.8
|
93
93
|
entry '02', :dvd, 'DVD', :discount => 0.2
|
@@ -100,15 +100,15 @@ describe SelectableAttr do
|
|
100
100
|
(product_type_entry[:discount] * price).to_i
|
101
101
|
end
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
it "test_product1" do
|
105
105
|
assert_product_discount(Product1)
|
106
106
|
# 選択肢を表示するためのデータは以下のように取得できる
|
107
107
|
Product1.product_type_options.should ==
|
108
108
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
109
109
|
end
|
110
|
-
|
111
|
-
|
110
|
+
|
111
|
+
|
112
112
|
# selectable_attrが定義するインスタンスメソッドの詳細
|
113
113
|
it "test_product_type_instance_methods" do
|
114
114
|
p1 = Product1.new
|
@@ -117,19 +117,19 @@ describe SelectableAttr do
|
|
117
117
|
p1.product_type_name.should be_nil
|
118
118
|
# idを変更すると得られるキーも名称も変わります
|
119
119
|
p1.product_type_cd = '02'
|
120
|
-
p1.product_type_cd.should == '02'
|
121
|
-
p1.product_type_key.should == :dvd
|
120
|
+
p1.product_type_cd.should == '02'
|
121
|
+
p1.product_type_key.should == :dvd
|
122
122
|
p1.product_type_name.should == 'DVD'
|
123
123
|
# キーを変更すると得られるidも名称も変わります
|
124
124
|
p1.product_type_key = :book
|
125
125
|
p1.product_type_cd.should == '01'
|
126
|
-
p1.product_type_key.should == :book
|
126
|
+
p1.product_type_key.should == :book
|
127
127
|
p1.product_type_name.should == '書籍'
|
128
128
|
# id、キー、名称以外の任意の属性は、entryの[]メソッドで取得します。
|
129
129
|
p1.product_type_key = :cd
|
130
130
|
p1.product_type_entry[:discount].should == 0.5
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
# selectable_attrが定義するクラスメソッドの詳細
|
134
134
|
it "test_product_type_class_methods" do
|
135
135
|
# キーからid、名称を取得できます
|
@@ -138,8 +138,8 @@ describe SelectableAttr do
|
|
138
138
|
Product1.product_type_id_by_key(:cd).should == '03'
|
139
139
|
Product1.product_type_id_by_key(:other).should == '09'
|
140
140
|
Product1.product_type_name_by_key(:book).should == '書籍'
|
141
|
-
Product1.product_type_name_by_key(:dvd).should == 'DVD'
|
142
|
-
Product1.product_type_name_by_key(:cd).should == 'CD'
|
141
|
+
Product1.product_type_name_by_key(:dvd).should == 'DVD'
|
142
|
+
Product1.product_type_name_by_key(:cd).should == 'CD'
|
143
143
|
Product1.product_type_name_by_key(:other).should == 'その他'
|
144
144
|
# 存在しないキーの場合はnilを返します
|
145
145
|
Product1.product_type_id_by_key(nil).should be_nil
|
@@ -161,7 +161,7 @@ describe SelectableAttr do
|
|
161
161
|
Product1.product_type_name_by_id(nil).should be_nil
|
162
162
|
Product1.product_type_key_by_id('99').should be_nil
|
163
163
|
Product1.product_type_name_by_id('99').should be_nil
|
164
|
-
|
164
|
+
|
165
165
|
# id、キー、名称の配列を取得できます
|
166
166
|
Product1.product_type_ids.should == ['01', '02', '03', '09']
|
167
167
|
Product1.product_type_keys.should == [:book, :dvd, :cd, :other]
|
@@ -169,11 +169,11 @@ describe SelectableAttr do
|
|
169
169
|
# 一部のものだけ取得することも可能です。
|
170
170
|
Product1.product_type_ids(:cd, :dvd).should == ['03', '02' ]
|
171
171
|
Product1.product_type_keys('02', '03').should == [:dvd, :cd ]
|
172
|
-
Product1.product_type_names('02', '03').should == ['DVD', 'CD']
|
172
|
+
Product1.product_type_names('02', '03').should == ['DVD', 'CD']
|
173
173
|
Product1.product_type_names(:cd, :dvd).should == ['CD', 'DVD']
|
174
|
-
|
174
|
+
|
175
175
|
# select_tagなどのoption_tagsを作るための配列なんか一発っす
|
176
|
-
Product1.product_type_options.should ==
|
176
|
+
Product1.product_type_options.should ==
|
177
177
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
178
178
|
end
|
179
179
|
|
@@ -183,12 +183,12 @@ describe SelectableAttr do
|
|
183
183
|
p1.valid?.should == true
|
184
184
|
p1.errors.empty?.should == true
|
185
185
|
|
186
|
-
p1.product_type_key = :book
|
186
|
+
p1.product_type_key = :book
|
187
187
|
p1.product_type_cd.should == '01'
|
188
188
|
p1.valid?.should == true
|
189
189
|
p1.errors.empty?.should == true
|
190
190
|
|
191
|
-
p1.product_type_cd = 'XX'
|
191
|
+
p1.product_type_cd = 'XX'
|
192
192
|
p1.product_type_cd.should == 'XX'
|
193
193
|
p1.valid?.should == false
|
194
194
|
p1.errors.on(:product_type_cd).should == "は次のいずれかでなければなりません。 書籍, DVD, CD, その他"
|
@@ -197,15 +197,15 @@ describe SelectableAttr do
|
|
197
197
|
# selectable_attrのエントリ名をDB上に保持するためのモデル
|
198
198
|
class ItemMaster < ActiveRecord::Base
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
# selectable_attrを使った場合その2
|
202
202
|
# アクセス時に毎回アクセス時にDBから項目名を取得します。
|
203
203
|
class ProductWithDB1 < ActiveRecord::Base
|
204
204
|
set_table_name 'products'
|
205
|
-
|
205
|
+
|
206
206
|
selectable_attr :product_type_cd do
|
207
207
|
update_by(
|
208
|
-
"select item_cd, name from item_masters where category_name = 'product_type_cd' order by item_no",
|
208
|
+
"select item_cd, name from item_masters where category_name = 'product_type_cd' order by item_no",
|
209
209
|
:when => :everytime)
|
210
210
|
entry '01', :book, '書籍', :discount => 0.8
|
211
211
|
entry '02', :dvd, 'DVD', :discount => 0.2
|
@@ -217,7 +217,7 @@ describe SelectableAttr do
|
|
217
217
|
(product_type_entry[:discount] * price).to_i
|
218
218
|
end
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
it "test_update_entry_name" do
|
222
222
|
# DBに全くデータがなくてもコードで記述してあるエントリは存在します。
|
223
223
|
ItemMaster.delete_all("category_name = 'product_type_cd'")
|
@@ -228,17 +228,17 @@ describe SelectableAttr do
|
|
228
228
|
ProductWithDB1.product_type_name_by_key(:other).should == 'その他'
|
229
229
|
|
230
230
|
assert_product_discount(ProductWithDB1)
|
231
|
-
|
231
|
+
|
232
232
|
# DBからエントリの名称を動的に変更できます
|
233
233
|
item_book = ItemMaster.create(:category_name => 'product_type_cd', :item_no => 1, :item_cd => '01', :name => '本')
|
234
234
|
ProductWithDB1.product_type_entries.length.should == 4
|
235
|
-
ProductWithDB1.product_type_name_by_key(:book).should == '本'
|
236
|
-
ProductWithDB1.product_type_name_by_key(:dvd).should == 'DVD'
|
237
|
-
ProductWithDB1.product_type_name_by_key(:cd).should == 'CD'
|
238
|
-
ProductWithDB1.product_type_name_by_key(:other).should == 'その他'
|
239
|
-
ProductWithDB1.product_type_options.should ==
|
235
|
+
ProductWithDB1.product_type_name_by_key(:book).should == '本'
|
236
|
+
ProductWithDB1.product_type_name_by_key(:dvd).should == 'DVD'
|
237
|
+
ProductWithDB1.product_type_name_by_key(:cd).should == 'CD'
|
238
|
+
ProductWithDB1.product_type_name_by_key(:other).should == 'その他'
|
239
|
+
ProductWithDB1.product_type_options.should ==
|
240
240
|
[['本', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
241
|
-
|
241
|
+
|
242
242
|
# DBからエントリの並び順を動的に変更できます
|
243
243
|
item_book.item_no = 4;
|
244
244
|
item_book.save!
|
@@ -247,40 +247,40 @@ describe SelectableAttr do
|
|
247
247
|
item_cd = ItemMaster.create(:category_name => 'product_type_cd', :item_no => 3, :item_cd => '03') # nameは指定しなかったらデフォルトが使われます。
|
248
248
|
ProductWithDB1.product_type_options.should ==
|
249
249
|
[['その他', '09'], ['DVD', '02'], ['CD', '03'], ['本', '01']]
|
250
|
-
|
250
|
+
|
251
251
|
# DBからエントリを動的に追加することも可能です。
|
252
252
|
item_toys = ItemMaster.create(:category_name => 'product_type_cd', :item_no => 5, :item_cd => '04', :name => 'おもちゃ')
|
253
|
-
ProductWithDB1.product_type_options.should ==
|
253
|
+
ProductWithDB1.product_type_options.should ==
|
254
254
|
[['その他', '09'], ['DVD', '02'], ['CD', '03'], ['本', '01'], ['おもちゃ', '04']]
|
255
255
|
ProductWithDB1.product_type_key_by_id('04').should == :entry_04
|
256
|
-
|
256
|
+
|
257
257
|
# DBからレコードを削除してもコードで定義したentryは削除されません。
|
258
258
|
# 順番はDBからの取得順で並び替えられたものの後になります
|
259
259
|
item_dvd.destroy
|
260
|
-
ProductWithDB1.product_type_options.should ==
|
260
|
+
ProductWithDB1.product_type_options.should ==
|
261
261
|
[['その他', '09'], ['CD', '03'], ['本', '01'], ['おもちゃ', '04'], ['DVD', '02']]
|
262
|
-
|
262
|
+
|
263
263
|
# DB上で追加したレコードを削除すると、エントリも削除されます
|
264
264
|
item_toys.destroy
|
265
|
-
ProductWithDB1.product_type_options.should ==
|
265
|
+
ProductWithDB1.product_type_options.should ==
|
266
266
|
[['その他', '09'], ['CD', '03'], ['本', '01'], ['DVD', '02']]
|
267
|
-
|
267
|
+
|
268
268
|
# 名称を指定していたDBのレコードを削除したら元に戻ります。
|
269
269
|
item_book.destroy
|
270
|
-
ProductWithDB1.product_type_options.should ==
|
270
|
+
ProductWithDB1.product_type_options.should ==
|
271
271
|
[['その他', '09'], ['CD', '03'], ['書籍', '01'], ['DVD', '02']]
|
272
|
-
|
272
|
+
|
273
273
|
# エントリに該当するレコードを全部削除したら、元に戻ります。
|
274
274
|
ItemMaster.delete_all("category_name = 'product_type_cd'")
|
275
|
-
ProductWithDB1.product_type_options.should ==
|
275
|
+
ProductWithDB1.product_type_options.should ==
|
276
276
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
277
|
-
|
277
|
+
|
278
278
|
assert_product_discount(ProductWithDB1)
|
279
279
|
end
|
280
|
-
|
281
|
-
|
282
280
|
|
283
|
-
|
281
|
+
|
282
|
+
|
283
|
+
|
284
284
|
# Q: product_type_cd の'_cd'はどこにいっちゃったの?
|
285
285
|
# A: デフォルトでは、/(_cd$|_code$|_cds$|_codes$)/ を削除したものをbase_nameとして
|
286
286
|
# 扱い、それに_keyなどを付加してメソッド名を定義します。もしこのルールを変更したい場合、
|
@@ -288,7 +288,7 @@ describe SelectableAttr do
|
|
288
288
|
class Product2 < ActiveRecord::Base
|
289
289
|
set_table_name 'products'
|
290
290
|
self.selectable_attr_name_pattern = /^product_|_cd$/
|
291
|
-
|
291
|
+
|
292
292
|
selectable_attr :product_type_cd do
|
293
293
|
entry '01', :book, '書籍', :discount => 0.8
|
294
294
|
entry '02', :dvd, 'DVD', :discount => 0.2
|
@@ -300,7 +300,7 @@ describe SelectableAttr do
|
|
300
300
|
(type_entry[:discount] * price).to_i
|
301
301
|
end
|
302
302
|
end
|
303
|
-
|
303
|
+
|
304
304
|
it "test_product2" do
|
305
305
|
assert_product_discount(Product2)
|
306
306
|
# 選択肢を表示するためのデータは以下のように取得できる
|
@@ -319,12 +319,12 @@ describe SelectableAttr do
|
|
319
319
|
# キーを変更すると得られるidも名称も変わります
|
320
320
|
p2.type_key = :book
|
321
321
|
p2.product_type_cd.should == '01'
|
322
|
-
p2.type_key.should == :book
|
322
|
+
p2.type_key.should == :book
|
323
323
|
p2.type_name.should == '書籍'
|
324
324
|
# id、キー、名称以外の任意の属性は、entryの[]メソッドで取得します。
|
325
325
|
p2.type_key = :cd
|
326
326
|
p2.type_entry[:discount].should == 0.5
|
327
|
-
|
327
|
+
|
328
328
|
Product2.type_id_by_key(:book).should == '01'
|
329
329
|
Product2.type_id_by_key(:dvd).should == '02'
|
330
330
|
Product2.type_name_by_key(:cd).should == 'CD'
|
@@ -336,15 +336,15 @@ describe SelectableAttr do
|
|
336
336
|
Product2.type_keys('02', '03').should == [:dvd, :cd]
|
337
337
|
Product2.type_names(:cd, :dvd).should == ['CD', 'DVD']
|
338
338
|
end
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
339
|
+
|
340
|
+
|
341
|
+
|
342
|
+
|
343
343
|
# Q: selectable_attrの呼び出し毎にbase_bname(って言うの?)を指定したいんだけど。
|
344
344
|
# A: base_nameオプションを指定してください。
|
345
345
|
class Product3 < ActiveRecord::Base
|
346
346
|
set_table_name 'products'
|
347
|
-
|
347
|
+
|
348
348
|
selectable_attr :product_type_cd, :base_name => 'type' do
|
349
349
|
entry '01', :book, '書籍', :discount => 0.8
|
350
350
|
entry '02', :dvd, 'DVD', :discount => 0.2
|
@@ -356,13 +356,13 @@ describe SelectableAttr do
|
|
356
356
|
(type_entry[:discount] * price).to_i
|
357
357
|
end
|
358
358
|
end
|
359
|
-
|
360
|
-
it "test_product3" do
|
359
|
+
|
360
|
+
it "test_product3" do
|
361
361
|
assert_product_discount(Product3)
|
362
362
|
# 選択肢を表示するためのデータは以下のように取得できる
|
363
363
|
Product3.type_options.should ==
|
364
364
|
[['書籍', '01'], ['DVD', '02'], ['CD', '03'], ['その他', '09']]
|
365
|
-
|
365
|
+
|
366
366
|
p3 = Product3.new
|
367
367
|
p3.product_type_cd.should be_nil
|
368
368
|
p3.type_key.should be_nil
|
@@ -380,18 +380,18 @@ describe SelectableAttr do
|
|
380
380
|
# id、キー、名称以外の任意の属性は、entryの[]メソッドで取得します。
|
381
381
|
p3.type_key = :cd
|
382
382
|
p3.type_entry[:discount].should == 0.5
|
383
|
-
|
383
|
+
|
384
384
|
Product3.type_id_by_key(:book).should == '01'
|
385
|
-
Product3.type_id_by_key(:dvd).should == '02'
|
386
|
-
Product3.type_name_by_key(:cd).should == 'CD'
|
385
|
+
Product3.type_id_by_key(:dvd).should == '02'
|
386
|
+
Product3.type_name_by_key(:cd).should == 'CD'
|
387
387
|
Product3.type_name_by_key(:other).should == 'その他'
|
388
|
-
Product3.type_key_by_id('09').should == :other
|
389
|
-
Product3.type_name_by_id('01').should == '書籍'
|
388
|
+
Product3.type_key_by_id('09').should == :other
|
389
|
+
Product3.type_name_by_id('01').should == '書籍'
|
390
390
|
Product3.type_keys.should == [:book, :dvd, :cd, :other]
|
391
391
|
Product3.type_names.should == ['書籍', 'DVD', 'CD', 'その他']
|
392
392
|
Product3.type_keys('02', '03').should == [:dvd, :cd]
|
393
393
|
Product3.type_names(:cd, :dvd).should == ['CD', 'DVD']
|
394
394
|
end
|
395
|
-
|
395
|
+
|
396
396
|
end
|
397
397
|
|
data/spec/schema.rb
CHANGED
@@ -7,7 +7,7 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
7
7
|
t.datetime "created_at"
|
8
8
|
t.datetime "updated_at"
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
create_table "item_masters", :force => true do |t|
|
12
12
|
t.string "category_name", :limit => 20
|
13
13
|
t.integer "item_no"
|
@@ -16,7 +16,7 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
16
16
|
t.datetime "created_at"
|
17
17
|
t.datetime "updated_at"
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
create_table "i18n_item_masters", :force => true do |t|
|
21
21
|
t.string "locale", :limit => 5
|
22
22
|
t.string "category_name", :limit => 20
|
@@ -26,5 +26,5 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
26
26
|
t.datetime "created_at"
|
27
27
|
t.datetime "updated_at"
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
if defined?(I18n)
|
3
|
-
require File.
|
3
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
4
4
|
|
5
5
|
describe SelectableAttr::Enum do
|
6
6
|
|
@@ -27,9 +27,9 @@ if defined?(I18n)
|
|
27
27
|
|
28
28
|
it 'test_enum1_i18n' do
|
29
29
|
I18n.locale = nil
|
30
|
-
I18n.locale.should == :en
|
30
|
+
I18n.locale.should == :en
|
31
31
|
Enum1.name_by_key(:entry1).should == "entry one"
|
32
|
-
Enum1.name_by_key(:entry2).should == "entry two"
|
32
|
+
Enum1.name_by_key(:entry2).should == "entry two"
|
33
33
|
Enum1.name_by_key(:entry3).should == "entry three"
|
34
34
|
Enum1.names.should == ["entry one", "entry two", "entry three"]
|
35
35
|
|
@@ -62,12 +62,16 @@ if defined?(I18n)
|
|
62
62
|
it 'test_attr1_i18n' do
|
63
63
|
I18n.default_locale = 'ja'
|
64
64
|
I18n.locale = nil
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
if ActiveRecord::VERSION::STRING <= "2.2.3"
|
66
|
+
I18n.locale.should == 'ja'
|
67
|
+
else
|
68
|
+
I18n.locale.should == :ja
|
69
|
+
end
|
70
|
+
SelectableAttrMock1.attr1_name_by_key(:entry1).should == "エントリ壱"
|
71
|
+
SelectableAttrMock1.attr1_name_by_key(:entry2).should == "エントリ弐"
|
72
|
+
SelectableAttrMock1.attr1_name_by_key(:entry3).should == "エントリ参"
|
69
73
|
SelectableAttrMock1.attr1_options.should == [["エントリ壱",1], ["エントリ弐",2], ["エントリ参",3]]
|
70
|
-
|
74
|
+
|
71
75
|
I18n.locale = 'ja'
|
72
76
|
SelectableAttrMock1.attr1_name_by_key(:entry1).should == "エントリ壱"
|
73
77
|
SelectableAttrMock1.attr1_name_by_key(:entry2).should == "エントリ弐"
|
@@ -75,8 +79,8 @@ if defined?(I18n)
|
|
75
79
|
SelectableAttrMock1.attr1_options.should == [["エントリ壱",1], ["エントリ弐",2], ["エントリ参",3]]
|
76
80
|
|
77
81
|
I18n.locale = 'en'
|
78
|
-
SelectableAttrMock1.attr1_name_by_key(:entry1).should == "entry one"
|
79
|
-
SelectableAttrMock1.attr1_name_by_key(:entry2).should == "entry two"
|
82
|
+
SelectableAttrMock1.attr1_name_by_key(:entry1).should == "entry one"
|
83
|
+
SelectableAttrMock1.attr1_name_by_key(:entry2).should == "entry two"
|
80
84
|
SelectableAttrMock1.attr1_name_by_key(:entry3).should == "entry three"
|
81
85
|
SelectableAttrMock1.attr1_options.should == [["entry one",1], ["entry two",2], ["entry three",3]]
|
82
86
|
end
|
@@ -93,7 +97,11 @@ if defined?(I18n)
|
|
93
97
|
it 'test_enum1_i18n' do
|
94
98
|
I18n.default_locale = 'ja'
|
95
99
|
I18n.locale = nil
|
96
|
-
|
100
|
+
if ActiveRecord::VERSION::STRING <= "2.2.3"
|
101
|
+
I18n.locale.should == 'ja'
|
102
|
+
else
|
103
|
+
I18n.locale.should == :ja
|
104
|
+
end
|
97
105
|
SelectableAttrMock2.enum1_name_by_key(:entry1).should == "エントリ壱"
|
98
106
|
SelectableAttrMock2.enum1_name_by_key(:entry2).should == "エントリ弐"
|
99
107
|
SelectableAttrMock2.enum1_name_by_key(:entry3).should == "エントリ参"
|
@@ -106,8 +114,8 @@ if defined?(I18n)
|
|
106
114
|
SelectableAttrMock2.enum1_options.should == [["エントリ壱",1], ["エントリ弐",2], ["エントリ参",3]]
|
107
115
|
|
108
116
|
I18n.locale = 'en'
|
109
|
-
SelectableAttrMock2.enum1_name_by_key(:entry1).should == "entry one"
|
110
|
-
SelectableAttrMock2.enum1_name_by_key(:entry2).should == "entry two"
|
117
|
+
SelectableAttrMock2.enum1_name_by_key(:entry1).should == "entry one"
|
118
|
+
SelectableAttrMock2.enum1_name_by_key(:entry2).should == "entry two"
|
111
119
|
SelectableAttrMock2.enum1_name_by_key(:entry3).should == "entry three"
|
112
120
|
SelectableAttrMock2.enum1_options.should == [["entry one",1], ["entry two",2], ["entry three",3]]
|
113
121
|
end
|
@@ -125,7 +133,7 @@ if defined?(I18n)
|
|
125
133
|
# update_byメソッドには、エントリのidと名称を返すSELECT文を指定する代わりに、
|
126
134
|
# エントリのidと名称の配列の配列を返すブロックを指定することも可能です。
|
127
135
|
update_by(:when => :everytime) do
|
128
|
-
records = I18nItemMaster.find(:all,
|
136
|
+
records = I18nItemMaster.find(:all,
|
129
137
|
:conditions => [
|
130
138
|
"category_name = 'product_type_cd' and locale = ? ", I18n.locale.to_s],
|
131
139
|
:order => "item_no")
|
@@ -148,7 +156,7 @@ if defined?(I18n)
|
|
148
156
|
ProductWithI18nDB1.product_type_name_by_key(:dvd).should == 'DVD'
|
149
157
|
ProductWithI18nDB1.product_type_name_by_key(:cd).should == 'CD'
|
150
158
|
ProductWithI18nDB1.product_type_name_by_key(:other).should == 'その他'
|
151
|
-
|
159
|
+
|
152
160
|
ProductWithI18nDB1.product_type_hash_array.should == [
|
153
161
|
{:id => '01', :key => :book, :name => '書籍', :discount => 0.8},
|
154
162
|
{:id => '02', :key => :dvd, :name => 'DVD', :discount => 0.2},
|
@@ -158,7 +166,7 @@ if defined?(I18n)
|
|
158
166
|
|
159
167
|
# DBからエントリの名称を動的に変更できます
|
160
168
|
item_book = I18nItemMaster.create(:locale => 'ja', :category_name => 'product_type_cd', :item_no => 1, :item_cd => '01', :name => '本')
|
161
|
-
ProductWithI18nDB1.product_type_entries.length.should == 4
|
169
|
+
ProductWithI18nDB1.product_type_entries.length.should == 4
|
162
170
|
ProductWithI18nDB1.product_type_name_by_key(:book).should == '本'
|
163
171
|
ProductWithI18nDB1.product_type_name_by_key(:dvd).should == 'DVD'
|
164
172
|
ProductWithI18nDB1.product_type_name_by_key(:cd).should == 'CD'
|
@@ -200,7 +208,7 @@ if defined?(I18n)
|
|
200
208
|
item_dvd = I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 2, :item_cd => '02', :name => 'DVD')
|
201
209
|
item_cd = I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 3, :item_cd => '03', :name => 'CD')
|
202
210
|
item_toys = I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 5, :item_cd => '04', :name => 'Toy')
|
203
|
-
|
211
|
+
|
204
212
|
# 英語名が登録されていてもI18n.localeが変わらなければ、日本語のまま
|
205
213
|
ProductWithI18nDB1.product_type_options.should == [['その他', '09'], ['DVD', '02'], ['CD', '03'], ['本', '01'], ['おもちゃ', '04']]
|
206
214
|
ProductWithI18nDB1.product_type_key_by_id('04').should == :entry_04
|
@@ -212,7 +220,7 @@ if defined?(I18n)
|
|
212
220
|
{:id => '01', :key => :book, :name => '本', :discount => 0.8},
|
213
221
|
{:id => '04', :key => :entry_04, :name => 'おもちゃ'}
|
214
222
|
]
|
215
|
-
|
223
|
+
|
216
224
|
# I18n.localeを変更すると取得できるエントリの名称も変わります
|
217
225
|
I18n.locale = 'en'
|
218
226
|
ProductWithI18nDB1.product_type_options.should == [['Others', '09'], ['DVD', '02'], ['CD', '03'], ['Book', '01'], ['Toy', '04']]
|
@@ -229,7 +237,7 @@ if defined?(I18n)
|
|
229
237
|
I18n.locale = 'ja'
|
230
238
|
ProductWithI18nDB1.product_type_options.should == [['その他', '09'], ['DVD', '02'], ['CD', '03'], ['本', '01'], ['おもちゃ', '04']]
|
231
239
|
ProductWithI18nDB1.product_type_key_by_id('04').should == :entry_04
|
232
|
-
|
240
|
+
|
233
241
|
I18n.locale = 'en'
|
234
242
|
ProductWithI18nDB1.product_type_options.should == [['Others', '09'], ['DVD', '02'], ['CD', '03'], ['Book', '01'], ['Toy', '04']]
|
235
243
|
ProductWithI18nDB1.product_type_key_by_id('04').should == :entry_04
|
@@ -276,7 +284,7 @@ if defined?(I18n)
|
|
276
284
|
I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 3, :item_cd => '03', :name => 'CD')
|
277
285
|
I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 4, :item_cd => '01', :name => 'Book')
|
278
286
|
I18nItemMaster.create(:locale => 'en', :category_name => 'product_type_cd', :item_no => 5, :item_cd => '04', :name => 'Toy')
|
279
|
-
|
287
|
+
|
280
288
|
I18n.locale = 'en'
|
281
289
|
actual = SelectableAttr::Enum.i18n_export
|
282
290
|
actual.keys.should == ['selectable_attrs']
|
data/spec/spec_helper.rb
CHANGED
@@ -28,3 +28,17 @@ def assert_hash(expected, actual)
|
|
28
28
|
assert_equal expected[key], actual[key], "unmatch value for #{key.inspect}"
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
# http://d.hatena.ne.jp/nedate/20101004/1286183882
|
33
|
+
if defined?(Rcov)
|
34
|
+
class Rcov::CodeCoverageAnalyzer
|
35
|
+
def update_script_lines__
|
36
|
+
if '1.9'.respond_to?(:force_encoding)
|
37
|
+
SCRIPT_LINES__.each do |k,v|
|
38
|
+
v.each { |src| src.force_encoding('utf-8') }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@script_lines__ = @script_lines__.merge(SCRIPT_LINES__)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selectable_attr_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 3
|
8
|
+
- 12
|
9
|
+
version: 0.3.12
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Takeshi Akima
|
@@ -9,49 +14,110 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-01
|
17
|
+
date: 2010-11-01 00:00:00 +09:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: activesupport
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
20
25
|
requirements:
|
21
26
|
- - ">="
|
22
27
|
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 0
|
31
|
+
- 2
|
23
32
|
version: 2.0.2
|
24
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
25
35
|
- !ruby/object:Gem::Dependency
|
26
36
|
name: activerecord
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
30
40
|
requirements:
|
31
41
|
- - ">="
|
32
42
|
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 0
|
46
|
+
- 2
|
33
47
|
version: 2.0.2
|
34
|
-
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
35
50
|
- !ruby/object:Gem::Dependency
|
36
51
|
name: actionpack
|
37
|
-
|
38
|
-
|
39
|
-
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
40
55
|
requirements:
|
41
56
|
- - ">="
|
42
57
|
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 2
|
60
|
+
- 0
|
61
|
+
- 2
|
43
62
|
version: 2.0.2
|
44
|
-
|
63
|
+
type: :runtime
|
64
|
+
version_requirements: *id003
|
45
65
|
- !ruby/object:Gem::Dependency
|
46
66
|
name: selectable_attr
|
47
|
-
|
48
|
-
|
49
|
-
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
50
70
|
requirements:
|
51
71
|
- - ">="
|
52
72
|
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
- 3
|
76
|
+
- 11
|
53
77
|
version: 0.3.11
|
54
|
-
|
78
|
+
type: :runtime
|
79
|
+
version_requirements: *id004
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rspec
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 1
|
90
|
+
- 3
|
91
|
+
- 1
|
92
|
+
version: 1.3.1
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: sqlite3-ruby
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
version: "0"
|
106
|
+
type: :development
|
107
|
+
version_requirements: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
name: rcov
|
110
|
+
prerelease: false
|
111
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
type: :development
|
120
|
+
version_requirements: *id007
|
55
121
|
description: selectable_attr_rails makes possible to use selectable_attr in rails application
|
56
122
|
email: akima@gmail.com
|
57
123
|
executables: []
|
@@ -98,21 +164,25 @@ rdoc_options:
|
|
98
164
|
require_paths:
|
99
165
|
- lib
|
100
166
|
required_ruby_version: !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
101
168
|
requirements:
|
102
169
|
- - ">="
|
103
170
|
- !ruby/object:Gem::Version
|
171
|
+
segments:
|
172
|
+
- 0
|
104
173
|
version: "0"
|
105
|
-
version:
|
106
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
107
176
|
requirements:
|
108
177
|
- - ">="
|
109
178
|
- !ruby/object:Gem::Version
|
179
|
+
segments:
|
180
|
+
- 0
|
110
181
|
version: "0"
|
111
|
-
version:
|
112
182
|
requirements: []
|
113
183
|
|
114
184
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.3.
|
185
|
+
rubygems_version: 1.3.7
|
116
186
|
signing_key:
|
117
187
|
specification_version: 3
|
118
188
|
summary: selectable_attr_rails makes possible to use selectable_attr in rails application
|