globalize3 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source :rubygems
2
+
3
+ gem 'activerecord', '>= 3.0.0.rc'
4
+
5
+ group :test do
6
+ gem 'test_declarative'
7
+ gem 'database_cleaner'
8
+ gem 'pathname_local'
9
+ gem 'mocha'
10
+ # gem 'vestal_versions', :git => 'git@github.com:svenfuchs/vestal_versions.git'
11
+ gem 'vestal_versions', :path => '/Volumes/Users/sven/Development/projects/vestal_versions'
12
+ gem 'ruby-debug'
13
+ gem 'sqlite3-ruby'
14
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,51 @@
1
+ PATH
2
+ remote: /Volumes/Users/sven/Development/projects/vestal_versions
3
+ specs:
4
+ vestal_versions (1.0.2)
5
+ activerecord (>= 2.1.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ activemodel (3.0.0.rc)
11
+ activesupport (= 3.0.0.rc)
12
+ builder (~> 2.1.2)
13
+ i18n (~> 0.4.1)
14
+ activerecord (3.0.0.rc)
15
+ activemodel (= 3.0.0.rc)
16
+ activesupport (= 3.0.0.rc)
17
+ arel (~> 0.4.0)
18
+ tzinfo (~> 0.3.22)
19
+ activesupport (3.0.0.rc)
20
+ arel (0.4.0)
21
+ activesupport (>= 3.0.0.beta)
22
+ builder (2.1.2)
23
+ columnize (0.3.1)
24
+ database_cleaner (0.5.2)
25
+ i18n (0.4.1)
26
+ linecache (0.43)
27
+ mocha (0.9.8)
28
+ rake
29
+ pathname_local (0.0.2)
30
+ rake (0.8.7)
31
+ ruby-debug (0.10.3)
32
+ columnize (>= 0.1)
33
+ ruby-debug-base (~> 0.10.3.0)
34
+ ruby-debug-base (0.10.3)
35
+ linecache (>= 0.3)
36
+ sqlite3-ruby (1.3.1)
37
+ test_declarative (0.0.3)
38
+ tzinfo (0.3.22)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ activerecord (>= 3.0.0.rc)
45
+ database_cleaner
46
+ mocha
47
+ pathname_local
48
+ ruby-debug
49
+ sqlite3-ruby
50
+ test_declarative
51
+ vestal_versions!
data/README.textile CHANGED
@@ -56,6 +56,20 @@ end
56
56
 
57
57
  Note that the ActiveRecord model @Post@ must already exist and have a @translates@ directive listing the translated fields.
58
58
 
59
+ h2. Versioning with Globalize3
60
+
61
+ Globalize3 nicely integrates with "vestal_versions":http://github.com/laserlemon/vestal_versions:
62
+
63
+ <pre><code>
64
+ require 'globalize/versioning/vestal_versions'
65
+ </code></pre>
66
+
67
+ As of writing (2010-08-05) the original vestal_versions respository has not been updated to be compatible with Rails 3 though. You can use "this fork":http://github.com/svenfuchs/vestal_versions though. "Globalize3's Gemfile":http://github.com/svenfuchs/globalize3/blob/master/Gemfile#L10 is currently set up accordingly.
68
+
69
+ Please also note that @update_attribute@ currently hides itself from dirty tracking in ActiveRecord >= 3.0.0.beta (which is considered a "regression":http://github.com/rails/rails/commit/01629d180468049d17a8be6900e27a4f0d2b18c4#commitcomment-123199). That means that you currently need to use attribute writers or @update_attributes@ in order to track changes/versions for your models.
70
+
71
+ Also, please see the tests in test/globalize3/versioning_test.rb for some current gotchas.
72
+
59
73
  h2. Changes since Globalize2
60
74
 
61
75
  * `translation_table_name` was renamed to `translations_table_name`
@@ -7,13 +7,13 @@ module Globalize
7
7
  options = attr_names.extract_options!
8
8
  options[:table_name] ||= "#{table_name.singularize}_translations"
9
9
 
10
- include InstanceMethods
11
- extend ClassMethods, Migration
12
-
13
10
  class_inheritable_accessor :translated_attribute_names, :translation_options
14
11
  self.translated_attribute_names = attr_names.map(&:to_sym)
15
12
  self.translation_options = options
16
13
 
14
+ include InstanceMethods
15
+ extend ClassMethods, Migration
16
+
17
17
  has_many :translations, :class_name => translation_class.name,
18
18
  :foreign_key => class_name.foreign_key,
19
19
  :dependent => :delete_all,
@@ -5,27 +5,29 @@ module Globalize
5
5
  # The stash keeps track of new or changed values that need to be saved.
6
6
  attr_reader :record, :cache, :stash
7
7
 
8
+ delegate :translation_class, :to => :'record.class'
9
+
8
10
  def initialize(record)
9
11
  @record = record
10
12
  @cache = Attributes.new
11
13
  @stash = Attributes.new
12
14
  end
13
15
 
14
- def fetch(locale, attr_name)
15
- cache.contains?(locale, attr_name) ?
16
- cache.read(locale, attr_name) :
17
- cache.write(locale, attr_name, fetch_attribute(locale, attr_name))
16
+ def fetch(locale, name)
17
+ cache.contains?(locale, name) ?
18
+ type_cast(name, cache.read(locale, name)) :
19
+ cache.write(locale, name, fetch_attribute(locale, name))
18
20
  end
19
21
 
20
- def write(locale, attr_name, value)
21
- stash.write(locale, attr_name, value)
22
- cache.write(locale, attr_name, value)
22
+ def write(locale, name, value)
23
+ stash.write(locale, name, value)
24
+ cache.write(locale, name, value)
23
25
  end
24
26
 
25
27
  def save_translations!
26
28
  stash.each do |locale, attrs|
27
29
  translation = record.translations.find_or_initialize_by_locale(locale.to_s)
28
- attrs.each { |attr_name, value| translation[attr_name] = value }
30
+ attrs.each { |name, value| translation[name] = value }
29
31
  translation.save!
30
32
  end
31
33
  stash.clear
@@ -37,6 +39,24 @@ module Globalize
37
39
 
38
40
  protected
39
41
 
42
+ def type_cast(name, value)
43
+ if value.nil?
44
+ nil
45
+ elsif column = column_for_attribute(name)
46
+ column.type_cast(value)
47
+ else
48
+ value
49
+ end
50
+ end
51
+
52
+ def column_for_attribute(name)
53
+ translation_class.columns_hash[name.to_s]
54
+ end
55
+
56
+ def unserializable_attribute?(name, column)
57
+ column.text? && translation_class.serialized_attributes[name.to_s]
58
+ end
59
+
40
60
  def fetch_translation(locale)
41
61
  locale = locale.to_sym
42
62
  record.translations.loaded? ? record.translations.detect { |t| t.locale == locale } :
@@ -49,13 +69,13 @@ module Globalize
49
69
  record.translations.with_locales(Globalize.fallbacks(locale))
50
70
  end
51
71
 
52
- def fetch_attribute(locale, attr_name)
72
+ def fetch_attribute(locale, name)
53
73
  translations = fetch_translations(locale)
54
74
  value, requested_locale = nil, locale
55
75
 
56
76
  Globalize.fallbacks(locale).each do |fallback|
57
77
  translation = translations.detect { |t| t.locale == fallback }
58
- value = translation && translation.send(attr_name)
78
+ value = translation && translation.send(name)
59
79
  locale = fallback && break if value
60
80
  end
61
81
 
@@ -10,16 +10,16 @@ module Globalize
10
10
  self.fetch(locale)
11
11
  end
12
12
 
13
- def contains?(locale, attr_name)
14
- self[locale].has_key?(attr_name)
13
+ def contains?(locale, name)
14
+ self[locale].has_key?(name.to_s)
15
15
  end
16
16
 
17
- def read(locale, attr_name)
18
- self[locale][attr_name]
17
+ def read(locale, name)
18
+ self[locale][name.to_s]
19
19
  end
20
20
 
21
- def write(locale, attr_name, value)
22
- self[locale][attr_name] = value
21
+ def write(locale, name, value)
22
+ self[locale][name.to_s] = value
23
23
  end
24
24
  end
25
25
  end
@@ -27,7 +27,7 @@ module Globalize
27
27
  end
28
28
 
29
29
  def translated?(name)
30
- translated_attribute_names.include?(name)
30
+ translated_attribute_names.include?(name.to_sym)
31
31
  end
32
32
 
33
33
  def required_attributes
@@ -72,10 +72,10 @@ module Globalize
72
72
 
73
73
  def translated_attr_accessor(name)
74
74
  define_method(:"#{name}=") do |value|
75
- self[name] = globalize.write(Globalize.locale, name, value)
75
+ write_attribute(name, value, Globalize.locale)
76
76
  end
77
77
  define_method(name) do |*args|
78
- globalize.fetch(args.first || Globalize.locale, name)
78
+ read_attribute(name, args.first || Globalize.locale)
79
79
  end
80
80
  alias_method :"#{name}_before_type_cast", name
81
81
  end
@@ -0,0 +1,19 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ module Exceptions
4
+ class MigrationError < StandardError; end
5
+
6
+ class BadFieldName < MigrationError
7
+ def initialize(field)
8
+ super("Missing translated field #{field.inspect}")
9
+ end
10
+ end
11
+
12
+ class BadFieldType < MigrationError
13
+ def initialize(name, type)
14
+ super("Bad field type for field #{name.inspect} (#{type.inspect}), should be :string or :text")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -4,7 +4,7 @@ module Globalize
4
4
  delegate :translated_locales, :to => :translations
5
5
 
6
6
  def globalize
7
- @globalize ||= Adapter.new self
7
+ @globalize ||= Adapter.new(self)
8
8
  end
9
9
 
10
10
  def attributes
@@ -15,13 +15,34 @@ module Globalize
15
15
  with_given_locale(attributes) { super }
16
16
  end
17
17
 
18
+ def update_attributes!(attributes, *args)
19
+ with_given_locale(attributes) { super }
20
+ end
21
+
18
22
  def update_attributes(attributes, *args)
19
23
  with_given_locale(attributes) { super }
20
24
  end
21
25
 
26
+ def write_attribute(name, value, locale = nil)
27
+ super(name, value)
28
+ globalize.write(locale || Globalize.locale, name, value) if translated?(name)
29
+ end
30
+
31
+ def read_attribute(name, locale = nil)
32
+ if self.class.translated?(name)
33
+ globalize.fetch(locale || Globalize.locale, name)
34
+ else
35
+ super(name)
36
+ end
37
+ end
38
+
22
39
  def attribute_names
23
40
  translated_attribute_names.map(&:to_s) + super
24
41
  end
42
+
43
+ def translated?(name)
44
+ self.class.translated?(name)
45
+ end
25
46
 
26
47
  def translated_attributes
27
48
  translated_attribute_names.inject({}) do |attributes, name|
@@ -1,44 +1,108 @@
1
+ require 'digest/sha1'
2
+
1
3
  module Globalize
2
4
  module ActiveRecord
3
5
  module Migration
4
- def create_translation_table!(fields)
5
- translated_attribute_names.each do |f|
6
- raise MigrationMissingTranslatedField, "Missing translated field #{f}" unless fields[f]
6
+ attr_reader :globalize_migrator
7
+
8
+ def globalize_migrator
9
+ @globalize_migrator ||= Migrator.new(self)
10
+ end
11
+
12
+ delegate :create_translation_table!, :drop_translation_table!,
13
+ :translation_index_name, :to => :globalize_migrator
14
+
15
+ class Migrator
16
+ include Globalize::ActiveRecord::Exceptions
17
+
18
+ attr_reader :model, :fields
19
+ delegate :translated_attribute_names, :connection, :table_name,
20
+ :table_name_prefix, :translations_table_name, :columns, :to => :model
21
+
22
+ def initialize(model)
23
+ @model = model
24
+ end
25
+
26
+ def create_translation_table!(fields = {}, options = {})
27
+ @fields = fields
28
+ complete_translated_fields
29
+ validate_translated_fields
30
+
31
+ create_translation_table
32
+ move_data_to_translation_table if options[:migrate_data]
33
+ create_translations_index
34
+ end
35
+
36
+ def drop_translation_table!(options = {})
37
+ move_data_to_model_table if options[:migrate_data]
38
+ drop_translations_index
39
+ drop_translation_table
7
40
  end
8
41
 
9
- fields.each do |name, type|
10
- if translated_attribute_names.include?(name) && ![:string, :text].include?(type)
11
- raise BadMigrationFieldType, "Bad field type for #{name}, should be :string or :text"
42
+ def complete_translated_fields
43
+ translated_attribute_names.each do |name|
44
+ fields[name] = column_type(name) unless fields[name]
12
45
  end
13
46
  end
14
47
 
15
- self.connection.create_table(translations_table_name) do |t|
16
- t.references table_name.sub(/^#{table_name_prefix}/, "").singularize
17
- t.string :locale
48
+ def create_translation_table
49
+ connection.create_table(translations_table_name) do |t|
50
+ t.references table_name.sub(/^#{table_name_prefix}/, '').singularize
51
+ t.string :locale
52
+ fields.each { |name, type| t.column name, type }
53
+ t.timestamps
54
+ end
55
+ end
56
+
57
+ def create_translations_index
58
+ connection.add_index(
59
+ translations_table_name,
60
+ "#{table_name.sub(/^#{table_name_prefix}/, "").singularize}_id",
61
+ :name => translation_index_name
62
+ )
63
+ end
64
+
65
+ def drop_translation_table
66
+ connection.drop_table(translations_table_name)
67
+ end
68
+
69
+ def drop_translations_index
70
+ connection.remove_index(translations_table_name, :name => translation_index_name) rescue nil
71
+ end
72
+
73
+ def move_data_to_translation_table
74
+ # TODO
75
+ end
76
+
77
+ def move_data_to_model_table
78
+ # TODO
79
+ end
80
+
81
+ def validate_translated_fields
18
82
  fields.each do |name, type|
19
- t.column name, type
83
+ raise BadFieldName.new(name) unless valid_field_name?(name)
84
+ raise BadFieldType.new(name, type) unless valid_field_type?(name, type)
20
85
  end
21
- t.timestamps
22
86
  end
23
87
 
24
- self.connection.add_index(
25
- translations_table_name,
26
- "#{table_name.sub(/^#{table_name_prefix}/, "").singularize}_id",
27
- :name => translation_index_name
28
- )
29
- end
88
+ def column_type(name)
89
+ columns.detect { |c| c.name == name.to_s }.try(:type)
90
+ end
30
91
 
31
- def translation_index_name
32
- require 'digest/sha1'
33
- # FIXME what's the max size of an index name?
34
- index_name = "index_#{translations_table_name}_on_#{self.table_name.singularize}_id"
35
- index_name.size < 50 ? index_name : "index_#{Digest::SHA1.hexdigest(index_name)}"
36
- end
92
+ def valid_field_name?(name)
93
+ translated_attribute_names.include?(name)
94
+ end
95
+
96
+ def valid_field_type?(name, type)
97
+ !translated_attribute_names.include?(name) || [:string, :text].include?(type)
98
+ end
37
99
 
38
- def drop_translation_table!
39
- self.connection.remove_index(translations_table_name, :name => translation_index_name) rescue nil
40
- self.connection.drop_table(translations_table_name)
100
+ def translation_index_name
101
+ # FIXME what's the max size of an index name?
102
+ index_name = "index_#{translations_table_name}_on_#{table_name.singularize}_id"
103
+ index_name.size < 50 ? index_name : "index_#{Digest::SHA1.hexdigest(index_name)}"
104
+ end
41
105
  end
42
106
  end
43
107
  end
44
- end
108
+ end
@@ -1,13 +1,10 @@
1
1
  module Globalize
2
- class MigrationError < StandardError; end
3
- class MigrationMissingTranslatedField < MigrationError; end
4
- class BadMigrationFieldType < MigrationError; end
5
-
6
2
  module ActiveRecord
7
3
  autoload :ActMacro, 'globalize/active_record/act_macro'
8
4
  autoload :Adapter, 'globalize/active_record/adapter'
9
5
  autoload :Attributes, 'globalize/active_record/attributes'
10
6
  autoload :ClassMethods, 'globalize/active_record/class_methods'
7
+ autoload :Exceptions, 'globalize/active_record/exceptions'
11
8
  autoload :InstanceMethods, 'globalize/active_record/instance_methods'
12
9
  autoload :Migration, 'globalize/active_record/migration'
13
10
  autoload :Translation, 'globalize/active_record/translation'
@@ -1,3 +1,3 @@
1
1
  module Globalize
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -0,0 +1,35 @@
1
+ require 'vestal_versions'
2
+
3
+ module Globalize
4
+ module Versioning
5
+ module VestalVersions
6
+ def versioned_columns
7
+ super + self.class.translated_attribute_names
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ ActiveRecord::Base.class_eval do
14
+ class << self
15
+ def versioned_with_globalize(*args)
16
+ versioned_without_globalize(*args)
17
+ include Globalize::Versioning::VestalVersions
18
+ end
19
+ alias_method_chain :versioned, :globalize
20
+ end
21
+ end
22
+
23
+ VestalVersions::Version.class_eval do
24
+ before_save do |version|
25
+ version.locale = Globalize.locale.to_s
26
+ end
27
+
28
+ class Condition
29
+ def to_sql
30
+ "locale = '#{Globalize.locale.to_s}'"
31
+ end
32
+ end
33
+
34
+ default_scope(:conditions => Condition.new)
35
+ end
@@ -0,0 +1,5 @@
1
+ module Globalize
2
+ module Versioning
3
+ autoload :VestalVersions, 'globalize/versioning/vestal_versions'
4
+ end
5
+ end
data/lib/globalize.rb CHANGED
@@ -1,22 +1,24 @@
1
1
  require 'patches/active_record/xml_attribute_serializer'
2
+ require 'patches/active_record/query_method'
2
3
 
3
4
  module Globalize
4
5
  autoload :ActiveRecord, 'globalize/active_record'
6
+ autoload :Versioning, 'globalize/versioning'
5
7
 
6
8
  class << self
7
9
  def locale
8
- defined?(@@locale) && @@locale || I18n.locale
10
+ read_locale || I18n.locale
9
11
  end
10
12
 
11
13
  def locale=(locale)
12
- @@locale = locale
14
+ set_locale(locale)
13
15
  end
14
16
 
15
17
  def with_locale(locale, &block)
16
- previous_locale = defined?(@@locale) && @@locale || nil
17
- self.locale = locale
18
+ previous_locale = read_locale
19
+ set_locale(locale)
18
20
  result = yield
19
- self.locale = previous_locale
21
+ set_locale(previous_locale)
20
22
  result
21
23
  end
22
24
 
@@ -27,6 +29,16 @@ module Globalize
27
29
  def fallbacks(locale = self.locale)
28
30
  fallbacks? ? I18n.fallbacks[locale] : [locale.to_sym]
29
31
  end
32
+
33
+ protected
34
+
35
+ def read_locale
36
+ Thread.current[:globalize_locale]
37
+ end
38
+
39
+ def set_locale(locale)
40
+ Thread.current[:globalize_locale] = locale
41
+ end
30
42
  end
31
43
  end
32
44
 
@@ -0,0 +1,35 @@
1
+ require 'active_record/attribute_methods/query'
2
+
3
+ module ActiveRecord
4
+ module AttributeMethods
5
+ module Query
6
+ def query_attribute(attr_name)
7
+ unless value = read_attribute(attr_name)
8
+ false
9
+ else
10
+ column = self.class.columns_hash[attr_name]
11
+ if column.nil?
12
+
13
+ # TODO submit a rails patch
14
+
15
+ # not sure what active_record tests say but i guess this should mean:
16
+ # call to_i and check zero? if the value is a Numeric or starts with
17
+ # a digit, so it can meaningfully be typecasted by to_i
18
+
19
+ # if Numeric === value || value !~ /[^0-9]/
20
+ if Numeric === value || value.to_s =~ /^[0-9]/
21
+ !value.to_i.zero?
22
+ else
23
+ return false if ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.include?(value)
24
+ !value.blank?
25
+ end
26
+ elsif column.number?
27
+ !value.zero?
28
+ else
29
+ !value.blank?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: globalize3
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2010-08-04 00:00:00 +02:00
21
+ date: 2010-08-15 00:00:00 +02:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -38,6 +38,104 @@ dependencies:
38
38
  version: 3.0.0.rc
39
39
  type: :runtime
40
40
  version_requirements: *id001
41
+ - !ruby/object:Gem::Dependency
42
+ name: database_cleaner
43
+ prerelease: false
44
+ requirement: &id002 !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ hash: 3
50
+ segments:
51
+ - 0
52
+ version: "0"
53
+ type: :development
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: pathname_local
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ type: :development
82
+ version_requirements: *id004
83
+ - !ruby/object:Gem::Dependency
84
+ name: test_declarative
85
+ prerelease: false
86
+ requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: vestal_versions
99
+ prerelease: false
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ type: :development
110
+ version_requirements: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ name: ruby-debug
113
+ prerelease: false
114
+ requirement: &id007 !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ type: :development
124
+ version_requirements: *id007
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3-ruby
127
+ prerelease: false
128
+ requirement: &id008 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ hash: 3
134
+ segments:
135
+ - 0
136
+ version: "0"
137
+ type: :development
138
+ version_requirements: *id008
41
139
  description: "Rails I18n: de-facto standard library for ActiveRecord 3 model/data translation."
42
140
  email: nobody@globalize-rails.org
43
141
  executables: []
@@ -51,16 +149,22 @@ files:
51
149
  - lib/globalize/active_record/adapter.rb
52
150
  - lib/globalize/active_record/attributes.rb
53
151
  - lib/globalize/active_record/class_methods.rb
152
+ - lib/globalize/active_record/exceptions.rb
54
153
  - lib/globalize/active_record/instance_methods.rb
55
154
  - lib/globalize/active_record/migration.rb
56
155
  - lib/globalize/active_record/translation.rb
57
156
  - lib/globalize/active_record.rb
58
157
  - lib/globalize/version.rb
158
+ - lib/globalize/versioning/vestal_versions.rb
159
+ - lib/globalize/versioning.rb
59
160
  - lib/globalize.rb
60
161
  - lib/globalize3.rb
61
162
  - lib/i18n/missing_translations_log_handler.rb
62
163
  - lib/i18n/missing_translations_raise_handler.rb
164
+ - lib/patches/active_record/query_method.rb
63
165
  - lib/patches/active_record/xml_attribute_serializer.rb
166
+ - Gemfile
167
+ - Gemfile.lock
64
168
  - LICENSE
65
169
  - Rakefile
66
170
  - README.textile