rails_dictionary 0.0.9.3 → 0.0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -14,6 +14,8 @@ or
14
14
  rails runner "DictType.new.delete_all_caches"
15
15
  and in production
16
16
  rails runner "DictType.new.delete_all_caches" -e production
17
+ or if you use file cache,just run
18
+ rake tmp:clear
17
19
  See change log for brief info.
18
20
 
19
21
  == Sample
@@ -81,7 +83,7 @@ student_city is a dynamic method which returns a list of dictionary object which
81
83
  Actually Dictionary will have as many dynamic methods as DictType.count and each dynamic method name is DictType.name.
82
84
  Before version 0.1.0 or 0.2.0 ,all dynamic methods return an array,not ActiveRelation.So
83
85
  Dictionary.student_school = []
84
- Dictionary.student_city :locale => :en #=> [["shanghai",1],["beijing",2]]
86
+ Dictionary.student_city :locale => :en #=> [["beijing", 2],["shanghai",1]]
85
87
  You can use it in form select method like
86
88
  collection_select :student,:city,Dictionary.student_city,:id,:name_en
87
89
  select :student,:city,Dictionary.student_city(params)
@@ -96,6 +98,13 @@ Make sure your locale is en,not en-US.
96
98
  Student has two belongs_to assocition which named as city_dict and school_dict,the naming convention is method_dict.
97
99
  Student.find(1).city_dict #=> Dictionary.find(6)
98
100
 
101
+ === Sort Feature
102
+ Static data need orders frequently,so Dictionary.student_city :locale => :en has a default sort rules.
103
+ By default,if the options contains locale,the results are sorted by the name value.
104
+ If locale is :zh,sort rule is order by GBK encoding.
105
+ Other locales are just order by alphabetical without case sensitive.
106
+ You can override Dictionary.sort_dicts to customize your sort rule.But it is not recommended now as the code of sort design maybe change in a few month.
107
+
99
108
  = Practical Suggestion
100
109
  If you start a new application and there are more than 10 kinds of static data,you may have a try with the gem.
101
110
  However,if you see many static data in an old system and want to refactor it,the decision would be judged by the real situations.
@@ -110,8 +119,7 @@ The rails cache would not refresh.
110
119
  In short,when you confused with the debug data,try running "rails tmp:clear" first.
111
120
 
112
121
  = TODO & Problems
113
- There are no convention and implemention to map Class like Ckeditor::Asset to a legal method name.
114
-
115
- Rebuild core code.Using Rails engine.
116
-
122
+ Is there any exist low level method to monitor the change of descendents
117
123
  Add test code for cache DictType.tab_and_column,then uncomment the cache code.
124
+
125
+ There are no convention and implemention to map Class like Ckeditor::Asset to a legal method name.
@@ -8,21 +8,21 @@ module RailsDictionary
8
8
  # TODO: move macro define in each module file
9
9
  # See Usage in readme.doc.
10
10
  def acts_as_dict_type
11
- self.class_eval do
12
- has_many :dictionaries
13
- validates_uniqueness_of :name
14
- after_save :delete_all_caches
15
- after_destroy :delete_all_caches
16
- end
11
+
12
+ has_many :dictionaries
13
+ validates_uniqueness_of :name
14
+ after_save :delete_all_caches
15
+ after_destroy :delete_all_caches
16
+
17
17
  include RailsDictionary::ActsAsDictType
18
18
  end
19
19
 
20
20
  def acts_as_dictionary
21
- self.class_eval do
22
- belongs_to :dict_type
23
- after_save :delete_dicts_cache
24
- after_destroy :delete_dicts_cache
25
- end
21
+
22
+ belongs_to :dict_type
23
+ after_save :delete_dicts_cache
24
+ after_destroy :delete_dicts_cache
25
+
26
26
  include RailsDictionary::ActsAsDictionary
27
27
  end
28
28
 
@@ -37,16 +37,31 @@ module RailsDictionary
37
37
  # Instance of activerelation can not be dup?
38
38
  if options.keys.include? :locale or options.keys.include? "locale"
39
39
  locale="name_#{ options[:locale] }"
40
+ sort_block=sort_dicts(options)
41
+ listed_attr.sort!(&sort_block) if sort_block
40
42
  listed_attr.map! { |a| [a.send(locale),a.id] }.reject! {|ele| ele.first.nil?}
41
- listed_attr.sort { |a,b| a.first.downcase <=> b.first.downcase }
42
- # maybe remove the above line,or change some sorting and caching design
43
- else
44
- listed_attr
45
43
  end
44
+ listed_attr
46
45
  else
47
46
  super
48
47
  end
49
48
  end
49
+
50
+ # overide this method to get customed sort block
51
+ def sort_dicts(options)
52
+ if options.keys.include? :locale or options.keys.include? "locale"
53
+ locale="name_#{ options[:locale] }"
54
+ if options[:locale].to_sym == :zh
55
+ conv = Iconv.new("GBK", "utf-8")
56
+ Proc.new { |a,b| conv.iconv(a.send(locale)) <=> conv.iconv(b.send(locale)) }
57
+ else
58
+ Proc.new { |a,b| a.send(locale).downcase <=> b.send(locale).downcase }
59
+ end
60
+ else
61
+ false
62
+ end
63
+ end
64
+
50
65
  end
51
66
 
52
67
  module InstanceMethods
@@ -1,4 +1,5 @@
1
1
  require 'rails'
2
+ require 'iconv'
2
3
 
3
4
  require File.join(File.dirname(__FILE__),"array_core_ext")
4
5
  require File.join(File.dirname(__FILE__),"models/acts_as_dict_type")
@@ -1,3 +1,3 @@
1
1
  module RailsDictionary
2
- VERSION = "0.0.9.3"
2
+ VERSION = "0.0.9.4"
3
3
  end
@@ -45,7 +45,7 @@ describe RailsDictionary do
45
45
  end
46
46
 
47
47
  it "generate student_city method with locale" do
48
- Dictionary.student_city(:locale => :zh).should == [["上海", 1],["北京", 2]]
48
+ Dictionary.student_city(:locale => :zh).should == [["北京", 2],["上海",1]]
49
49
  end
50
50
 
51
51
  it "after record added or removed" do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rails_dictionary
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.9.3
5
+ version: 0.0.9.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Raykin Lee
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-18 00:00:00 Z
13
+ date: 2011-04-27 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: Rails plugin for mapping static data of web application to Dictionary class
@@ -43,7 +43,6 @@ files:
43
43
  - spec/fake_app.rb
44
44
  - spec/rails_dictionary_spec.rb
45
45
  - spec/spec_helper.rb
46
- - test/rails_dictionary_test.rb
47
46
  homepage: https://github.com/raykin/rails_dictionary
48
47
  licenses: []
49
48
 
@@ -75,5 +74,4 @@ test_files:
75
74
  - spec/fake_app.rb
76
75
  - spec/rails_dictionary_spec.rb
77
76
  - spec/spec_helper.rb
78
- - test/rails_dictionary_test.rb
79
77
  has_rdoc:
@@ -1,137 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Testing for version 0.0.8 or lower.Copy the test design from acts_as_tree
3
- # Usage: run "ruby -I . test/rails_dictionary_test.rb " in root dir
4
- #
5
- require "test/unit"
6
- require "active_support"
7
- require "active_record"
8
- require "ruby-debug" # coupled with debugger to debug code
9
- Object.const_set "RAILS_CACHE", ActiveSupport::Cache.lookup_store
10
- require "active_support/cache"
11
- require "rails"
12
- require "#{File.dirname(__FILE__)}/../lib/rails_dictionary.rb"
13
-
14
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
15
-
16
- $stdout = StringIO.new
17
-
18
- def setup_db
19
- ActiveRecord::Base.logger
20
- ActiveRecord::Schema.define(:version => 1) do
21
- create_table :dict_types do |t|
22
- t.string :name
23
- t.timestamps
24
- end
25
- create_table :dictionaries do |t|
26
- t.string :name_en
27
- t.string :name_zh
28
- t.string :name_fr
29
- t.integer :dict_type_id
30
- t.timestamps
31
- end
32
- create_table :students do |t|
33
- t.string :email
34
- t.integer :city
35
- t.integer :school
36
- t.timestamps
37
- end
38
- end
39
- end
40
-
41
- def teardown_db
42
- ActiveRecord::Base.connection.tables.each do |table|
43
- ActiveRecord::Base.connection.drop_table(table)
44
- end
45
- end
46
-
47
- class DictType < ActiveRecord::Base
48
- acts_as_dict_type
49
- end
50
-
51
- class Dictionary < ActiveRecord::Base
52
- acts_as_dictionary
53
- end
54
-
55
- class Student < ActiveRecord::Base
56
- end
57
-
58
- class CoreExtTest < Test::Unit::TestCase
59
- def test_array
60
- expected_hash={:student => %w[school city],:admin => %w[role]}
61
- blank_hash={}
62
- assert_equal expected_hash, %w[student_school student_city admin_role].extract_to_hash(%w[student admin])
63
- assert_equal expected_hash, %w[root student_school student_city admin_role].extract_to_hash(%w[student admin])
64
- assert_equal blank_hash, %w[root students_school students_city].extract_to_hash(%w[student])
65
- end
66
- end
67
-
68
- class DictTypeTest < Test::Unit::TestCase
69
- def setup
70
- setup_db
71
- #Object.const_set('Student',Class.new(ActiveRecord::Base))
72
- @dt_stu_city=DictType.create! :name => "student_city"
73
- @dt_stu_school=DictType.create! :name => "student_school"
74
- @dy_shanghai=Dictionary.create! name_en: "shanghai",name_zh: "上海",name_fr: "shanghai",dict_type_id: @dt_stu_city.id
75
- @dy_beijing=Dictionary.create! name_en: "beijing",name_zh: "北京",name_fr: "Pékin",dict_type_id: @dt_stu_city.id
76
- @stu_beijing=Student.create! email: "beijing@dict.com",city: @dy_beijing.id
77
- @stu_shanghai=Student.create! email: "shanghai@dict.com",city: @dy_shanghai.id
78
- end
79
-
80
- def teardown
81
- teardown_db
82
- end
83
-
84
- def test_tab_and_column
85
- expected_hash={:student => %w[city school]}
86
- assert_equal expected_hash,DictType.tab_and_column
87
- end
88
-
89
- def test_all_types
90
- assert_equal %w[student_city student_school],DictType.all_types
91
- end
92
-
93
- # test revert method in acts_as_dict_type
94
- def test_dt_revert
95
- assert_equal "student_school",DictType.revert(@dt_stu_school.id)
96
- assert_equal nil,DictType.revert(100)
97
- end
98
-
99
- # test dynamic instance methods in slave model
100
- def test_named_city
101
- Student.acts_as_dict_slave
102
- # the acts_as_dict_slave need real data to generate dynamic method
103
- assert_equal %w[city school],Student.columns_in_dict_type
104
- assert_equal %w[city school],Student.dict_columns
105
- assert_equal "shanghai",@stu_shanghai.named_city(:en)
106
- assert_equal "shanghai",@stu_shanghai.named_city("")
107
- assert_equal "Pékin",@stu_beijing.named_city(:fr)
108
- end
109
-
110
- def test_named_city_with_default_locale
111
- Student.acts_as_dict_slave :locale => :fr
112
- assert_equal "Pékin",@stu_beijing.named_city
113
- end
114
-
115
- def test_dictionary_method_missing
116
- assert_equal [["beijing",2],["shanghai",1]],Dictionary.student_city(:locale => :en)
117
- end
118
-
119
- def test_dictionary_method_missing_with_locale
120
- assert_equal [["上海", 1],["北京", 2]],Dictionary.student_city(:locale => :zh)
121
- end
122
-
123
- def test_delete_dicts_cache
124
- @dy_wuhan=Dictionary.create! name_en: "wuhan",name_zh: "武汉",name_fr: "wuhan",dict_type_id: @dt_stu_city.id
125
- assert_equal [["beijing", 2],["shanghai",1],["wuhan", 3]],Dictionary.student_city(:locale => :en)
126
- @dy_wuhan.destroy
127
- assert_equal [["beijing", 2],["shanghai",1]],Dictionary.student_city(:locale => :en)
128
- assert_equal [@dy_shanghai,@dy_beijing],Dictionary.student_city
129
- end
130
-
131
- def test_delete_all_caches
132
- assert_equal %w[student_city student_school],DictType.all_types
133
- @dt_stu_school.destroy
134
- assert_equal %w[student_city],DictType.all_types
135
- end
136
-
137
- end