air18n 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,11 @@
1
1
  module Air18n
2
2
  class Phrase < ActiveRecord::Base
3
3
  has_many :phrase_translations, :dependent=>:delete_all
4
+ has_many :phrase_revisions, :foreign_key => 'key', :primary_key => 'key', :dependent=>:delete_all
4
5
  has_many :phrase_screenshots, :foreign_key => 'phrase_key', :primary_key => 'key', :dependent=>:delete_all
5
6
 
6
7
  after_update :mark_translations_stale
8
+ after_update :record_phrase_revision
7
9
 
8
10
  validates_uniqueness_of :key
9
11
 
@@ -18,6 +20,17 @@ module Air18n
18
20
  end
19
21
  end
20
22
 
23
+ def record_phrase_revision
24
+ value_hash = compute_value_hash
25
+ LoggingHelper.info "record phrase revision"
26
+ PhraseRevision.find_or_create_by_key_and_value_hash_and_value(key, value_hash, value)
27
+ end
28
+
29
+ def compute_value_hash
30
+ Digest::MD5.new.update(value).to_s
31
+ end
32
+
33
+ # TODO(jkb) retire this method, it is very old and ugly.
21
34
  def self.by_key lookup
22
35
  if !@by_key then
23
36
  @by_key = {}
@@ -88,5 +101,9 @@ module Air18n
88
101
  def is_rich_text?
89
102
  !!(self.value && Phrase.is_rich?(self.value))
90
103
  end
104
+
105
+ def revisions_in_order
106
+ phrase_revisions.order('phrase_revisions.created_at ASC')
107
+ end
91
108
  end
92
109
  end
@@ -0,0 +1,9 @@
1
+ module Air18n
2
+ class PhraseRevision < ActiveRecord::Base
3
+ belongs_to :phrase
4
+
5
+ def self.value_from_hash(phrase_key, hash)
6
+ find_by_key_and_value_hash(phrase_key, hash).value
7
+ end
8
+ end
9
+ end
@@ -37,7 +37,7 @@ module Air18n
37
37
  # Sets the source_word_count and source_hash fields.
38
38
  def set_source_hash
39
39
  self.source_word_count = PhraseTranslation.segment(phrase.value).size
40
- self.source_hash = Digest::MD5.new.update(phrase.value).to_s
40
+ self.source_hash = phrase.compute_value_hash
41
41
  end
42
42
 
43
43
  # Provides a complete set of latest translations for specified locales, in nested hash format.
@@ -1,4 +1,5 @@
1
1
  require 'air18n/phrase'
2
+ require 'air18n/phrase_revision'
2
3
  require 'air18n/phrase_screenshot'
3
4
  require 'air18n/phrase_translation'
4
5
  require 'air18n/screenshot'
@@ -1,3 +1,3 @@
1
1
  module Air18n
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.12"
3
3
  end
@@ -1,5 +1,15 @@
1
1
  class Air18nMigration < ActiveRecord::Migration
2
2
  def self.up
3
+ create_table "phrase_revisions", :force => true do |t|
4
+ t.string "key"
5
+ t.text "value"
6
+ t.string "value_hash"
7
+ t.datetime "created_at"
8
+ t.datetime "updated_at"
9
+ end
10
+
11
+ add_index "phrase_revisions", ["key", "value_hash"], :name => "index_phrase_revisions_on_key_and_value_hash"
12
+
3
13
  create_table "phrase_screenshots", :force => true do |t|
4
14
  t.string "screenshot_url"
5
15
  t.datetime "created_at"
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Air18n::Phrase do
6
+ context 'revisions' do
7
+ it "should keep track of its revisions" do
8
+ phrase = FactoryGirl.create(:phrase, :key => 'revisions key')
9
+ phrase.value = "new value"
10
+ phrase.save!
11
+ phrase.phrase_revisions.size.should == 1
12
+ phrase.phrase_revisions.first.value_hash.should == "14979451a8c46ae1691eb3aedab3359d"
13
+
14
+ phrase.value = "second value"
15
+ phrase.save!
16
+ revisions = phrase.revisions_in_order
17
+ revisions.map(&:value_hash).should == ["14979451a8c46ae1691eb3aedab3359d", "5d10ab09a3cd6e0227c2c79fd8e525b7"]
18
+
19
+ phrase.value = "new value"
20
+ phrase.save!
21
+ revisions = phrase.revisions_in_order
22
+ revisions.map(&:value_hash).should == ["14979451a8c46ae1691eb3aedab3359d", "5d10ab09a3cd6e0227c2c79fd8e525b7"]
23
+ Air18n::PhraseRevision.value_from_hash('revisions key', "14979451a8c46ae1691eb3aedab3359d").should == "new value"
24
+ Air18n::PhraseRevision.value_from_hash('revisions key', "5d10ab09a3cd6e0227c2c79fd8e525b7").should == "second value"
25
+ end
26
+ end
27
+ end
@@ -26,9 +26,10 @@ describe Air18n::PhraseTranslation do
26
26
 
27
27
  context 'source hash' do
28
28
  it "PhraseTranslation Should get unset when a new translation is made" do
29
- original_translation = FactoryGirl.create(:phrase_translation)
30
- original_translation.source_word_count.should == 3
31
- original_translation.source_hash.should == "e2c1628507c9d0dfd6469a9196370b84"
29
+ phrase = FactoryGirl.create(:phrase, :key => 'source hash phrase key', :value => 'source hash phrase value')
30
+ original_translation = FactoryGirl.create(:phrase_translation, :phrase => phrase)
31
+ original_translation.source_word_count.should == 4
32
+ original_translation.source_hash.should == "b60188f9fd5c5b5e63a412501bd464a2"
32
33
  end
33
34
  end
34
35
 
@@ -24,6 +24,8 @@ require "active_record"
24
24
  db_name = ENV['DB'] || 'sqlite3'
25
25
  database_yml = File.expand_path('../database.yml', __FILE__)
26
26
 
27
+ ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
28
+
27
29
  if File.exists?(database_yml)
28
30
  active_record_configuration = YAML.load_file(database_yml)
29
31
 
@@ -33,7 +35,6 @@ if File.exists?(database_yml)
33
35
  ActiveRecord::Base.establish_connection(db_name)
34
36
  ActiveRecord::Base.connection
35
37
 
36
- ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
37
38
  ActiveRecord::Base.default_timezone = :utc
38
39
 
39
40
  ActiveRecord::Base.silence do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: air18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2012-09-18 00:00:00.000000000 Z
16
+ date: 2012-09-24 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: i18n
@@ -153,6 +153,7 @@ files:
153
153
  - lib/air18n/logging_helper.rb
154
154
  - lib/air18n/mock_priority.rb
155
155
  - lib/air18n/phrase.rb
156
+ - lib/air18n/phrase_revision.rb
156
157
  - lib/air18n/phrase_screenshot.rb
157
158
  - lib/air18n/phrase_translation.rb
158
159
  - lib/air18n/prim_and_proper.rb
@@ -173,6 +174,7 @@ files:
173
174
  - spec/factories.rb
174
175
  - spec/lib/air18n/air18n_spec.rb
175
176
  - spec/lib/air18n/backend_spec.rb
177
+ - spec/lib/air18n/phrase_spec.rb
176
178
  - spec/lib/air18n/phrase_translation_spec.rb
177
179
  - spec/lib/air18n/prim_and_proper_spec.rb
178
180
  - spec/lib/air18n/pseudo_locales_spec.rb
@@ -207,6 +209,7 @@ test_files:
207
209
  - spec/factories.rb
208
210
  - spec/lib/air18n/air18n_spec.rb
209
211
  - spec/lib/air18n/backend_spec.rb
212
+ - spec/lib/air18n/phrase_spec.rb
210
213
  - spec/lib/air18n/phrase_translation_spec.rb
211
214
  - spec/lib/air18n/prim_and_proper_spec.rb
212
215
  - spec/lib/air18n/pseudo_locales_spec.rb