phraseapp_updater 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fda2274698391255a06511a13c2ee32f163986e
4
- data.tar.gz: 7d8e53efb3379ca73721762d61ae3382d9c4179d
3
+ metadata.gz: 1b4b5ca69acb3ee2e8aa1b40c1325872ac307c50
4
+ data.tar.gz: 0f1e8961e0e35908ab8c8094ee845a9d71c8badf
5
5
  SHA512:
6
- metadata.gz: 2813702a946d84e7fcb926b9ddf8e4accd6c9fd2c18ca678d389b8e953759cd041c7b09248da8d51f7032b113aa7208ae15d580f23223afb4dc518d78b6cce09
7
- data.tar.gz: 67d9a874fc97e09018e464ade886851a4c32b63d05ebc8c90da46be5b4179d4368130c1bd0c23bec91c1b7cebb9f0d2699ffe44bd359dccdae1e14a51fc2e7c8
6
+ metadata.gz: 70c04afe5d8a011e3f7d68872f82bfa7a67150c6868d29f2b7b2a0990647a9496a92165c1d44f7753ec72b59b4fd5649f0e93b41ca68c8041829f830033d3715
7
+ data.tar.gz: b6880095d635a3b72dade7bbe19ea363b6c1fb38db91cae84f230e307f34f9f7757e6b9a3bfdcdeeb208a36f3d8689705f5bc58211916bf1f68df44db5c60720
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/iknow/phraseapp_updater.svg?branch=master)](https://travis-ci.org/iknow/phraseapp_updater)
4
4
 
5
- **Version** 0.1.3
5
+ **Version** 0.1.4
6
6
 
7
7
  This is a tool for merging PhraseApp locale data with locale data
8
8
  committed in your project.
@@ -28,7 +28,7 @@ class PhraseAppUpdaterCLI < Thor
28
28
  validate_writable_path!('store_phraseapp_originals_path', store_phraseapp_originals_path)
29
29
 
30
30
  begin
31
- result = PhraseAppUpdater.push(phraseapp_api_key, phraseapp_project_id, previous_locales_path, new_locales_path)
31
+ result = PhraseAppUpdater.new(phraseapp_api_key, phraseapp_project_id).push(previous_locales_path, new_locales_path)
32
32
 
33
33
  unless store_results_path.empty?
34
34
  write_locale_files(store_results_path, result.resolved_files)
@@ -65,18 +65,31 @@ class PhraseAppUpdaterCLI < Thor
65
65
  validate_writable_path!('destination_path', destination_path)
66
66
 
67
67
  begin
68
- files = PhraseAppUpdater.pull(phraseapp_api_key, phraseapp_project_id, fallback_path)
68
+ files = PhraseAppUpdater.new(phraseapp_api_key, phraseapp_project_id).pull(fallback_path)
69
69
  write_locale_files(destination_path, files)
70
70
  rescue PhraseAppUpdater::PhraseAppAPI::BadAPIKeyError => e
71
71
  puts "Bad PhraseApp API key."
72
72
  rescue PhraseAppUpdater::PhraseAppAPI::BadProjectIDError => e
73
73
  puts "Bad PhraseApp project ID: #{phraseapp_project_id}"
74
74
  rescue StandardError => e
75
- puts "Unknown error when pushing files"
75
+ puts "Unknown error when pulling files"
76
76
  raise e
77
77
  end
78
78
  end
79
79
 
80
+ desc "default", "Prints gem information"
81
+ option :version, aliases: [:v]
82
+
83
+ def default
84
+ if options[:v] || options[:version]
85
+ puts PhraseAppUpdater::VERSION
86
+ else
87
+ help
88
+ end
89
+ end
90
+
91
+ default_command :default
92
+
80
93
  private
81
94
 
82
95
  def load_phraseapp_credentials(options)
@@ -9,12 +9,23 @@ require 'phraseapp_updater/yml_config_loader'
9
9
  class PhraseAppUpdater
10
10
  using IndexBy
11
11
 
12
- def self.push(phraseapp_api_key, phraseapp_project_id, previous_locales_path, new_locales_path)
13
- phraseapp_api = PhraseAppAPI.new(phraseapp_api_key, phraseapp_project_id)
14
- phraseapp_locales = phraseapp_api.download_locales
12
+ def initialize(phraseapp_api_key, phraseapp_project_id)
13
+ @phraseapp_api = PhraseAppAPI.new(phraseapp_api_key, phraseapp_project_id)
14
+ end
15
+
16
+ def self.load_config(config_file_path)
17
+ YMLConfigLoader.new(config_file_path)
18
+ end
19
+
20
+ def push(previous_locales_path, new_locales_path)
21
+ phraseapp_locales = @phraseapp_api.download_locales
15
22
 
16
- phraseapp_files, (previous_locale_files, new_locale_files) =
17
- load_files(phraseapp_api, phraseapp_locales, false, previous_locales_path, new_locales_path)
23
+ phraseapp_files = load_phraseapp_files(phraseapp_locales, false)
24
+
25
+ (previous_locale_files, new_locale_files) =
26
+ load_locale_files(previous_locales_path, new_locales_path)
27
+
28
+ validate_files!([phraseapp_files, previous_locale_files, new_locale_files])
18
29
 
19
30
  new_locale_files = new_locale_files.index_by(&:name)
20
31
  phraseapp_files = phraseapp_files.index_by(&:name)
@@ -45,39 +56,45 @@ class PhraseAppUpdater
45
56
  file.parsed_content != phraseapp_files[file.name].parsed_content
46
57
  end
47
58
 
48
- upload_ids = phraseapp_api.upload_files(changed_files)
49
- phraseapp_api.remove_keys_not_in_uploads(upload_ids)
59
+ upload_ids = @phraseapp_api.upload_files(changed_files)
60
+ @phraseapp_api.remove_keys_not_in_uploads(upload_ids)
50
61
 
51
62
  puts "Uploading #{default_locale_file}"
52
- upload_id = phraseapp_api.upload_file(default_locale_file)
63
+ upload_id = @phraseapp_api.upload_file(default_locale_file)
53
64
 
54
65
  puts "Removing keys not in upload #{upload_id}"
55
- phraseapp_api.remove_keys_not_in_upload(upload_id)
66
+ @phraseapp_api.remove_keys_not_in_upload(upload_id)
56
67
 
57
68
  LocaleFileUpdates.new(phraseapp_files.values, [default_locale_file] + resolved_files)
58
69
  end
59
70
 
60
- def self.pull(phraseapp_api_key, phraseapp_project_id, fallback_locales_path)
61
- phraseapp_api = PhraseAppAPI.new(phraseapp_api_key, phraseapp_project_id)
62
- phraseapp_locales = phraseapp_api.download_locales
71
+ def pull(fallback_locales_path)
72
+ phraseapp_locales = @phraseapp_api.download_locales
73
+
74
+ phraseapp_files_without_unverified = load_phraseapp_files(phraseapp_locales, true)
75
+ phraseapp_files_with_unverified = load_phraseapp_files(phraseapp_locales, false)
76
+ fallback_files = load_locale_files(fallback_locales_path).first
63
77
 
64
- phraseapp_files, (fallback_files,) =
65
- load_files(phraseapp_api, phraseapp_locales, true, fallback_locales_path)
78
+ validate_files!([phraseapp_files_with_unverified, phraseapp_files_without_unverified, fallback_files])
66
79
 
67
- fallback_files = fallback_files.index_by(&:name)
80
+ phraseapp_files_with_unverified = phraseapp_files_with_unverified.index_by(&:name)
81
+ fallback_files = fallback_files.index_by(&:name)
68
82
 
69
- phraseapp_files.map do |phraseapp_file|
70
- new_content = Differ.restore_deletions(phraseapp_file.parsed_content,
71
- fallback_files[phraseapp_file.name].parsed_content)
72
- LocaleFile.from_hash(phraseapp_file.name, new_content)
83
+ # Clean empty strings from the data and merge the fallback data in:
84
+ # we want to replace unverified keys with their values in the fallback
85
+ phraseapp_files_without_unverified.map do |phraseapp_without_unverified_file|
86
+ without_unverified = clear_empty_strings!(phraseapp_without_unverified_file.parsed_content)
87
+ with_unverified = clear_empty_strings!(phraseapp_files_with_unverified[phraseapp_without_unverified_file.name].parsed_content)
88
+ fallback = clear_empty_strings!(fallback_files[phraseapp_without_unverified_file.name].parsed_content)
89
+
90
+ restore_unverified_originals!(fallback, with_unverified, without_unverified)
91
+ LocaleFile.from_hash(phraseapp_without_unverified_file.name, without_unverified)
73
92
  end
74
93
  end
75
94
 
76
- def self.load_config(config_file_path)
77
- YMLConfigLoader.new(config_file_path)
78
- end
95
+ private
79
96
 
80
- def self.find_default_locale_file(locales, files)
97
+ def find_default_locale_file(locales, files)
81
98
  default_locale = locales.find(&:default?)
82
99
 
83
100
  default_locale_file = files.find do |file|
@@ -85,14 +102,18 @@ class PhraseAppUpdater
85
102
  end
86
103
  end
87
104
 
88
- def self.load_files(phraseapp_api, phraseapp_locales, skip_unverified, *paths)
89
- file_groups = paths.map do |path|
90
- LocaleFileLoader.filenames(path).map { |l| LocaleFileLoader.load(l) }
91
- end
105
+ def load_phraseapp_files(phraseapp_locales, skip_unverified)
106
+ @phraseapp_api.download_files(phraseapp_locales, skip_unverified)
107
+ end
92
108
 
93
- phraseapp_files = phraseapp_api.download_files(phraseapp_locales, skip_unverified)
109
+ def load_locale_files(*paths)
110
+ paths.map do |path|
111
+ LocaleFileLoader.filenames(path).map { |l| LocaleFileLoader.load(l) }
112
+ end
113
+ end
94
114
 
95
- file_name_lists = [*file_groups, phraseapp_files].map do |files|
115
+ def validate_files!(file_groups)
116
+ file_name_lists = file_groups.map do |files|
96
117
  files.map(&:name).to_set
97
118
  end
98
119
 
@@ -102,8 +123,43 @@ class PhraseAppUpdater
102
123
  or removing langauges: #{file_name_lists}"
103
124
  raise RuntimeError.new(message)
104
125
  end
126
+ end
105
127
 
106
- return [phraseapp_files, file_groups]
128
+ # Mutates without_verified to include the fallbacks where needed.
129
+ #
130
+ # For any keys in both `with_unverified` and `originals` but not present in
131
+ # `without_unverified`, restore the version from `originals` to
132
+ # `without_unverified`
133
+ def restore_unverified_originals!(fallback, with_unverified, without_unverified)
134
+ fallback.each do |key, value|
135
+ with_value = with_unverified[key]
136
+
137
+ case value
138
+ when Hash
139
+ if with_value.is_a?(Hash)
140
+ without_value = (without_unverified[key] ||= {})
141
+ restore_unverified_originals!(value, with_value, without_value)
142
+ end
143
+ else
144
+ if with_value && !with_value.is_a?(Hash) && !without_unverified.has_key?(key)
145
+ without_unverified[key] = value
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ def clear_empty_strings!(hash)
152
+ hash.delete_if do |key, value|
153
+ if value == ""
154
+ true
155
+ elsif value.is_a?(Hash)
156
+ clear_empty_strings!(value)
157
+ value.empty?
158
+ else
159
+ false
160
+ end
161
+ end
162
+ hash
107
163
  end
108
164
 
109
165
  class LocaleFileUpdates
@@ -1,3 +1,3 @@
1
1
  class PhraseAppUpdater
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phraseapp_updater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Griffin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-17 00:00:00.000000000 Z
11
+ date: 2017-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor