activerecord_translatable 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +35 -36
  3. data/Rakefile +9 -19
  4. data/lib/activerecord_translatable.rb +7 -14
  5. data/lib/activerecord_translatable/extension.rb +1 -1
  6. data/lib/version.rb +1 -1
  7. data/spec/activerecord_translateable_spec.rb +127 -118
  8. data/spec/spec_helper.rb +5 -9
  9. metadata +39 -101
  10. data/spec/dummy/README.rdoc +0 -261
  11. data/spec/dummy/Rakefile +0 -7
  12. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  13. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  14. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  15. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  16. data/spec/dummy/app/models/foo.rb +0 -2
  17. data/spec/dummy/app/models/noarraything.rb +0 -4
  18. data/spec/dummy/app/models/something.rb +0 -3
  19. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  20. data/spec/dummy/config.ru +0 -4
  21. data/spec/dummy/config/application.rb +0 -65
  22. data/spec/dummy/config/boot.rb +0 -10
  23. data/spec/dummy/config/database.yml +0 -29
  24. data/spec/dummy/config/environment.rb +0 -5
  25. data/spec/dummy/config/environments/development.rb +0 -37
  26. data/spec/dummy/config/environments/production.rb +0 -67
  27. data/spec/dummy/config/environments/test.rb +0 -37
  28. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  29. data/spec/dummy/config/initializers/i18n_backend.rb +0 -1
  30. data/spec/dummy/config/initializers/inflections.rb +0 -15
  31. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  32. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  33. data/spec/dummy/config/initializers/session_store.rb +0 -8
  34. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  35. data/spec/dummy/config/locales/en.yml +0 -5
  36. data/spec/dummy/config/routes.rb +0 -58
  37. data/spec/dummy/db/migrate/20121015083259_create_somethings.rb +0 -8
  38. data/spec/dummy/db/migrate/20130124094113_create_foo.rb +0 -7
  39. data/spec/dummy/db/migrate/20130124100555_create_noarraythings.rb +0 -9
  40. data/spec/dummy/db/schema.rb +0 -33
  41. data/spec/dummy/log/development.log +0 -423
  42. data/spec/dummy/log/test.log +0 -7826
  43. data/spec/dummy/public/404.html +0 -26
  44. data/spec/dummy/public/422.html +0 -26
  45. data/spec/dummy/public/500.html +0 -25
  46. data/spec/dummy/public/favicon.ico +0 -0
  47. data/spec/dummy/script/rails +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a2305935744b3ad79c98ae02f539b3f46233727
4
- data.tar.gz: 7da5ed33858f314a7721bc663dd3b09cb352a21d
3
+ metadata.gz: 718f885dad1df1a6ef66c4e00661c60ce7853238
4
+ data.tar.gz: 86226beac98c3c53e76ae0417470750a5370ce35
5
5
  SHA512:
6
- metadata.gz: a386b24a17d2bfbb1b910fc0cbbffeccbc5488105a29b14de5ec2e192efbb1ddd6784b302076e4b08835d2c90cabc4001b1717e63dfd882404cf3f5330ea2477
7
- data.tar.gz: e197e4a95c6efc56019718391de3e0877b7cea89fe7e0ad0416339aa41189941584e3276c81bf940fc9352c84cfcc7b39c98e73cf2dd1faf9f502f141a57b8b0
6
+ metadata.gz: d715d08d519140dd0cdded92914c3301fc03fa05aded68221bbc2e6c9bd43bda22e2ae9f9cb4b45d5512ef042f2347bfa7f7dcfb10af950bc9c7596f0f7abf52
7
+ data.tar.gz: c03b5a00ac340ddd8f111fdb959a07d68e204a4a2d1098795f220f696c230334ae2b974b9138815eec4bb94096b553a09c5607a572a189d225ab21e1f8ff7d94
@@ -6,7 +6,16 @@ Make attributes of an ActiveRecord Model translatable, and store the
6
6
  translations in the provided I18n backend. This is really helpful if there
7
7
  already is, a interface to provide ie missing translations for elements in I18n.
8
8
 
9
+ == Install
10
+
11
+ Add
12
+
13
+ gem "activerecord_translatable"
14
+
15
+ to your gemfile, this should work for rails 3 and above.
16
+
9
17
  == Usage
18
+
10
19
  Use inside of the model
11
20
 
12
21
  class MyModel < ActiveRecord::Base
@@ -22,40 +31,47 @@ Use inside of the model
22
31
  mymodel.title_wk # => "Woohhaakkk"
23
32
 
24
33
  == Prerequisites
34
+
25
35
  To save the locales ActiveRecordTranslatable saves an array of the specified locale, for
26
- this to work, the database needs the ability to save arrays. The easiest way to
27
- handle this in postgres is via the postgres array
36
+ this to work, the database needs the ability to save arrays. The easiest way to
37
+ handle this is to use ActiveRecords ability to serialize.
28
38
 
29
- gem 'activerecord-postgres-array'
39
+ class MyModel < ActiveRecord::Base
40
+ serialize :locales
41
+ translate :name
42
+ end
30
43
 
31
- To add the array to the model the migration looks like this
44
+ And add the column as a string
32
45
 
33
46
  class CreateMyModel < ActiveRecord::Migration
34
47
  def change
35
48
  create_table :my_model do |t|
36
- t.string_array :locales
49
+ t.string :locales
37
50
  end
38
51
  end
39
52
  end
40
53
 
41
- If your database does not support native array types you can use ActiveRecords
42
- ability to serialize the locales array
54
+ If you are using postgres you can also use the native postgres array
43
55
 
44
- class MyModel < ActiveRecord::Base
45
- serialize :locales
46
- translate :name
47
- end
56
+ gem 'activerecord-postgres-array'
48
57
 
49
- And add the column as a string
58
+ To add the array to the model the migration looks like this
50
59
 
51
60
  class CreateMyModel < ActiveRecord::Migration
52
61
  def change
53
62
  create_table :my_model do |t|
54
- t.string :locales
63
+ t.string_array :locales
55
64
  end
56
65
  end
57
66
  end
58
67
 
68
+ And the model does not need to know anything about this
69
+
70
+ class MyModel < ActiveRecord::Base
71
+ translate :name
72
+ end
73
+
74
+
59
75
  == How it works
60
76
 
61
77
  Translateable saves the translation via I18n.backend.store_translations, this
@@ -63,31 +79,14 @@ means that the backend has to be able to store new items. So backend needs to
63
79
  be for example the KeyValue or ActiveRecord one.
64
80
  More http://railscasts.com/episodes/256-i18n-backends
65
81
 
66
- == Miscellaneous
67
-
68
- === Tests
69
- The tests are using rspec, and there is a dummy app setup in the spec directory.
70
- Since the example is using postgres, to get the tests working there needs to be
71
- a setup postgres user with the needed rights.
72
-
73
- $ createuser -h localhost
74
- Enter name of role to add: translatable
75
- Shall the new role be a superuser? (y/n) n
76
- Shall the new role be allowed to create databases? (y/n) y
77
- Shall the new role be allowed to create more new roles? (y/n) n
78
-
79
- Afterwards the db needs to be setup
82
+ == Tests
80
83
 
81
- $ cd spec/dummy
82
- $ rake db:create
83
- $ rake db:migrate
84
- $ rake db:test:prepare
84
+ The tests are using rspec and an im memory sqlite database, so all that is needed is to run
85
85
 
86
- Now the test can be run via
86
+ $ rake spec
87
87
 
88
- $ rspec
88
+ == Current State
89
89
 
90
- === Current State
91
- The gem is still in early development and has just been extracted from a
92
- project. So any bug reports and contributions are highly welcome.
90
+ This has been extracted form an Rails application so it should be pretty stable
91
+ by now. Any contributions and fixes are of course highly welcome!
93
92
 
data/Rakefile CHANGED
@@ -1,19 +1,15 @@
1
- #!/usr/bin/env rake
2
1
  begin
3
2
  require 'bundler/setup'
4
3
  rescue LoadError
5
4
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
5
  end
7
- begin
8
- require 'rdoc/task'
9
- require 'rspec/core/rake_task'
10
- rescue LoadError
11
- require 'rdoc/rdoc'
12
- require 'rake/rdoctask'
13
- RDoc::Task = Rake::RDocTask
14
- end
15
6
 
16
- RDoc::Task.new(:rdoc) do |rdoc|
7
+ require 'rdoc/task'
8
+ require 'rspec/core/rake_task'
9
+
10
+ require "rake/clean"
11
+
12
+ RDoc::Task.new do |rdoc|
17
13
  rdoc.rdoc_dir = 'rdoc'
18
14
  rdoc.title = 'Translatable'
19
15
  rdoc.options << '--line-numbers'
@@ -24,15 +20,9 @@ end
24
20
  Bundler::GemHelper.install_tasks
25
21
 
26
22
  desc 'Default: run the specs'
27
- task :default => 'spec:unit'
23
+ task :default => :spec
28
24
 
29
- namespace :spec do
30
- desc "Run unit specs"
31
- RSpec::Core::RakeTask.new('unit') do |t|
32
- t.pattern = 'spec/{*_spec.rb}'
33
- end
25
+ RSpec::Core::RakeTask.new do |t|
26
+ t.pattern = 'spec/{*_spec.rb}'
34
27
  end
35
28
 
36
- desc "Run the unit specs"
37
- task :spec => ['spec:unit']
38
-
@@ -1,26 +1,19 @@
1
1
  require "active_record"
2
2
  require "active_support/concern"
3
- require "rails"
4
3
  require "activerecord_translatable/extension"
5
4
 
6
5
  module ActiveRecordTranslatable
6
+ begin
7
+ require "rails"
7
8
 
8
- class Railtie < Rails::Railtie
9
- initializer "activerecord_translatable.load_into_active_record" do
10
- ActiveSupport.on_load :active_record do
11
- ActiveRecordTranslatable::Railtie.load
12
- end
13
- end
14
- end
15
-
16
- class Railtie
17
- class << self
18
- def load
19
- if defined?(ActiveRecord)
9
+ class Railtie < Rails::Railtie
10
+ initializer "activerecord_translatable.load_into_active_record" do
11
+ ActiveSupport.on_load :active_record do
20
12
  ActiveRecord::Base.send(:include, ActiveRecordTranslatable)
21
13
  end
22
14
  end
23
15
  end
16
+ rescue LoadError
17
+ ActiveRecord::Base.send(:include, ActiveRecordTranslatable) if defined?(ActiveRecord)
24
18
  end
25
-
26
19
  end
@@ -7,7 +7,7 @@ module ActiveRecordTranslatable
7
7
  # Saving and loading translations works by using +<attribute>_<local>+ to
8
8
  # read and write the attribute
9
9
  #
10
- # class Thing
10
+ # class Thing < ActiveRecord::Base
11
11
  # translate :name
12
12
  # end
13
13
  #
@@ -1,5 +1,5 @@
1
1
  module ActiveRecordTranslatable
2
2
 
3
- VERSION = "0.0.9" # :nodoc:
3
+ VERSION = "0.1.0" # :nodoc:
4
4
 
5
5
  end
@@ -1,124 +1,133 @@
1
1
  require 'spec_helper'
2
2
 
3
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
4
+ ActiveRecord::Schema.verbose = false
5
+
6
+ def setup_db
7
+ ActiveRecord::Base.connection.create_table :somethings do |t|
8
+ t.string :locales
9
+ end
10
+
11
+ ActiveRecord::Base.connection.create_table :foos do |t|
12
+ end
13
+ end
14
+
15
+ class Something < ActiveRecord::Base
16
+ serialize :locales
17
+ translate :name
18
+ end
19
+
20
+ class Foo < ActiveRecord::Base
21
+ end
22
+
3
23
  describe "ActiveRecordTranslateable" do
24
+ before(:all) { setup_db }
25
+
26
+ it "makes name translateable" do
27
+ Something.class_eval { translate :foo }
28
+ Something.translatable.should include(:foo)
29
+ end
30
+
31
+ context "class without translations" do
32
+ it "saves" do
33
+ foo = Foo.new
34
+ foo.save.should be_true
35
+ end
36
+ it "loads" do
37
+ foo = Foo.create!
38
+ Foo.find(foo.id).should_not be_nil
39
+ end
40
+ end
41
+
42
+ context "custom created methods" do
43
+ it "responds to translated attributes" do
44
+ something = Something.new
45
+ something.should respond_to(:name)
46
+ something.should respond_to(:name=)
47
+ something.should respond_to(:name_de)
48
+ something.should respond_to(:name_de=)
49
+ end
50
+ end
51
+
52
+ context "attributes" do
53
+ before(:each) do
54
+ @locale = I18n.locale
55
+ end
56
+
57
+ after(:each) do
58
+ I18n.locale = @locale
59
+ end
60
+
61
+ it "read/writes by hash assignment" do
62
+ something = Something.new(name: "Something", name_de: "Etwas")
63
+ something.name.should == "Something"
64
+ something.name_de.should == "Etwas"
65
+ end
66
+
67
+ it "read/writes from database" do
68
+ something = Something.create!(name: "Something", name_de: "Etwas")
69
+ something.reload
70
+ something.name.should == "Something"
71
+ something.name_de.should == "Etwas"
72
+ end
73
+
74
+ it "reads by locale" do
75
+ something = Something.create!(name_de: "Etwas")
76
+ I18n.locale = :de
77
+ something.name.should == "Etwas"
78
+ end
79
+
80
+ it "writes by locale" do
81
+ I18n.locale = :de
82
+ something = Something.create!(name: "Etwas", name_en: "Something")
83
+ I18n.locale = :en
84
+ something.name_de.should == "Etwas"
85
+ something.name.should == "Something"
86
+ end
87
+ end
88
+
89
+ context "store translations" do
90
+ let(:something) { Something.create(name: "Something") }
91
+
92
+ it "writes stored translations to the backend" do
93
+ i18n_key = "something.name-#{something.id}"
94
+ backend = double("Backend")
95
+ I18n.stub(:backend).and_return(backend)
96
+ backend.should_receive(:store_translations)
97
+ .with(:en, { i18n_key => "Something" }, escape: false)
98
+ something.save
99
+ end
100
+
101
+ it "should save the model without translations" do
102
+ something = Something.new
103
+ something.save.should be_true
104
+ end
105
+
106
+ it "should not include a read locale unless set to something" do
107
+ something.name_gr
108
+ something.locales.should_not include("gr")
109
+ end
110
+ end
111
+
112
+ context "translation store" do
113
+ before(:each) do
114
+ @backend = double("Backend")
115
+ I18n.stub(:backend).and_return(@backend)
116
+ end
117
+ it "is called on save" do
118
+ @backend.should_receive(:store_translations).twice
119
+ Something.new(name: 'something', name_de: 'etwas').save
120
+ end
121
+
122
+ it "is called on create" do
123
+ @backend.should_receive(:store_translations).twice
124
+ Something.create(name: 'something', name_de: 'etwas')
125
+ end
4
126
 
5
- it "makes name translateable" do
6
- Something.class_eval { translate :foo }
7
- Something.translatable.should include(:foo)
8
- end
9
-
10
- context "class without translations" do
11
- it "saves" do
12
- foo = Foo.new
13
- foo.save.should be_true
14
- end
15
- it "loads" do
16
- foo = Foo.create!
17
- Foo.find(foo.id).should_not be_nil
18
- end
19
- end
20
-
21
- context "custom created methods" do
22
- it "responds to translated attributes" do
23
- something = Something.new
24
- something.should respond_to(:name)
25
- something.should respond_to(:name=)
26
- something.should respond_to(:name_de)
27
- something.should respond_to(:name_de=)
28
- end
29
- end
30
-
31
- context "attributes" do
32
- before(:each) do
33
- @locale = I18n.locale
34
- end
35
-
36
- after(:each) do
37
- I18n.locale = @locale
38
- end
39
-
40
- it "read/writes by hash assignment" do
41
- something = Something.new(name: "Something", name_de: "Etwas")
42
- something.name.should == "Something"
43
- something.name_de.should == "Etwas"
44
- end
45
-
46
- it "read/writes from database" do
47
- something = Something.create!(name: "Something", name_de: "Etwas")
48
- something.reload
49
- something.name.should == "Something"
50
- something.name_de.should == "Etwas"
51
- end
52
-
53
- it "reads by locale" do
54
- something = Something.create!(name_de: "Etwas")
55
- I18n.locale = :de
56
- something.name.should == "Etwas"
57
- end
58
-
59
- it "writes by locale" do
60
- I18n.locale = :de
61
- something = Something.create!(name: "Etwas", name_en: "Something")
62
- I18n.locale = :en
63
- something.name_de.should == "Etwas"
64
- something.name.should == "Something"
65
- end
66
- end
67
-
68
- context "store translations" do
69
- let(:something) { Something.create(name: "Something") }
70
-
71
- it "writes stored translations to the backend" do
72
- i18n_key = "something.name-#{something.id}"
73
- backend = double("Backend")
74
- I18n.stub(:backend).and_return(backend)
75
- backend.should_receive(:store_translations)
76
- .with(:en, { i18n_key => "Something" }, escape: false)
77
- something.save
78
- end
79
-
80
- it "should save the model without translations" do
81
- something = Something.new
82
- something.save.should be_true
83
- end
84
-
85
- it "should not include a read locale unless set to something" do
86
- something.name_gr
87
- something.locales.should_not include("gr")
88
- end
89
- end
90
-
91
- context "translation store" do
92
- before(:each) do
93
- @backend = double("Backend")
94
- I18n.stub(:backend).and_return(@backend)
95
- end
96
- it "is called on save" do
97
- @backend.should_receive(:store_translations).twice
98
- Something.new(name: 'something', name_de: 'etwas').save
99
- end
100
-
101
- it "is called on create" do
102
- @backend.should_receive(:store_translations).twice
103
- Something.create(name: 'something', name_de: 'etwas')
104
- end
105
-
106
- it "is called on update" do
107
- @backend.should_receive(:store_translations).exactly(4)
108
- sth = Something.create(name: 'something_old', name_de: 'etwas_old')
109
- sth.update_attributes(name: 'something', name_de: 'etwas')
110
- end
111
- end
112
-
113
- context "db array support" do
114
- it "works with native support" do
115
- something = Something.create!(name: "Something", name_de: "Etwas")
116
- something.reload.available_locales.should include(:en, :de)
117
- end
118
-
119
- it "works with serialize" do
120
- thing = Noarraything.create!(name: "thing", name_de: "ding")
121
- thing.reload.available_locales.should include(:en, :de)
122
- end
127
+ it "is called on update" do
128
+ @backend.should_receive(:store_translations).exactly(4)
129
+ sth = Something.create(name: 'something_old', name_de: 'etwas_old')
130
+ sth.update_attributes(name: 'something', name_de: 'etwas')
123
131
  end
132
+ end
124
133
  end