phrasing 3.2.2 → 3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +2 -0
- data/app/controllers/phrasing_phrases_controller.rb +3 -3
- data/app/models/phrasing_phrase.rb +1 -32
- data/lib/phrasing.rb +1 -0
- data/lib/phrasing/serializer.rb +48 -0
- data/lib/phrasing/version.rb +1 -1
- data/spec/dummy/app/controllers/site_controller.rb +0 -1
- data/spec/dummy/log/development.log +146 -0
- data/spec/features/dummy_spec.rb +2 -2
- data/spec/features/phrasing_spec.rb +0 -2
- data/spec/lib/phrasing_serializer_spec.rb +166 -0
- data/spec/models/phrasing_phrase_spec.rb +22 -36
- metadata +4 -4
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Phrasing!
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/infinum/phrasing.png)](https://travis-ci.org/infinum/phrasing)
|
4
|
+
|
3
5
|
![Phrasing](http://www.miataturbo.net/attachments/miata-parts-sale-trade-5/74257-lots-leftovers-near-boston-archer-phrasing2-300x225-jpg?dateline=1366600534)
|
4
6
|
|
5
7
|
Phrasing is a gem for live editing phrases (copy) on websites.
|
@@ -52,11 +52,11 @@ class PhrasingPhrasesController < ActionController::Base
|
|
52
52
|
app_name = Rails.application.class.to_s.split("::").first
|
53
53
|
app_env = Rails.env
|
54
54
|
filename = "phrasing_phrases_#{app_name}_#{app_env}_#{Time.now.strftime("%Y_%m_%d_%H_%M_%S")}.yml"
|
55
|
-
send_data
|
55
|
+
send_data Phrasing::Serializer.export_yaml, filename: filename
|
56
56
|
end
|
57
57
|
|
58
58
|
def upload
|
59
|
-
number_of_changes =
|
59
|
+
number_of_changes = Phrasing::Serializer.import_yaml(params["file"].tempfile)
|
60
60
|
redirect_to phrasing_phrases_path, notice: "YAML file uploaded successfully! Number of phrases changed: #{number_of_changes}."
|
61
61
|
rescue Exception => e
|
62
62
|
logger.info "\n#{e.class}\n#{e.message}"
|
@@ -86,7 +86,7 @@ class PhrasingPhrasesController < ActionController::Base
|
|
86
86
|
yaml = read_remote_yaml(Phrasing.staging_server_endpoint)
|
87
87
|
|
88
88
|
if yaml
|
89
|
-
|
89
|
+
Phrasing::Serializer.import_yaml(yaml)
|
90
90
|
redirect_to :back, notice: "Translations synced from source server"
|
91
91
|
else
|
92
92
|
redirect_to :back
|
@@ -26,41 +26,10 @@ class PhrasingPhrase < ActiveRecord::Base
|
|
26
26
|
phrasing_phrase
|
27
27
|
end
|
28
28
|
|
29
|
-
module Serialize
|
30
|
-
|
31
|
-
def import_yaml(yaml)
|
32
|
-
number_of_changes = 0
|
33
|
-
hash = YAML.load(yaml)
|
34
|
-
hash.each do |locale, data|
|
35
|
-
data.each do |key, value|
|
36
|
-
phrase = where(key: key, locale: locale).first || new(key: key, locale: locale)
|
37
|
-
if phrase.value != value
|
38
|
-
phrase.value = value
|
39
|
-
number_of_changes += 1
|
40
|
-
phrase.save
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
number_of_changes
|
45
|
-
end
|
46
|
-
|
47
|
-
def export_yaml
|
48
|
-
hash = {}
|
49
|
-
where("value is not null").each do |phrase|
|
50
|
-
hash[phrase.locale] ||= {}
|
51
|
-
hash[phrase.locale][phrase.key] = phrase.value
|
52
|
-
end
|
53
|
-
hash.to_yaml
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
extend Serialize
|
59
|
-
|
60
29
|
private
|
61
30
|
|
62
31
|
def uniqueness_of_key_on_locale_scope
|
63
|
-
errors.add(:key, "Duplicate entry #{key} for locale #{locale}") unless PhrasingPhrase.where(key: key
|
32
|
+
errors.add(:key, "Duplicate entry #{key} for locale #{locale}") unless PhrasingPhrase.where(key: key, locale: locale).empty?
|
64
33
|
end
|
65
34
|
|
66
35
|
def version_it
|
data/lib/phrasing.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Phrasing
|
2
|
+
module Serializer
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def import_yaml(yaml)
|
6
|
+
number_of_changes = 0
|
7
|
+
hash = YAML.load(yaml)
|
8
|
+
|
9
|
+
hash.each do |locale, data|
|
10
|
+
flatten_the_hash(data).each do |key, value|
|
11
|
+
phrase = PhrasingPhrase.where(key: key, locale: locale).first || PhrasingPhrase.new(key: key, locale: locale)
|
12
|
+
if phrase.value != value
|
13
|
+
phrase.value = value
|
14
|
+
number_of_changes += 1
|
15
|
+
phrase.save
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
number_of_changes
|
21
|
+
end
|
22
|
+
|
23
|
+
def flatten_the_hash(hash)
|
24
|
+
new_hash = {}
|
25
|
+
hash.each do |key, value|
|
26
|
+
if value.is_a? Hash
|
27
|
+
flatten_the_hash(value).each do |k,v|
|
28
|
+
new_hash["#{key}.#{k}"] = v
|
29
|
+
end
|
30
|
+
else
|
31
|
+
new_hash[key] = value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
new_hash
|
35
|
+
end
|
36
|
+
|
37
|
+
def export_yaml
|
38
|
+
hash = {}
|
39
|
+
PhrasingPhrase.where("value is not null").each do |phrase|
|
40
|
+
hash[phrase.locale] ||= {}
|
41
|
+
hash[phrase.locale][phrase.key] = phrase.value
|
42
|
+
end
|
43
|
+
hash.to_yaml
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/phrasing/version.rb
CHANGED
@@ -7404,3 +7404,149 @@ Processing by PhrasingPhrasesController#download as HTML
|
|
7404
7404
|
Rendered text template (0.0ms)
|
7405
7405
|
Sent data phrasing_phrases_Dummy_development_2014_02_20_14_59_09.yml (12.6ms)
|
7406
7406
|
Completed 200 OK in 45ms (Views: 12.3ms | ActiveRecord: 0.2ms)
|
7407
|
+
DEPRECATION WARNING: You didn't set config.secret_key_base. Read the upgrade documentation to learn more about this new config option. (called from service at /Users/damirsvrtan/.rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/webrick/httpserver.rb:138)
|
7408
|
+
|
7409
|
+
|
7410
|
+
Started GET "/" for 127.0.0.1 at 2014-03-03 15:16:54 +0100
|
7411
|
+
Processing by SiteController#index as HTML
|
7412
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.header' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7413
|
+
[1m[35mPhrasingPhrase Load (0.3ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.intro' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7414
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND "phrasing_phrases"."key" = 'site.index.footer' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7415
|
+
[1m[35mPhrasingPhrase Load (0.1ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'models.errors.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7416
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7417
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND "phrasing_phrases"."key" = 'datetime.distance_in_words.less_than_x_minutes' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7418
|
+
Rendered site/index.html.erb within layouts/application (44.0ms)
|
7419
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_initializer.html.haml (9.0ms)
|
7420
|
+
Completed 200 OK in 279ms (Views: 274.6ms | ActiveRecord: 3.8ms)
|
7421
|
+
|
7422
|
+
|
7423
|
+
Started GET "/assets/phrasing.css?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7424
|
+
|
7425
|
+
|
7426
|
+
Started GET "/assets/phrasing_edit_mode_bubble.css?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7427
|
+
|
7428
|
+
|
7429
|
+
Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7430
|
+
|
7431
|
+
|
7432
|
+
Started GET "/assets/editor.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7433
|
+
|
7434
|
+
|
7435
|
+
Started GET "/assets/jquery.cookie.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7436
|
+
|
7437
|
+
|
7438
|
+
Started GET "/assets/phrasing.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7439
|
+
|
7440
|
+
|
7441
|
+
Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7442
|
+
|
7443
|
+
|
7444
|
+
Started GET "/assets/phrasing_fonts.css?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7445
|
+
|
7446
|
+
|
7447
|
+
Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7448
|
+
|
7449
|
+
|
7450
|
+
Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7451
|
+
|
7452
|
+
|
7453
|
+
Started GET "/assets/phrasing_icon_edit_all.png" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7454
|
+
|
7455
|
+
|
7456
|
+
Started GET "/assets/icomoon.woff" for 127.0.0.1 at 2014-03-03 15:16:55 +0100
|
7457
|
+
|
7458
|
+
|
7459
|
+
Started GET "/phrasing" for 127.0.0.1 at 2014-03-03 15:17:02 +0100
|
7460
|
+
Processing by PhrasingPhrasesController#index as HTML
|
7461
|
+
[1m[36mPhrasingPhrase Load (0.3ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is not null) ORDER BY phrasing_phrases.key[0m
|
7462
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is null) ORDER BY phrasing_phrases.key
|
7463
|
+
[1m[36m (0.2ms)[0m [1mSELECT DISTINCT "phrasing_phrases"."locale" FROM "phrasing_phrases"[0m
|
7464
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing_phrases/index.html.haml within layouts/phrasing (5.2ms)
|
7465
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_menu.html.haml (2.8ms)
|
7466
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_messages.html.haml (1.6ms)
|
7467
|
+
Completed 200 OK in 52ms (Views: 41.5ms | ActiveRecord: 0.7ms)
|
7468
|
+
|
7469
|
+
|
7470
|
+
Started GET "/assets/phrasing_engine.css?body=1" for 127.0.0.1 at 2014-03-03 15:17:02 +0100
|
7471
|
+
|
7472
|
+
|
7473
|
+
Started GET "/assets/phrasing_engine.js?body=1" for 127.0.0.1 at 2014-03-03 15:17:02 +0100
|
7474
|
+
|
7475
|
+
|
7476
|
+
Started GET "/phrasing/import_export" for 127.0.0.1 at 2014-03-03 15:17:04 +0100
|
7477
|
+
Processing by PhrasingPhrasesController#import_export as HTML
|
7478
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing_phrases/import_export.html.haml within layouts/phrasing (3.5ms)
|
7479
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_menu.html.haml (1.5ms)
|
7480
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_messages.html.haml (0.2ms)
|
7481
|
+
Completed 200 OK in 13ms (Views: 12.5ms | ActiveRecord: 0.0ms)
|
7482
|
+
|
7483
|
+
|
7484
|
+
Started GET "/phrasing/download" for 127.0.0.1 at 2014-03-03 15:17:07 +0100
|
7485
|
+
Processing by PhrasingPhrasesController#download as HTML
|
7486
|
+
[1m[35mPhrasingPhrase Load (0.5ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE (value is not null)
|
7487
|
+
Rendered text template (0.0ms)
|
7488
|
+
Sent data phrasing_phrases_Dummy_development_2014_03_03_15_17_07.yml (3.6ms)
|
7489
|
+
Completed 200 OK in 10ms (Views: 3.4ms | ActiveRecord: 0.5ms)
|
7490
|
+
|
7491
|
+
|
7492
|
+
Started GET "/phrasing/download" for 127.0.0.1 at 2014-03-03 15:17:18 +0100
|
7493
|
+
Processing by PhrasingPhrasesController#download as HTML
|
7494
|
+
[1m[36mPhrasingPhrase Load (0.3ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE (value is not null)[0m
|
7495
|
+
Rendered text template (0.0ms)
|
7496
|
+
Sent data phrasing_phrases_Dummy_development_2014_03_03_15_17_18.yml (0.5ms)
|
7497
|
+
Completed 200 OK in 4ms (Views: 0.4ms | ActiveRecord: 0.3ms)
|
7498
|
+
|
7499
|
+
|
7500
|
+
Started POST "/phrasing/upload" for 127.0.0.1 at 2014-03-03 15:17:22 +0100
|
7501
|
+
Processing by PhrasingPhrasesController#upload as HTML
|
7502
|
+
Parameters: {"utf8"=>"✓", "authenticity_token"=>"3LjfrYRliYOJpG5+jrxNczvfGAWe9mG9VdLB69x9ZT0=", "file"=>#<ActionDispatch::Http::UploadedFile:0x000001032dc310 @tempfile=#<File:/var/folders/sr/sriroFQ2HY8-IgGJc7Y7qE+++To/-Tmp-/RackMultipart20140303-6179-rm2q9f>, @original_filename="phrasing_phrases_Dummy_development_2014_03_03_15_17_18.yml", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"phrasing_phrases_Dummy_development_2014_03_03_15_17_18.yml\"\r\nContent-Type: application/octet-stream\r\n">, "commit"=>"Upload"}
|
7503
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.header' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7504
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.intro' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7505
|
+
[1m[35mPhrasingPhrase Load (0.1ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.footer' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7506
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'models.errors.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7507
|
+
[1m[35mPhrasingPhrase Load (0.1ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7508
|
+
Redirected to http://localhost:3000/phrasing
|
7509
|
+
Completed 302 Found in 5ms (ActiveRecord: 0.8ms)
|
7510
|
+
|
7511
|
+
|
7512
|
+
Started GET "/phrasing" for 127.0.0.1 at 2014-03-03 15:17:22 +0100
|
7513
|
+
Processing by PhrasingPhrasesController#index as HTML
|
7514
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is not null) ORDER BY phrasing_phrases.key[0m
|
7515
|
+
[1m[35mPhrasingPhrase Load (0.1ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is null) ORDER BY phrasing_phrases.key
|
7516
|
+
[1m[36m (0.1ms)[0m [1mSELECT DISTINCT "phrasing_phrases"."locale" FROM "phrasing_phrases"[0m
|
7517
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing_phrases/index.html.haml within layouts/phrasing (2.1ms)
|
7518
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_menu.html.haml (0.5ms)
|
7519
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_messages.html.haml (0.2ms)
|
7520
|
+
Completed 200 OK in 11ms (Views: 8.6ms | ActiveRecord: 0.5ms)
|
7521
|
+
|
7522
|
+
|
7523
|
+
Started GET "/phrasing" for 127.0.0.1 at 2014-03-03 15:17:24 +0100
|
7524
|
+
Processing by PhrasingPhrasesController#index as HTML
|
7525
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is not null) ORDER BY phrasing_phrases.key
|
7526
|
+
[1m[36mPhrasingPhrase Load (0.1ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND (value is null) ORDER BY phrasing_phrases.key[0m
|
7527
|
+
[1m[35m (0.1ms)[0m SELECT DISTINCT "phrasing_phrases"."locale" FROM "phrasing_phrases"
|
7528
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing_phrases/index.html.haml within layouts/phrasing (2.4ms)
|
7529
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_menu.html.haml (0.4ms)
|
7530
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_messages.html.haml (0.1ms)
|
7531
|
+
Completed 200 OK in 12ms (Views: 10.0ms | ActiveRecord: 0.5ms)
|
7532
|
+
|
7533
|
+
|
7534
|
+
Started GET "/phrasing/import_export" for 127.0.0.1 at 2014-03-03 15:17:26 +0100
|
7535
|
+
Processing by PhrasingPhrasesController#import_export as HTML
|
7536
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing_phrases/import_export.html.haml within layouts/phrasing (1.3ms)
|
7537
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_menu.html.haml (0.5ms)
|
7538
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_messages.html.haml (0.1ms)
|
7539
|
+
Completed 200 OK in 25ms (Views: 25.0ms | ActiveRecord: 0.0ms)
|
7540
|
+
|
7541
|
+
|
7542
|
+
Started GET "/" for 127.0.0.1 at 2014-03-03 15:17:51 +0100
|
7543
|
+
Processing by SiteController#index as HTML
|
7544
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.header' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7545
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.index.intro' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7546
|
+
[1m[36mPhrasingPhrase Load (0.2ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND "phrasing_phrases"."key" = 'site.index.footer' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7547
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'models.errors.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7548
|
+
[1m[36mPhrasingPhrase Load (0.3ms)[0m [1mSELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."key" = 'site.test' AND "phrasing_phrases"."locale" = 'en' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1[0m
|
7549
|
+
[1m[35mPhrasingPhrase Load (0.2ms)[0m SELECT "phrasing_phrases".* FROM "phrasing_phrases" WHERE "phrasing_phrases"."locale" = 'en' AND "phrasing_phrases"."key" = 'datetime.distance_in_words.less_than_x_minutes' ORDER BY "phrasing_phrases"."id" ASC LIMIT 1
|
7550
|
+
Rendered site/index.html.erb within layouts/application (8.1ms)
|
7551
|
+
Rendered /Users/damirsvrtan/Documents/rails_infinum_projects/phrasing/app/views/phrasing/_initializer.html.haml (1.1ms)
|
7552
|
+
Completed 200 OK in 18ms (Views: 16.2ms | ActiveRecord: 1.2ms)
|
data/spec/features/dummy_spec.rb
CHANGED
@@ -80,12 +80,12 @@ feature "yaml" do
|
|
80
80
|
|
81
81
|
describe 'on first visit value should be' do
|
82
82
|
|
83
|
-
it "same as keys" do
|
83
|
+
it "same as keys if there is no translation available" do
|
84
84
|
visit root_path
|
85
85
|
PhrasingPhrase.find_by_key('site.index.intro').value.should == 'site.index.intro'
|
86
86
|
end
|
87
87
|
|
88
|
-
it "same as translations in the yaml file" do
|
88
|
+
it "same as translations in the yaml file if there is a translation available" do
|
89
89
|
visit root_path
|
90
90
|
PhrasingPhrase.find_by_key('site.index.header').value.should == 'The Header'
|
91
91
|
PhrasingPhrase.find_by_key('site.index.footer').value.should == 'The Footer'
|
@@ -0,0 +1,166 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'pry-debugger'
|
4
|
+
|
5
|
+
describe Phrasing::Serializer do
|
6
|
+
|
7
|
+
let(:english_phrases) do
|
8
|
+
PhrasingPhrase.where(locale: :en)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:french_phrases) do
|
12
|
+
PhrasingPhrase.where(locale: :fr)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'flatten_the_hash' do
|
16
|
+
|
17
|
+
it 'with simple data' do
|
18
|
+
hash = { "site.intro" => "Hello", "site.outro" => "KthnxBye", "site.overture" => "The Butler"}
|
19
|
+
new_hash = Phrasing::Serializer.flatten_the_hash(hash)
|
20
|
+
expect(new_hash).to eq(hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'with nested data' do
|
24
|
+
hash = { "site.text" => {"intro" => "Hello", "outro" => "KthnxBye"}}
|
25
|
+
new_hash = Phrasing::Serializer.flatten_the_hash(hash)
|
26
|
+
|
27
|
+
predicted_new_hash = { "site.text.intro" => "Hello", "site.text.outro" => "KthnxBye" }
|
28
|
+
expect(new_hash).to eq(predicted_new_hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'with deeply nested data' do
|
32
|
+
hash = { "site" => {"text" => {"intro" => "Hello", "outro" => "KthnxBye", "overture" => {"intro" => "Overture intro", "outro" => "Overture outro"}}}}
|
33
|
+
new_hash = Phrasing::Serializer.flatten_the_hash(hash)
|
34
|
+
|
35
|
+
predicted_new_hash = { "site.text.intro" => "Hello", "site.text.outro" => "KthnxBye", "site.text.overture.intro" => "Overture intro", "site.text.overture.outro" => "Overture outro"}
|
36
|
+
expect(new_hash).to eq(predicted_new_hash)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'import_yaml' do
|
42
|
+
|
43
|
+
it 'simply formatted phrases' do
|
44
|
+
yaml = <<-YAML
|
45
|
+
en:
|
46
|
+
intro: "Hello World"
|
47
|
+
outro: "Kthnx Bye"
|
48
|
+
YAML
|
49
|
+
Phrasing::Serializer.import_yaml(StringIO.new(yaml))
|
50
|
+
|
51
|
+
expect(english_phrases.where(key: "intro").first.value).to eq("Hello World")
|
52
|
+
expect(english_phrases.where(key: "outro").first.value).to eq("Kthnx Bye")
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'nested phrases' do
|
56
|
+
yaml = <<-YAML
|
57
|
+
en:
|
58
|
+
site:
|
59
|
+
intro: "Hello World"
|
60
|
+
outro: "Kthnx Bye"
|
61
|
+
YAML
|
62
|
+
Phrasing::Serializer.import_yaml(StringIO.new(yaml))
|
63
|
+
|
64
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Hello World")
|
65
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'deeply nested phrases' do
|
69
|
+
yaml = <<-YAML
|
70
|
+
en:
|
71
|
+
site:
|
72
|
+
text:
|
73
|
+
intro: "Hello World"
|
74
|
+
outro: "Kthnx Bye"
|
75
|
+
overture:
|
76
|
+
intro: "Overture intro"
|
77
|
+
outro: "Overture outro"
|
78
|
+
YAML
|
79
|
+
Phrasing::Serializer.import_yaml(StringIO.new(yaml))
|
80
|
+
|
81
|
+
expect(english_phrases.where(key: "site.text.intro").first.value).to eq("Hello World")
|
82
|
+
expect(english_phrases.where(key: "site.text.outro").first.value).to eq("Kthnx Bye")
|
83
|
+
|
84
|
+
expect(english_phrases.where(key: "site.text.overture.intro").first.value).to eq("Overture intro")
|
85
|
+
expect(english_phrases.where(key: "site.text.overture.outro").first.value).to eq("Overture outro")
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it 'overrides old values' do
|
90
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.intro", value: "Go Home")
|
91
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.outro", value: "Kthnx Bye")
|
92
|
+
|
93
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Go Home")
|
94
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
95
|
+
|
96
|
+
yaml = <<-YAML
|
97
|
+
en:
|
98
|
+
site:
|
99
|
+
intro: "Hello World"
|
100
|
+
YAML
|
101
|
+
number_of_changes = Phrasing::Serializer.import_yaml(StringIO.new(yaml))
|
102
|
+
|
103
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Hello World")
|
104
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
105
|
+
|
106
|
+
expect(number_of_changes).to eq(1)
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
context 'imports and exports' do
|
113
|
+
it 'without changing, should return 0 number of changes' do
|
114
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.intro", value: "Go Home")
|
115
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.outro", value: "Kthnx Bye")
|
116
|
+
|
117
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Go Home")
|
118
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
119
|
+
|
120
|
+
yaml = Phrasing::Serializer.export_yaml
|
121
|
+
|
122
|
+
number_of_changes = Phrasing::Serializer.import_yaml(StringIO.new(yaml))
|
123
|
+
|
124
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Go Home")
|
125
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
126
|
+
expect(number_of_changes).to eq(0)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
context 'export_yaml' do
|
132
|
+
it 'flattened phrases' do
|
133
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.intro", value: "Go Home")
|
134
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.outro", value: "Kthnx Bye")
|
135
|
+
|
136
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Go Home")
|
137
|
+
expect(english_phrases.where(key: "site.outro").first.value).to eq("Kthnx Bye")
|
138
|
+
|
139
|
+
yaml = Phrasing::Serializer.export_yaml
|
140
|
+
|
141
|
+
expect(yaml).to match(/site.intro:\sGo Home/)
|
142
|
+
expect(yaml).to match(/site.outro:\sKthnx Bye/)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'with different locales' do
|
146
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.intro", value: "Hello", locale: :en)
|
147
|
+
FactoryGirl.create(:phrasing_phrase, key: "site.intro", value: "Bonjour", locale: :fr)
|
148
|
+
|
149
|
+
expect(english_phrases.where(key: "site.intro").first.value).to eq("Hello")
|
150
|
+
expect(french_phrases.where(key: "site.intro").first.value).to eq("Bonjour")
|
151
|
+
|
152
|
+
yaml = Phrasing::Serializer.export_yaml
|
153
|
+
|
154
|
+
expect(yaml).to match(/en:\s*\n\s*site.intro:\sHello/)
|
155
|
+
expect(yaml).to match(/fr:\s*\n\s*site.intro:\sBonjour/)
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
@@ -1,46 +1,32 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
require 'spec_helper'
|
3
|
+
require 'pry-debugger'
|
3
4
|
|
4
5
|
describe PhrasingPhrase do
|
5
6
|
|
6
7
|
describe "database constraints" do
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
8
|
+
context "validates uniqueness of key & locale" do
|
9
|
+
|
10
|
+
it 'on #save! should raise errors if the key and locale are the same for two phrases' do
|
11
|
+
PhrasingPhrase.create(key: "foo", locale: "en", value: "bar")
|
12
|
+
new_phrase = PhrasingPhrase.new(key: "foo", locale: "en", value: "bar2")
|
13
|
+
expect { new_phrase.save! }.to raise_error
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'on #save, if the key and locale are the same for two phrases, the latter one should be invalid' do
|
17
|
+
PhrasingPhrase.create(key: "foo", locale: "en", value: "bar")
|
18
|
+
new_phrase = PhrasingPhrase.create(key: "foo", locale: "en", value: "bar2")
|
19
|
+
expect(new_phrase).to be_invalid
|
20
|
+
end
|
21
|
+
|
22
|
+
it "shouldn't raise errors if the key is the same but locales are different" do
|
23
|
+
PhrasingPhrase.create(key: "foo", locale: "en", value: "bar")
|
24
|
+
new_phrase = PhrasingPhrase.new(key: "foo", locale: "fr", value: "bar")
|
25
|
+
expect { new_phrase.save! }.not_to raise_error
|
26
|
+
expect(new_phrase).to be_valid
|
27
|
+
end
|
23
28
|
|
24
|
-
|
25
|
-
en:
|
26
|
-
hello: "Hello world"
|
27
|
-
sample_copy: "lorem ipsum"
|
28
|
-
YAML
|
29
|
-
PhrasingPhrase.import_yaml(StringIO.new(yaml))
|
30
|
-
|
31
|
-
assert PhrasingPhrase.find_by_key("sample_copy").value == "lorem ipsum"
|
32
|
-
assert PhrasingPhrase.find_by_key("sample_copy2").value == "copybaz"
|
33
|
-
assert PhrasingPhrase.find_by_key("hello").value == "Hello world"
|
34
|
-
end
|
35
|
-
|
36
|
-
it "exports and then imports complicated YAML" do
|
37
|
-
key = "moby_dick"
|
38
|
-
value = %|<p>Lorem ipsum</p><p class="highlight">∆'≈:</p>|
|
39
|
-
FactoryGirl.create(:phrasing_phrase, key: key, value: value)
|
40
|
-
yaml = PhrasingPhrase.export_yaml
|
41
|
-
PhrasingPhrase.destroy_all
|
42
|
-
PhrasingPhrase.import_yaml(StringIO.new(yaml))
|
43
|
-
PhrasingPhrase.find_by_key(key).value.should == value
|
29
|
+
end
|
44
30
|
end
|
45
31
|
|
46
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phrasing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -184,6 +184,7 @@ files:
|
|
184
184
|
- db/migrate/20131010101010_create_phrasing_phrase_versions.rb
|
185
185
|
- lib/phrasing.rb
|
186
186
|
- lib/phrasing/implementation.rb
|
187
|
+
- lib/phrasing/serializer.rb
|
187
188
|
- lib/phrasing/simple.rb
|
188
189
|
- lib/phrasing/version.rb
|
189
190
|
- lib/tasks/phrasing_tasks.rake
|
@@ -195,7 +196,6 @@ files:
|
|
195
196
|
- spec/dummy/app/controllers/site_controller.rb
|
196
197
|
- spec/dummy/app/helpers/application_helper.rb
|
197
198
|
- spec/dummy/app/helpers/phrasing_helper.rb
|
198
|
-
- spec/dummy/app/mailers/.gitkeep
|
199
199
|
- spec/dummy/app/models/.gitkeep
|
200
200
|
- spec/dummy/app/views/layouts/application.html.erb
|
201
201
|
- spec/dummy/app/views/site/index.html.erb
|
@@ -222,7 +222,6 @@ files:
|
|
222
222
|
- spec/dummy/db/migrate/20131120000856_create_phrasing_phrase_versions.phrasing_rails_engine.rb
|
223
223
|
- spec/dummy/db/schema.rb
|
224
224
|
- spec/dummy/db/test.sqlite3
|
225
|
-
- spec/dummy/lib/assets/.gitkeep
|
226
225
|
- spec/dummy/log/.gitkeep
|
227
226
|
- spec/dummy/log/development.log
|
228
227
|
- spec/dummy/log/test.log
|
@@ -234,6 +233,7 @@ files:
|
|
234
233
|
- spec/factories/phrasing_phrases.rb
|
235
234
|
- spec/features/dummy_spec.rb
|
236
235
|
- spec/features/phrasing_spec.rb
|
236
|
+
- spec/lib/phrasing_serializer_spec.rb
|
237
237
|
- spec/lib/phrasing_spec.rb
|
238
238
|
- spec/models/phrasing_phrase_spec.rb
|
239
239
|
- spec/spec_helper.rb
|
File without changes
|
File without changes
|