phraseapp-in-context-editor-ruby 1.4.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +7 -11
  3. data/.gitignore +0 -1
  4. data/.tool-versions +1 -1
  5. data/CODEOWNERS +1 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +241 -0
  8. data/Guardfile +13 -13
  9. data/README.md +81 -51
  10. data/RELEASING.md +10 -0
  11. data/lib/generators/phraseapp_in_context_editor/install_generator.rb +3 -9
  12. data/lib/generators/phraseapp_in_context_editor/templates/phraseapp_in_context_editor.rb +9 -17
  13. data/lib/phraseapp-in-context-editor-ruby/adapters/fast_gettext.rb +20 -20
  14. data/lib/phraseapp-in-context-editor-ruby/adapters/i18n.rb +10 -10
  15. data/lib/phraseapp-in-context-editor-ruby/backend_service.rb +12 -99
  16. data/lib/phraseapp-in-context-editor-ruby/config.rb +13 -50
  17. data/lib/phraseapp-in-context-editor-ruby/delegate/fast_gettext.rb +13 -15
  18. data/lib/phraseapp-in-context-editor-ruby/delegate/i18n_delegate.rb +4 -50
  19. data/lib/phraseapp-in-context-editor-ruby/delegate.rb +13 -14
  20. data/lib/phraseapp-in-context-editor-ruby/engine.rb +5 -6
  21. data/lib/phraseapp-in-context-editor-ruby/view_helpers.rb +25 -19
  22. data/lib/phraseapp-in-context-editor-ruby.rb +15 -54
  23. data/phraseapp-in-context-editor-ruby.gemspec +18 -33
  24. metadata +27 -101
  25. data/lib/generators/phraseapp_in_context_editor/templates/README +0 -10
  26. data/lib/phraseapp-in-context-editor-ruby/api_collection.rb +0 -41
  27. data/lib/phraseapp-in-context-editor-ruby/api_wrapper.rb +0 -59
  28. data/lib/phraseapp-in-context-editor-ruby/cache.rb +0 -37
  29. data/lib/phraseapp-in-context-editor-ruby/displayable_key_identifier.rb +0 -46
  30. data/lib/phraseapp-in-context-editor-ruby/fallback_keys_fetcher.rb +0 -44
  31. data/lib/phraseapp-in-context-editor-ruby/hash_flattener.rb +0 -53
  32. data/lib/phraseapp-in-context-editor-ruby/key_names_cache.rb +0 -53
  33. data/lib/phraseapp-in-context-editor-ruby/version.rb +0 -5
@@ -1,43 +1,28 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib/', __FILE__)
3
- $:.unshift lib unless $:.include?(lib)
4
-
5
- require 'phraseapp-in-context-editor-ruby/version'
1
+ # frozen_string_literal: true
6
2
 
7
3
  Gem::Specification.new do |s|
8
4
  s.name = "phraseapp-in-context-editor-ruby"
9
- s.version = PhraseApp::InContextEditor::VERSION
5
+ s.version = "2.0.0"
10
6
  s.platform = Gem::Platform::RUBY
11
- s.required_ruby_version = '>= 2.1'
12
- s.authors = ["Dynport GmbH"]
7
+ s.required_ruby_version = ">= 3.2.0"
8
+ s.authors = ["Phrase"]
13
9
  s.email = ["info@phrase.com"]
14
10
  s.homepage = "https://phrase.com"
15
- s.summary = %q{Translation management solution for web and mobile applications}
16
- s.licenses = ['MIT']
17
- s.description = %q{Phrase In-Context-Editor allows you to edit translations directly on the website. More information: phrase.com}
11
+ s.summary = "Translation management solution for web and mobile applications"
12
+ s.licenses = ["MIT"]
13
+ s.description = "Phrase In-Context-Editor allows you to edit translations directly on the website. More information: phrase.com"
18
14
  s.required_rubygems_version = ">= 1.3.6"
19
- s.rubyforge_project = "phraseapp-in-context-editor-ruby"
20
- git_files = `git ls-files | grep -v spec/`.split("\n") rescue ''
15
+ git_files = begin
16
+ `git ls-files | grep -v spec/`.split("\n")
17
+ rescue
18
+ ""
19
+ end
21
20
  s.files = git_files
22
- s.test_files = s.files.grep(%r{^(spec)/})
23
21
  s.require_paths = ["lib"]
24
- if RUBY_VERSION >= '2.4'
25
- s.add_dependency('json', '>= 1.8', '< 3')
26
- else
27
- s.add_dependency('json', '>= 1.7', '< 3')
28
- end
29
- s.add_dependency('i18n', '>= 0.6')
30
- s.add_dependency('phraseapp-ruby', '~> 1.3')
31
- s.add_dependency('request_store', '~> 1.3')
32
- s.add_development_dependency('rspec', '~> 3.2')
33
- s.add_development_dependency('webmock', '~> 1.21')
34
- s.add_development_dependency('vcr', '~> 2.9')
35
- s.add_development_dependency('timecop', '~> 0.7')
36
- if RUBY_VERSION < '2.2'
37
- s.add_development_dependency('mime-types', '< 3.0') # for 1.9.3 to work
38
- s.add_development_dependency('rails', '~> 4.2')
39
- else
40
- s.add_development_dependency('rails', '>= 4.2', '< 5.1')
41
- end
42
- s.add_development_dependency('github_changelog_generator')
22
+ s.add_dependency("json", "~> 2.0")
23
+ s.add_dependency("i18n", "~> 1.0")
24
+ s.add_dependency("request_store", "~> 1.2")
25
+ s.add_development_dependency("rspec", "~> 3.0")
26
+ s.add_development_dependency("rails", "~> 7.0")
27
+ s.add_development_dependency("github_changelog_generator", "~> 1.16")
43
28
  end
metadata CHANGED
@@ -1,167 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phraseapp-in-context-editor-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Dynport GmbH
8
- autorequire:
7
+ - Phrase
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-16 00:00:00.000000000 Z
11
+ date: 2023-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '1.8'
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '3'
19
+ version: '2.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '1.8'
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '3'
26
+ version: '2.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: i18n
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0.6'
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: '0.6'
47
- - !ruby/object:Gem::Dependency
48
- name: phraseapp-ruby
49
29
  requirement: !ruby/object:Gem::Requirement
50
30
  requirements:
51
31
  - - "~>"
52
32
  - !ruby/object:Gem::Version
53
- version: '1.3'
33
+ version: '1.0'
54
34
  type: :runtime
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
37
  requirements:
58
38
  - - "~>"
59
39
  - !ruby/object:Gem::Version
60
- version: '1.3'
40
+ version: '1.0'
61
41
  - !ruby/object:Gem::Dependency
62
42
  name: request_store
63
43
  requirement: !ruby/object:Gem::Requirement
64
44
  requirements:
65
45
  - - "~>"
66
46
  - !ruby/object:Gem::Version
67
- version: '1.3'
47
+ version: '1.2'
68
48
  type: :runtime
69
49
  prerelease: false
70
50
  version_requirements: !ruby/object:Gem::Requirement
71
51
  requirements:
72
52
  - - "~>"
73
53
  - !ruby/object:Gem::Version
74
- version: '1.3'
54
+ version: '1.2'
75
55
  - !ruby/object:Gem::Dependency
76
56
  name: rspec
77
57
  requirement: !ruby/object:Gem::Requirement
78
58
  requirements:
79
59
  - - "~>"
80
60
  - !ruby/object:Gem::Version
81
- version: '3.2'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '3.2'
89
- - !ruby/object:Gem::Dependency
90
- name: webmock
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '1.21'
61
+ version: '3.0'
96
62
  type: :development
97
63
  prerelease: false
98
64
  version_requirements: !ruby/object:Gem::Requirement
99
65
  requirements:
100
66
  - - "~>"
101
67
  - !ruby/object:Gem::Version
102
- version: '1.21'
68
+ version: '3.0'
103
69
  - !ruby/object:Gem::Dependency
104
- name: vcr
70
+ name: rails
105
71
  requirement: !ruby/object:Gem::Requirement
106
72
  requirements:
107
73
  - - "~>"
108
74
  - !ruby/object:Gem::Version
109
- version: '2.9'
75
+ version: '7.0'
110
76
  type: :development
111
77
  prerelease: false
112
78
  version_requirements: !ruby/object:Gem::Requirement
113
79
  requirements:
114
80
  - - "~>"
115
81
  - !ruby/object:Gem::Version
116
- version: '2.9'
82
+ version: '7.0'
117
83
  - !ruby/object:Gem::Dependency
118
- name: timecop
84
+ name: github_changelog_generator
119
85
  requirement: !ruby/object:Gem::Requirement
120
86
  requirements:
121
87
  - - "~>"
122
88
  - !ruby/object:Gem::Version
123
- version: '0.7'
89
+ version: '1.16'
124
90
  type: :development
125
91
  prerelease: false
126
92
  version_requirements: !ruby/object:Gem::Requirement
127
93
  requirements:
128
94
  - - "~>"
129
95
  - !ruby/object:Gem::Version
130
- version: '0.7'
131
- - !ruby/object:Gem::Dependency
132
- name: rails
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '4.2'
138
- - - "<"
139
- - !ruby/object:Gem::Version
140
- version: '5.1'
141
- type: :development
142
- prerelease: false
143
- version_requirements: !ruby/object:Gem::Requirement
144
- requirements:
145
- - - ">="
146
- - !ruby/object:Gem::Version
147
- version: '4.2'
148
- - - "<"
149
- - !ruby/object:Gem::Version
150
- version: '5.1'
151
- - !ruby/object:Gem::Dependency
152
- name: github_changelog_generator
153
- requirement: !ruby/object:Gem::Requirement
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- version: '0'
158
- type: :development
159
- prerelease: false
160
- version_requirements: !ruby/object:Gem::Requirement
161
- requirements:
162
- - - ">="
163
- - !ruby/object:Gem::Version
164
- version: '0'
96
+ version: '1.16'
165
97
  description: 'Phrase In-Context-Editor allows you to edit translations directly on
166
98
  the website. More information: phrase.com'
167
99
  email:
@@ -175,40 +107,34 @@ files:
175
107
  - ".package-licenses.yml"
176
108
  - ".tool-versions"
177
109
  - CHANGELOG.md
110
+ - CODEOWNERS
178
111
  - Gemfile
112
+ - Gemfile.lock
179
113
  - Guardfile
180
114
  - LICENSE
181
115
  - README.md
116
+ - RELEASING.md
182
117
  - cacert.pem
183
118
  - config/license-decisions.yml
184
119
  - config/license_finder.yml
185
120
  - lib/generators/phraseapp_in_context_editor/install_generator.rb
186
- - lib/generators/phraseapp_in_context_editor/templates/README
187
121
  - lib/generators/phraseapp_in_context_editor/templates/phraseapp_in_context_editor.rb
188
122
  - lib/phraseapp-in-context-editor-ruby.rb
189
123
  - lib/phraseapp-in-context-editor-ruby/adapters/fast_gettext.rb
190
124
  - lib/phraseapp-in-context-editor-ruby/adapters/i18n.rb
191
- - lib/phraseapp-in-context-editor-ruby/api_collection.rb
192
- - lib/phraseapp-in-context-editor-ruby/api_wrapper.rb
193
125
  - lib/phraseapp-in-context-editor-ruby/backend_service.rb
194
- - lib/phraseapp-in-context-editor-ruby/cache.rb
195
126
  - lib/phraseapp-in-context-editor-ruby/config.rb
196
127
  - lib/phraseapp-in-context-editor-ruby/delegate.rb
197
128
  - lib/phraseapp-in-context-editor-ruby/delegate/fast_gettext.rb
198
129
  - lib/phraseapp-in-context-editor-ruby/delegate/i18n_delegate.rb
199
- - lib/phraseapp-in-context-editor-ruby/displayable_key_identifier.rb
200
130
  - lib/phraseapp-in-context-editor-ruby/engine.rb
201
- - lib/phraseapp-in-context-editor-ruby/fallback_keys_fetcher.rb
202
- - lib/phraseapp-in-context-editor-ruby/hash_flattener.rb
203
- - lib/phraseapp-in-context-editor-ruby/key_names_cache.rb
204
- - lib/phraseapp-in-context-editor-ruby/version.rb
205
131
  - lib/phraseapp-in-context-editor-ruby/view_helpers.rb
206
132
  - phraseapp-in-context-editor-ruby.gemspec
207
133
  homepage: https://phrase.com
208
134
  licenses:
209
135
  - MIT
210
136
  metadata: {}
211
- post_install_message:
137
+ post_install_message:
212
138
  rdoc_options: []
213
139
  require_paths:
214
140
  - lib
@@ -216,15 +142,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
142
  requirements:
217
143
  - - ">="
218
144
  - !ruby/object:Gem::Version
219
- version: '2.1'
145
+ version: 3.2.0
220
146
  required_rubygems_version: !ruby/object:Gem::Requirement
221
147
  requirements:
222
148
  - - ">="
223
149
  - !ruby/object:Gem::Version
224
150
  version: 1.3.6
225
151
  requirements: []
226
- rubygems_version: 3.2.3
227
- signing_key:
152
+ rubygems_version: 3.4.13
153
+ signing_key:
228
154
  specification_version: 4
229
155
  summary: Translation management solution for web and mobile applications
230
156
  test_files: []
@@ -1,10 +0,0 @@
1
- ===============================================================================
2
- Welcome to PhraseApp!
3
-
4
- PhraseApp is the translation management solution for web and mobile applications. Collaborate with your team, find professional translators and stay on top of the process.
5
-
6
- How awesome would it be if translators could simply browse your website and edit text along the way? Our In-Context Editor offers just that. It provides translators with useful contextual information which improves overall translation quality.
7
-
8
- Login: https://phraseapp.com/account/login
9
- Documentation: https://help.phraseapp.com/translate-website-and-app-content/use-in-context-editor-to-translate/translate-directly-on-your-website
10
- ===============================================================================
@@ -1,41 +0,0 @@
1
- module PhraseApp
2
- module InContextEditor
3
- class ApiCollection
4
- def initialize(api_client, action, ids=[], query=nil)
5
- raise "PhraseApp API client can't handle action #{action}" unless api_client.respond_to?(action)
6
-
7
- @api_client = api_client
8
- @action = action
9
- @ids = ids
10
- @query = query
11
- end
12
-
13
- def collection
14
- results = []
15
- page = 1
16
- per_page = 100
17
- paginated, err = send_request(page, per_page)
18
- results << paginated
19
-
20
- while paginated.size == per_page
21
- break if page > 100
22
-
23
- page = page + 1
24
- paginated, err = send_request(page, per_page)
25
- results << paginated if paginated.present?
26
- end
27
-
28
- results.flatten.uniq
29
- end
30
-
31
- private
32
- def send_request(page, per_page)
33
- if @query.present?
34
- @api_client.send(@action, *@ids, page, per_page, @query)
35
- else
36
- @api_client.send(@action, *@ids, page, per_page)
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,59 +0,0 @@
1
- require 'phraseapp-in-context-editor-ruby/api_collection'
2
-
3
- module PhraseApp
4
- module InContextEditor
5
- class ApiWrapper
6
- def initialize
7
- @api_client = PhraseApp::InContextEditor.api_client
8
- end
9
-
10
- def default_locale
11
- @default_locale ||= select_default_locale
12
- end
13
-
14
- def default_translation(key)
15
- params = PhraseApp::RequestParams::TranslationsByKeyParams.new
16
- translations = PhraseApp::InContextEditor::ApiCollection.new(@api_client, "translations_by_key", project_and_key_id(key), params).collection
17
- return unless translations.present?
18
-
19
- translations.select{ |translation| translation.locale["id"] == default_locale.id }
20
- end
21
-
22
- def keys_with_prefix(prefix)
23
- params = PhraseApp::RequestParams::KeysSearchParams.new(q:"#{prefix}*")
24
- keys_list(params)
25
- end
26
-
27
- def keys_by_names(names)
28
- names = names.join(',')
29
- params = PhraseApp::RequestParams::KeysSearchParams.new(:q => "name:#{names}")
30
- keys_list(params)
31
- end
32
-
33
- def keys_list(params)
34
- PhraseApp::InContextEditor::ApiCollection.new(@api_client, "keys_search", project_id, params).collection
35
- end
36
-
37
- def blacklisted_keys
38
- PhraseApp::InContextEditor::ApiCollection.new(@api_client, "blacklisted_keys_list", project_id).collection.map{ |rule| rule.name }
39
- end
40
-
41
- private
42
-
43
- def select_default_locale
44
- locales = PhraseApp::InContextEditor::ApiCollection.new(@api_client, "locales_list", project_id).collection
45
- return unless locales.present?
46
-
47
- locales.select{ |loc| loc.default }.first
48
- end
49
-
50
- def project_id
51
- [PhraseApp::InContextEditor.project_id]
52
- end
53
-
54
- def project_and_key_id(key)
55
- project_id << key.id
56
- end
57
- end
58
- end
59
- end
@@ -1,37 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- require 'phraseapp-in-context-editor-ruby'
4
-
5
- module PhraseApp
6
- module InContextEditor
7
- class Cache
8
- attr_accessor :lifetime
9
-
10
- def initialize(args={})
11
- @store = {}
12
- @lifetime = args.fetch(:lifetime, PhraseApp::InContextEditor.cache_lifetime)
13
- end
14
-
15
- def cached?(cache_key)
16
- @store.has_key?(cache_key) && !expired?(cache_key)
17
- end
18
-
19
- def get(cache_key)
20
- begin
21
- @store.fetch(cache_key)[:payload]
22
- rescue
23
- nil
24
- end
25
- end
26
-
27
- def set(cache_key, value)
28
- @store[cache_key] = {timestamp: Time.now, payload: value}
29
- end
30
-
31
- private
32
- def expired?(cache_key)
33
- @store.fetch(cache_key)[:timestamp] < (Time.now - @lifetime)
34
- end
35
- end
36
- end
37
- end
@@ -1,46 +0,0 @@
1
- require 'phraseapp-in-context-editor-ruby/fallback_keys_fetcher'
2
- require 'phraseapp-in-context-editor-ruby/key_names_cache'
3
-
4
- module PhraseApp
5
- module InContextEditor
6
- class DisplayableKeyIdentifier
7
- attr_reader :api_wrapper, :key_names_cache
8
-
9
- def initialize(api_wrapper)
10
- @api_wrapper = api_wrapper
11
- @key_names_cache = KeyNamesCache.new(@api_wrapper)
12
- end
13
-
14
- def identify(key_name, options)
15
- fallback_key_names = FallbackKeysFetcher.extract_fallback_keys(key_name, options)
16
- return key_name if fallback_key_names.empty?
17
-
18
- key_names = [key_name] | fallback_key_names
19
- available_key_names = find_keys_within_phraseapp(key_names)
20
-
21
- key_names.each do |item|
22
- if available_key_names.include?(item)
23
- return item
24
- end
25
- end
26
-
27
- return key_name
28
- end
29
-
30
- private
31
-
32
- def find_keys_within_phraseapp(key_names)
33
- key_names_to_check_against_api = key_names - @key_names_cache.pre_fetched(key_names)
34
- @key_names_cache.pre_cached(key_names) | key_names_returned_from_api_for(key_names_to_check_against_api)
35
- end
36
-
37
- def key_names_returned_from_api_for(key_names)
38
- if key_names.size > 0
39
- api_wrapper.keys_by_names(key_names).map { |key| key.name }
40
- else
41
- []
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,44 +0,0 @@
1
- module PhraseApp
2
- module InContextEditor
3
- class FallbackKeysFetcher
4
-
5
- def self.extract_fallback_keys(key, options)
6
- fallback_items = []
7
- if options.has_key?(:default)
8
- if options[:default].kind_of?(Array)
9
- fallback_items = options[:default]
10
- else
11
- fallback_items << options[:default]
12
- end
13
- end
14
-
15
- return fallback_items.map{ |item| process_fallback_item(item, key, options) }.flatten.uniq
16
- end
17
-
18
- def self.process_fallback_item(item, key, options)
19
- fallback_keys = []
20
- if item.kind_of?(Symbol)
21
- fallback_key_name = item.to_s
22
- if options.has_key?(:scope)
23
- if options[:scope].is_a?(Array)
24
- fallback_key_name = "#{options[:scope].join(".")}.#{item}"
25
- else
26
- fallback_key_name = "#{options[:scope]}.#{item}"
27
- end
28
- end
29
- fallback_keys << fallback_key_name
30
-
31
- if key == "helpers.label.#{fallback_key_name}" # http://apidock.com/rails/v3.1.0/ActionView/Helpers/FormHelper/label
32
- fallback_keys << "activerecord.attributes.#{fallback_key_name}"
33
- end
34
-
35
- if key.start_with?("simple_form.") # special treatment for simple form
36
- fallback_keys << "activerecord.attributes.#{item}"
37
- end
38
- end
39
-
40
- return fallback_keys
41
- end
42
- end
43
- end
44
- end
@@ -1,53 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- module PhraseApp
3
- module InContextEditor
4
- module HashFlattener
5
- FLATTEN_SEPARATOR = "."
6
- SEPARATOR_ESCAPE_CHAR = "\001"
7
-
8
- def self.flatten(hash, escape, previous_key=nil, &block)
9
- hash.each_pair do |key, value|
10
- key = escape_default_separator(key) if escape
11
- current_key = [previous_key, key].compact.join(FLATTEN_SEPARATOR).to_sym
12
- yield current_key, value
13
- flatten(value, escape, current_key, &block) if value.is_a?(Hash)
14
- end
15
- end
16
-
17
- def self.expand_flat_hash(flat_hash, prefix=nil)
18
- flat_hash ||= []
19
- result = flat_hash.map do |key, value|
20
- key = key.gsub(/#{prefix}[\.]?/, '') if prefix
21
- to_nested_hash(key, value)
22
- end
23
-
24
- result = result.inject({}) { |hash, subhash| hash.deep_merge!(subhash) }
25
- result
26
- end
27
-
28
- def self.to_nested_hash key, value
29
- if contains_only_dots?(key) or starts_with_dot?(key) or ends_with_dot?(key)
30
- {key.to_sym => value}
31
- else
32
- key.to_s.split(".").reverse.inject(value) { |hash, part| {part.to_sym => hash} }
33
- end
34
- end
35
-
36
- def self.contains_only_dots?(string)
37
- string.to_s.gsub(/\./, "").length == 0
38
- end
39
-
40
- def self.starts_with_dot?(string)
41
- string.to_s.start_with?(".")
42
- end
43
-
44
- def self.ends_with_dot?(string)
45
- string.to_s.end_with?(".")
46
- end
47
-
48
- def self.escape_default_separator(key)
49
- key.to_s.tr(FLATTEN_SEPARATOR, SEPARATOR_ESCAPE_CHAR)
50
- end
51
- end
52
- end
53
- end
@@ -1,53 +0,0 @@
1
- module PhraseApp
2
- module InContextEditor
3
- class KeyNamesCache
4
- attr_reader :api_wrapper
5
-
6
- def initialize(api_wrapper)
7
- @api_wrapper = api_wrapper
8
- end
9
-
10
- def pre_cached(key_names)
11
- unless cache.cached?(:translation_key_names)
12
- cache.set(:translation_key_names, prefetched_key_names)
13
- end
14
-
15
- return key_names.select { |key_name| key_name_precached?(key_name) }
16
- end
17
-
18
- def pre_fetched(key_names)
19
- key_names.select { |key_name| covered_by_initial_caching?(key_name) }
20
- end
21
-
22
- private
23
-
24
- def prefetched_key_names
25
- prefetched = Set.new
26
- PhraseApp::InContextEditor.cache_key_segments_initial.each do |prefix|
27
- api_wrapper.keys_with_prefix(prefix).each do |key|
28
- prefetched.add(key.name)
29
- end
30
- end
31
- prefetched
32
- end
33
-
34
- def covered_by_initial_caching?(key_name)
35
- key_name.start_with?(*PhraseApp::InContextEditor.cache_key_segments_initial)
36
- end
37
-
38
- def key_name_is_in_cache?(key_name)
39
- cache.get(:translation_key_names).include?(key_name)
40
- end
41
-
42
- def key_name_precached?(key_name)
43
- covered = covered_by_initial_caching?(key_name)
44
- in_cache = key_name_is_in_cache?(key_name)
45
- return covered && in_cache
46
- end
47
-
48
- def cache
49
- RequestStore.store[:phraseapp_cache] ||= PhraseApp::InContextEditor::Cache.new
50
- end
51
- end
52
- end
53
- end
@@ -1,5 +0,0 @@
1
- module PhraseApp
2
- module InContextEditor
3
- VERSION = "1.4.0"
4
- end
5
- end