i18n-backend-http 0.1.3 → 0.2.0

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: 36137a83ff8e2c9c616f494ab4b84c55f6751f1c
4
- data.tar.gz: 827f9ac3ed6688b05ca39dee9a90cc3f55ca2c61
3
+ metadata.gz: 6253fa4b449db0c86fc538654b5d435d1cbcf0a7
4
+ data.tar.gz: 7672f4606b3645647594312efe3e3c1f4f93bfc3
5
5
  SHA512:
6
- metadata.gz: 73bba6050a343f6c5fdcb44add77fd1a00c05e9fbdd6ba74b138533d1e3a66ae171140672982f23af13a242d5182874c349ff3e26aa7f30fe1915f29da196986
7
- data.tar.gz: b372946bcb397e949af0218b86fa9f4ccdfdfdc254437fdea4dd2b1bf892a06d238bf8b1cf3b9ecca4c7abf7957377898a899dffa045ab30ca2e27f3701da447
6
+ metadata.gz: f98a33068b3b8766b80d6c32c4939ed2546b7ebf9fd3b0f4d9f4ff47821b80ea089a7960ce645870f233e49f404f2131f0085441d5b87dd21477e4b16bee1ebd
7
+ data.tar.gz: b80e56c5688166d236e6f941000a23f958dd27b768fc7cd600e4772c83bffe7676dc250a91c93012dee400cb455e5a8b5cfbfc7d5e82ede0e892a5e5e2e85843
@@ -1,11 +1,11 @@
1
1
  require 'i18n'
2
2
  require 'i18n/backend/transliterator'
3
3
  require 'i18n/backend/base'
4
- require 'gem_of_thrones'
5
4
  require 'i18n/backend/http/version'
6
5
  require 'i18n/backend/http/etag_http_client'
7
6
  require 'i18n/backend/http/null_cache'
8
7
  require 'i18n/backend/http/lru_cache'
8
+ require 'socket'
9
9
 
10
10
  module I18n
11
11
  module Backend
@@ -70,19 +70,31 @@ module I18n
70
70
  end
71
71
 
72
72
  def locked_update_cache(locale)
73
- @aspirants ||= {}
74
- aspirant = @aspirants[locale] ||= GemOfThrones.new(
75
- :cache => @options[:cache],
76
- :timeout => (@options[:polling_interval] * 3).ceil,
77
- :cache_key => "i18n/backend/http/locked_update_caches/#{locale}"
78
- )
79
- if aspirant.rise_to_power
80
- download_and_cache_translations(locale)
81
- else
73
+ unless update_cache(locale) { download_and_cache_translations(locale) }
82
74
  update_memory_cache_from_cache(locale)
83
75
  end
84
76
  end
85
77
 
78
+ def update_cache(locale)
79
+ cache = @options.fetch(:cache)
80
+ key = "i18n/backend/http/locked_update_caches/#{locale}"
81
+ me = "#{Socket.gethostname}-#{Process.pid}-#{Thread.current.object_id}"
82
+ if current = cache.read(key)
83
+ if current == me
84
+ try = false # I am responsible, renew expiration
85
+ else
86
+ return # someone else is responsible, do not touch
87
+ end
88
+ else
89
+ try = true # nobody is responsible, try to get responsibility
90
+ end
91
+
92
+ return unless cache.write(key, me, expires_in: (@options[:polling_interval] * 3).ceil, unless_exist: try)
93
+
94
+ yield
95
+ true
96
+ end
97
+
86
98
  def update_memory_cache_from_cache(locale)
87
99
  @translations[locale] = translations_from_cache(locale)
88
100
  end
@@ -3,31 +3,30 @@ require 'faraday'
3
3
  module I18n
4
4
  module Backend
5
5
  class Http
6
- end
7
- end
8
- end
6
+ class I18n::Backend::Http::EtagHttpClient
7
+ def initialize(options)
8
+ @options = options
9
+ @etags = {}
10
+ end
9
11
 
10
- class I18n::Backend::Http::EtagHttpClient
11
- def initialize(options)
12
- @options = options
13
- @etags = {}
14
- end
15
-
16
- def download(path)
17
- @client ||= Faraday.new(@options[:host])
18
- response = @client.get(path) do |request|
19
- request.headers["If-None-Match"] = @etags[path] if @etags[path]
20
- request.options[:timeout] = @options[:http_read_timeout]
21
- request.options[:open_timeout] = @options[:http_open_timeout]
22
- end
12
+ def download(path)
13
+ @client ||= Faraday.new(@options[:host])
14
+ response = @client.get(path) do |request|
15
+ request.headers["If-None-Match"] = @etags[path] if @etags[path]
16
+ request.options[:timeout] = @options[:http_read_timeout]
17
+ request.options[:open_timeout] = @options[:http_open_timeout]
18
+ end
23
19
 
24
- @etags[path] = response['ETag']
20
+ @etags[path] = response['ETag']
25
21
 
26
- case response.status
27
- when 200 then yield response.body
28
- when 304
29
- else
30
- raise "Failed request: #{response.inspect}"
22
+ case response.status
23
+ when 200 then yield response.body
24
+ when 304
25
+ else
26
+ raise "Failed request: #{response.inspect}"
27
+ end
28
+ end
29
+ end
31
30
  end
32
31
  end
33
32
  end
@@ -1,40 +1,39 @@
1
+ # http://codesnippets.joyent.com/posts/show/12329
1
2
  module I18n
2
3
  module Backend
3
4
  class Http
4
- end
5
- end
6
- end
7
-
8
- # http://codesnippets.joyent.com/posts/show/12329
9
- class I18n::Backend::Http::LRUCache
10
- def initialize(size = 10)
11
- @size = size
12
- @store = {}
13
- @lru = []
14
- end
5
+ class I18n::Backend::Http::LRUCache
6
+ def initialize(size = 10)
7
+ @size = size
8
+ @store = {}
9
+ @lru = []
10
+ end
15
11
 
16
- def []=(key, value)
17
- @store[key] = value
18
- set_lru(key)
19
- @store.delete(@lru.pop) if @lru.size > @size
20
- end
12
+ def []=(key, value)
13
+ @store[key] = value
14
+ set_lru(key)
15
+ @store.delete(@lru.pop) if @lru.size > @size
16
+ end
21
17
 
22
- def [](key)
23
- set_lru(key)
24
- @store[key]
25
- end
18
+ def [](key)
19
+ set_lru(key)
20
+ @store[key]
21
+ end
26
22
 
27
- def keys
28
- @store.keys
29
- end
23
+ def keys
24
+ @store.keys
25
+ end
30
26
 
31
- def values
32
- @store.values
33
- end
27
+ def values
28
+ @store.values
29
+ end
34
30
 
35
- private
31
+ private
36
32
 
37
- def set_lru(key)
38
- @lru.unshift(@lru.delete(key) || key)
33
+ def set_lru(key)
34
+ @lru.unshift(@lru.delete(key) || key)
35
+ end
36
+ end
37
+ end
39
38
  end
40
39
  end
@@ -1,19 +1,18 @@
1
1
  module I18n
2
2
  module Backend
3
3
  class Http
4
- end
5
- end
6
- end
4
+ class I18n::Backend::Http::NullCache
5
+ def fetch(*args)
6
+ yield
7
+ end
7
8
 
8
- class I18n::Backend::Http::NullCache
9
- def fetch(*args)
10
- yield
11
- end
9
+ def read(key)
10
+ end
12
11
 
13
- def read(key)
14
- end
15
-
16
- def write(key, value)
17
- value
12
+ def write(key, value)
13
+ value
14
+ end
15
+ end
16
+ end
18
17
  end
19
18
  end
@@ -1,7 +1,7 @@
1
1
  module I18n
2
2
  module Backend
3
3
  class Http
4
- VERSION = Version = "0.1.3"
4
+ VERSION = Version = "0.2.0"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-backend-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-08 00:00:00.000000000 Z
11
+ date: 2017-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: gem_of_thrones
28
+ name: faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,13 +39,125 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: faraday
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :runtime
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: maxitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: mocha
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: wwtd
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: json
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bump
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: single_cov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
49
161
  prerelease: false
50
162
  version_requirements: !ruby/object:Gem::Requirement
51
163
  requirements:
@@ -75,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
75
187
  requirements:
76
188
  - - ">="
77
189
  - !ruby/object:Gem::Version
78
- version: '0'
190
+ version: 2.0.0
79
191
  required_rubygems_version: !ruby/object:Gem::Requirement
80
192
  requirements:
81
193
  - - ">="
@@ -83,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
195
  version: '0'
84
196
  requirements: []
85
197
  rubyforge_project:
86
- rubygems_version: 2.2.2
198
+ rubygems_version: 2.5.1
87
199
  signing_key:
88
200
  specification_version: 4
89
201
  summary: Rails I18n Backend for Http APIs with etag-aware background polling and memory+[memcache]