phrasing 3.2.2 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](https://travis-ci.org/infinum/phrasing)
|
4
|
+
|
3
5
|

|
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
|