rails_dictionary 0.2 → 0.2.1
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.
- checksums.yaml +7 -0
- data/Gemfile +3 -3
- data/README.rdoc +3 -0
- data/lib/rails_dictionary/models/acts_as_dict_slave.rb +32 -5
- data/lib/rails_dictionary/models/acts_as_dict_type.rb +6 -8
- data/lib/rails_dictionary/models/acts_as_dictionary.rb +4 -1
- data/lib/rails_dictionary/version.rb +1 -1
- data/rails_dictionary.gemspec +0 -1
- data/spec/fake_app.rb +2 -1
- data/spec/rails_dictionary_spec.rb +23 -1
- data/spec/spec_helper.rb +3 -0
- metadata +11 -30
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 29704f4fcfc7b1a4a58b808a271d6121d790ed0c
|
4
|
+
data.tar.gz: 9f58740b71f9b150134c87b44e3d112c62b83c5d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2c1fd60db8d10a661fe7ab9f0925e51c874685816af149a57e9a914778ee88ea55c6f9137cf0929d924c6921cdb932398116f70752f1a22ee385641e6722af45
|
7
|
+
data.tar.gz: 4cf139cf52ad990394c9686365e639a1f81803f6503460cf3fac17f716a9ad903c7243ab1facd0a5b6fbe159f3190cffa636bb6c8b29144fc22a0876789cf207
|
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
= Plan
|
2
|
+
I plan wrote a new gem to replace it. The new gem will use rails STI. so we dont need maintenance dict_types table. It should be a better solution.
|
3
|
+
|
1
4
|
= Intro
|
2
5
|
There are always some static data(not static page) in application.For example product type or student diploma type.
|
3
6
|
|
@@ -35,27 +35,54 @@ module RailsDictionary
|
|
35
35
|
|
36
36
|
# add a belongs_to(Dictionary) association and a named_{column} method
|
37
37
|
def add_dynamic_column_method
|
38
|
-
dict_mapping_columns.each { |e| belongs_to "#{e
|
38
|
+
dict_mapping_columns.each { |e| belongs_to "#{e}_dict".to_sym, class_name: "Dictionary", foreign_key: e.to_sym }
|
39
39
|
dict_mapping_columns.each { |ele| named_dict_value ele.to_sym }
|
40
|
+
dict_mapping_columns.each { |ele| dict_name_equal ele.to_sym }
|
40
41
|
end
|
41
42
|
|
42
|
-
# Generate dynamic instance method named_column to
|
43
|
+
# Generate dynamic instance method named_column to consumer model
|
43
44
|
# def named_city(locale=nil)
|
44
45
|
# locale = locale.presence || default_dict_locale.presence || :en
|
45
46
|
# locale = "name_#{locale}"
|
46
47
|
# self.send(city_dict).try(:send,locale)
|
47
48
|
# end
|
49
|
+
# alias_method :city_name, :named_city
|
48
50
|
def named_dict_value(method_name)
|
49
|
-
belongs_to_name="#{method_name
|
50
|
-
|
51
|
+
belongs_to_name="#{method_name}_dict".to_sym
|
52
|
+
origin_method_name = method_name
|
53
|
+
method_name="named_#{method_name}"
|
51
54
|
define_method(method_name) do | locale=nil |
|
52
55
|
locale = locale.presence || default_dict_locale.presence || :en
|
53
56
|
locale = "name_#{locale}"
|
54
57
|
self.send(belongs_to_name).try(:send,locale)
|
55
58
|
end
|
59
|
+
alias_method "#{origin_method_name}_name".to_sym, method_name.to_sym
|
56
60
|
end
|
57
61
|
|
58
|
-
|
62
|
+
# Build dynamic method column_name= to the consumer model
|
63
|
+
#
|
64
|
+
# def city_name=(value, options = {})
|
65
|
+
#
|
66
|
+
#
|
67
|
+
# end
|
68
|
+
def dict_name_equal(colname)
|
69
|
+
method_name = "#{colname}_name="
|
70
|
+
belongs_to_name="#{colname}_dict".to_sym
|
71
|
+
define_method(method_name) do |value, options={}|
|
72
|
+
options.merge!(name_en: value)
|
73
|
+
dict_type_id = DictType.revert("#{self.class.table_name.singularize}_#{colname}")
|
74
|
+
options.merge!(dict_type_id: dict_type_id)
|
75
|
+
exist_dictionary = Dictionary.where(options)
|
76
|
+
if exist_dictionary.present?
|
77
|
+
exist_id = exist_dictionary.first.id
|
78
|
+
else
|
79
|
+
exist_id = send("create_#{belongs_to_name}!", options).id
|
80
|
+
end
|
81
|
+
send "#{colname}=", exist_id
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end # END ClassMethods
|
59
86
|
|
60
87
|
end
|
61
88
|
end
|
@@ -2,20 +2,19 @@ module RailsDictionary
|
|
2
2
|
module ActsAsDictType
|
3
3
|
def self.included(base)
|
4
4
|
base.extend(ClassMethods)
|
5
|
-
base.send :include,InstanceMethods
|
5
|
+
base.send :include, InstanceMethods
|
6
|
+
base.mattr_accessor :whole_types
|
6
7
|
end
|
7
8
|
|
8
9
|
module ClassMethods
|
9
10
|
|
10
11
|
def all_types
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def cached_all
|
15
|
-
Rails.cache.fetch("DictType.cached_all") { all }.dup
|
12
|
+
whole_types ||
|
13
|
+
self.whole_types = all.map(&:name).map(&:to_sym)
|
16
14
|
end
|
17
15
|
|
18
16
|
# short method to transfer id to name or name to id
|
17
|
+
# TODO: cache it
|
19
18
|
def revert(arg)
|
20
19
|
if arg.is_a?(String)
|
21
20
|
DictType.where(name: arg).first.try(:id)
|
@@ -48,8 +47,7 @@ module RailsDictionary
|
|
48
47
|
|
49
48
|
module InstanceMethods
|
50
49
|
def delete_all_caches
|
51
|
-
|
52
|
-
Rails.cache.delete("DictType.cached_all")
|
50
|
+
self.whole_types = nil
|
53
51
|
return true
|
54
52
|
end
|
55
53
|
end
|
@@ -25,6 +25,7 @@ module RailsDictionary
|
|
25
25
|
def method_missing(method_id,options={})
|
26
26
|
if DictType.all_types.include? method_id
|
27
27
|
method_name=method_id.to_s.downcase
|
28
|
+
# TODO: If cache engine is failed, then the code will failed with null cant dup
|
28
29
|
Rails.cache.fetch("Dictionary.#{method_name}") { dict_type_name_eq(method_name).to_a }
|
29
30
|
listed_attr=Rails.cache.read("Dictionary.#{method_name}").dup # Instance of ActiveRecord::Relation can not be dup?
|
30
31
|
build_scope_method(method_id)
|
@@ -64,7 +65,9 @@ module RailsDictionary
|
|
64
65
|
scope_method_name = "scoped_#{name}".to_sym
|
65
66
|
unless respond_to? scope_method_name
|
66
67
|
define_singleton_method scope_method_name do
|
67
|
-
|
68
|
+
# see http://stackoverflow.com/questions/18198963/with-rails-4-model-scoped-is-deprecated-but-model-all-cant-replace-it
|
69
|
+
# for usage of where(nil)
|
70
|
+
dict_type_name_eq(name).where(nil)
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
data/rails_dictionary.gemspec
CHANGED
@@ -15,7 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.rubyforge_project = "rails_dictionary"
|
16
16
|
|
17
17
|
s.add_runtime_dependency 'rails', '> 3.0'
|
18
|
-
s.add_development_dependency 'rails', '> 3.0'
|
19
18
|
|
20
19
|
s.files = `git ls-files`.split("\n")
|
21
20
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/fake_app.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
|
2
2
|
# database
|
3
3
|
ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}}
|
4
|
-
ActiveRecord::Base.establish_connection(
|
4
|
+
ActiveRecord::Base.establish_connection(:test)
|
5
5
|
|
6
6
|
# config
|
7
7
|
app = Class.new(Rails::Application)
|
8
8
|
app.config.active_support.deprecation = :log
|
9
|
+
app.config.eager_load = false
|
9
10
|
app.initialize!
|
10
11
|
|
11
12
|
# models
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'debugger'
|
3
2
|
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
4
3
|
|
5
4
|
describe RailsDictionary::ActiveRecordExtension do
|
@@ -34,6 +33,8 @@ describe RailsDictionary do
|
|
34
33
|
end
|
35
34
|
|
36
35
|
it "after one record removed" do
|
36
|
+
DictType.all_types
|
37
|
+
DictType.whole_types.should == [:student_city, :student_school]
|
37
38
|
dt_stu_school.destroy
|
38
39
|
DictType.all_types.should == [:student_city]
|
39
40
|
DictType.tab_and_column.should == Hash[:student,["city"]]
|
@@ -78,10 +79,31 @@ describe RailsDictionary do
|
|
78
79
|
|
79
80
|
it "named_city with different locale" do
|
80
81
|
stu_shanghai.named_city(:en).should == "shanghai"
|
82
|
+
stu_shanghai.city_name(:en).should == "shanghai"
|
83
|
+
stu_shanghai.city_name.should == "shanghai"
|
81
84
|
stu_shanghai.named_city("").should == "shanghai"
|
82
85
|
stu_beijing.named_city(:fr).should == "Pékin"
|
83
86
|
end
|
84
87
|
|
88
|
+
it "update city by set city_name to a value" do
|
89
|
+
stu_shanghai.update_attributes city_name: "wuhan"
|
90
|
+
stu_shanghai.reload.city_name.should == "wuhan"
|
91
|
+
Dictionary.student_city.map(&:name_en).include?("wuhan").should be_true
|
92
|
+
end
|
93
|
+
|
94
|
+
it "update city by set city_name to an exist dictionary name" do
|
95
|
+
Dictionary.where(name_en: "beijing").count.should eq(1)
|
96
|
+
stu_shanghai.update_attributes city_name: "beijing"
|
97
|
+
stu_shanghai.reload.city_name.should eq('beijing')
|
98
|
+
Dictionary.where(name_en: "beijing").count.should eq(1)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "create a student with shanghai city" do
|
102
|
+
s = Student.create(city_name: "shanghai")
|
103
|
+
s.reload
|
104
|
+
s.city_name.should == "shanghai"
|
105
|
+
end
|
106
|
+
|
85
107
|
it "override default locale" do
|
86
108
|
Student.acts_as_dict_slave :locale => :fr
|
87
109
|
stu_beijing.named_city.should == "Pékin"
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# copy and modify the test design of kaminari(a paginate gem for Rails3)
|
2
|
+
RAILS_ENV = 'test'
|
2
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
4
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
5
|
require 'rails'
|
@@ -17,3 +18,5 @@ RSpec.configure do |config|
|
|
17
18
|
config.use_transactional_fixtures = true
|
18
19
|
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'dict_types'
|
19
20
|
end
|
21
|
+
|
22
|
+
require 'byebug'
|
metadata
CHANGED
@@ -1,46 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_dictionary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Raykin Lee
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-03-11 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rails
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '3.0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rails
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>'
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.0'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>'
|
24
|
+
- - ">"
|
44
25
|
- !ruby/object:Gem::Version
|
45
26
|
version: '3.0'
|
46
27
|
description: Rails plugin for mapping static data of web application to Dictionary
|
@@ -51,7 +32,7 @@ executables: []
|
|
51
32
|
extensions: []
|
52
33
|
extra_rdoc_files: []
|
53
34
|
files:
|
54
|
-
- .gitignore
|
35
|
+
- ".gitignore"
|
55
36
|
- CHANGELOG
|
56
37
|
- Gemfile
|
57
38
|
- README.rdoc
|
@@ -70,26 +51,26 @@ files:
|
|
70
51
|
- spec/spec_helper.rb
|
71
52
|
homepage: https://github.com/raykin/rails_dictionary
|
72
53
|
licenses: []
|
54
|
+
metadata: {}
|
73
55
|
post_install_message:
|
74
56
|
rdoc_options: []
|
75
57
|
require_paths:
|
76
58
|
- lib
|
77
59
|
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
-
none: false
|
79
60
|
requirements:
|
80
|
-
- -
|
61
|
+
- - ">="
|
81
62
|
- !ruby/object:Gem::Version
|
82
63
|
version: '0'
|
83
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
65
|
requirements:
|
86
|
-
- -
|
66
|
+
- - ">="
|
87
67
|
- !ruby/object:Gem::Version
|
88
68
|
version: '0'
|
89
69
|
requirements: []
|
90
70
|
rubyforge_project: rails_dictionary
|
91
|
-
rubygems_version:
|
71
|
+
rubygems_version: 2.2.2
|
92
72
|
signing_key:
|
93
|
-
specification_version:
|
73
|
+
specification_version: 4
|
94
74
|
summary: dictionary data for web application
|
95
75
|
test_files: []
|
76
|
+
has_rdoc:
|