copy_tuner_client 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +2 -4
- data/copy_tuner_client.gemspec +1 -1
- data/gemfiles/2.3.gemfile.lock +2 -4
- data/gemfiles/3.0.gemfile.lock +2 -4
- data/gemfiles/3.1.gemfile.lock +2 -4
- data/lib/copy_tuner_client/cache.rb +12 -2
- data/lib/copy_tuner_client/request_sync.rb +96 -7
- data/lib/copy_tuner_client/version.rb +1 -1
- data/ui/views/copytuner/index.html.erb +35 -0
- data/ui/views/layouts/copytuner_default.html.erb +24 -0
- metadata +7 -5
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
copy_tuner_client (0.0.
|
4
|
+
copy_tuner_client (0.0.4)
|
5
5
|
i18n (>= 0.5.0)
|
6
6
|
json
|
7
7
|
|
@@ -123,8 +123,6 @@ GEM
|
|
123
123
|
rack (~> 1.0)
|
124
124
|
tilt (~> 1.1, != 1.3.0)
|
125
125
|
sqlite3 (1.3.4)
|
126
|
-
sqlite3-ruby (1.3.3)
|
127
|
-
sqlite3 (>= 1.3.3)
|
128
126
|
term-ansicolor (1.0.6)
|
129
127
|
thin (1.2.11)
|
130
128
|
daemons (>= 1.0.9)
|
@@ -158,7 +156,7 @@ DEPENDENCIES
|
|
158
156
|
rspec (~> 2.3)
|
159
157
|
sham_rack
|
160
158
|
sinatra
|
161
|
-
sqlite3
|
159
|
+
sqlite3
|
162
160
|
thin
|
163
161
|
turn
|
164
162
|
webmock
|
data/copy_tuner_client.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_development_dependency 'rspec', '~> 2.3'
|
16
16
|
s.add_development_dependency 'sham_rack'
|
17
17
|
s.add_development_dependency 'sinatra'
|
18
|
-
s.add_development_dependency 'sqlite3
|
18
|
+
s.add_development_dependency 'sqlite3'
|
19
19
|
s.add_development_dependency 'thin'
|
20
20
|
s.add_development_dependency 'webmock'
|
21
21
|
s.add_development_dependency 'yard'
|
data/gemfiles/2.3.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/mat_aki/gem/copy-tuner-ruby-client
|
3
3
|
specs:
|
4
|
-
copy_tuner_client (0.0.
|
4
|
+
copy_tuner_client (0.0.4)
|
5
5
|
i18n (>= 0.5.0)
|
6
6
|
json
|
7
7
|
|
@@ -73,8 +73,6 @@ GEM
|
|
73
73
|
rack (~> 1.1)
|
74
74
|
tilt (>= 1.2.2, < 2.0)
|
75
75
|
sqlite3 (1.3.7)
|
76
|
-
sqlite3-ruby (1.3.3)
|
77
|
-
sqlite3 (>= 1.3.3)
|
78
76
|
term-ansicolor (1.0.7)
|
79
77
|
thin (1.5.0)
|
80
78
|
daemons (>= 1.0.9)
|
@@ -103,7 +101,7 @@ DEPENDENCIES
|
|
103
101
|
rspec (~> 2.3)
|
104
102
|
sham_rack
|
105
103
|
sinatra
|
106
|
-
sqlite3
|
104
|
+
sqlite3
|
107
105
|
thin
|
108
106
|
turn
|
109
107
|
webmock
|
data/gemfiles/3.0.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/mat_aki/gem/copy-tuner-ruby-client
|
3
3
|
specs:
|
4
|
-
copy_tuner_client (0.0.
|
4
|
+
copy_tuner_client (0.0.4)
|
5
5
|
i18n (>= 0.5.0)
|
6
6
|
json
|
7
7
|
|
@@ -113,8 +113,6 @@ GEM
|
|
113
113
|
rack (~> 1.1)
|
114
114
|
tilt (>= 1.2.2, < 2.0)
|
115
115
|
sqlite3 (1.3.7)
|
116
|
-
sqlite3-ruby (1.3.3)
|
117
|
-
sqlite3 (>= 1.3.3)
|
118
116
|
term-ansicolor (1.0.7)
|
119
117
|
thin (1.5.0)
|
120
118
|
daemons (>= 1.0.9)
|
@@ -148,7 +146,7 @@ DEPENDENCIES
|
|
148
146
|
rspec (~> 2.3)
|
149
147
|
sham_rack
|
150
148
|
sinatra
|
151
|
-
sqlite3
|
149
|
+
sqlite3
|
152
150
|
thin
|
153
151
|
turn
|
154
152
|
webmock
|
data/gemfiles/3.1.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/mat_aki/gem/copy-tuner-ruby-client
|
3
3
|
specs:
|
4
|
-
copy_tuner_client (0.0.
|
4
|
+
copy_tuner_client (0.0.4)
|
5
5
|
i18n (>= 0.5.0)
|
6
6
|
json
|
7
7
|
|
@@ -144,8 +144,6 @@ GEM
|
|
144
144
|
rack (~> 1.0)
|
145
145
|
tilt (~> 1.1, != 1.3.0)
|
146
146
|
sqlite3 (1.3.7)
|
147
|
-
sqlite3-ruby (1.3.3)
|
148
|
-
sqlite3 (>= 1.3.3)
|
149
147
|
term-ansicolor (1.0.7)
|
150
148
|
thin (1.5.0)
|
151
149
|
daemons (>= 1.0.9)
|
@@ -185,7 +183,7 @@ DEPENDENCIES
|
|
185
183
|
sass-rails
|
186
184
|
sham_rack
|
187
185
|
sinatra
|
188
|
-
sqlite3
|
186
|
+
sqlite3
|
189
187
|
thin
|
190
188
|
turn
|
191
189
|
uglifier
|
@@ -88,9 +88,13 @@ module CopyTunerClient
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def flush
|
91
|
-
with_queued_changes do |queued|
|
91
|
+
res = with_queued_changes do |queued|
|
92
92
|
client.upload queued
|
93
93
|
end
|
94
|
+
|
95
|
+
@last_uploaded_at = Time.now.utc
|
96
|
+
|
97
|
+
res
|
94
98
|
rescue ConnectionError => error
|
95
99
|
logger.error error.message
|
96
100
|
end
|
@@ -98,10 +102,14 @@ module CopyTunerClient
|
|
98
102
|
def download
|
99
103
|
@started = true
|
100
104
|
|
101
|
-
client.download do |downloaded_blurbs|
|
105
|
+
res = client.download do |downloaded_blurbs|
|
102
106
|
downloaded_blurbs.reject! { |key, value| value == '' }
|
103
107
|
lock { @blurbs = downloaded_blurbs }
|
104
108
|
end
|
109
|
+
|
110
|
+
@last_downloaded_at = Time.now.utc
|
111
|
+
|
112
|
+
res
|
105
113
|
rescue ConnectionError => error
|
106
114
|
logger.error error.message
|
107
115
|
ensure
|
@@ -114,6 +122,8 @@ module CopyTunerClient
|
|
114
122
|
flush
|
115
123
|
end
|
116
124
|
|
125
|
+
attr_reader :last_downloaded_at, :last_uploaded_at, :queued
|
126
|
+
|
117
127
|
private
|
118
128
|
|
119
129
|
attr_reader :client, :logger
|
@@ -1,13 +1,21 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'rack/request'
|
3
|
+
require 'rack/response'
|
4
|
+
|
5
|
+
# ref) NewRelic gem https://github.com/newrelic/rpm/blob/master/lib/new_relic/rack/developer_mode.rb
|
6
|
+
|
1
7
|
module CopyTunerClient
|
2
8
|
# Rack middleware that synchronizes with CopyTuner during each request.
|
3
9
|
#
|
4
10
|
# This is injected into the Rails middleware stack in development environments.
|
5
11
|
class RequestSync
|
12
|
+
VIEW_PATH = File.expand_path('../../../ui/views/', __FILE__)
|
13
|
+
|
6
14
|
# @param app [Rack] the upstream app into whose responses to inject the editor
|
7
15
|
# @param options [Hash]
|
8
16
|
# @option options [Cache] :cache agent that should be flushed after each request
|
9
17
|
def initialize(app, options)
|
10
|
-
@app
|
18
|
+
@app = app
|
11
19
|
@cache = options[:cache]
|
12
20
|
@interval = options[:interval]
|
13
21
|
@last_synced = options[:last_synced]
|
@@ -18,14 +26,91 @@ module CopyTunerClient
|
|
18
26
|
# Invokes the upstream Rack application and flushes the cache after each
|
19
27
|
# request.
|
20
28
|
def call(env)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
29
|
+
if /^\/copytuner/ =~ ::Rack::Request.new(env).path_info
|
30
|
+
dup._call(env, last_synced: @last_synced)
|
31
|
+
else
|
32
|
+
@cache.download unless asset_request?(env) or in_interval?
|
33
|
+
response = @app.call(env)
|
34
|
+
@cache.flush unless asset_request?(env) or in_interval?
|
35
|
+
update_last_synced unless in_interval?
|
36
|
+
response
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def _call(env, vals = {})
|
43
|
+
@req = ::Rack::Request.new(env)
|
44
|
+
|
45
|
+
case @req.path_info
|
46
|
+
when /^\/copytuner\/?$/
|
47
|
+
index
|
48
|
+
when /sync/
|
49
|
+
sync
|
50
|
+
else
|
51
|
+
@app.call(env)
|
52
|
+
end
|
26
53
|
end
|
27
54
|
|
28
55
|
private
|
56
|
+
|
57
|
+
def index
|
58
|
+
@next_sync_at = next_sync_at
|
59
|
+
render :index
|
60
|
+
end
|
61
|
+
|
62
|
+
def sync
|
63
|
+
@cache.sync
|
64
|
+
::Rack::Response.new{|r| r.redirect('/copytuner/')}.finish
|
65
|
+
end
|
66
|
+
|
67
|
+
def render(view, layout=true)
|
68
|
+
add_rack_array = true
|
69
|
+
if view.is_a? Hash
|
70
|
+
layout = false
|
71
|
+
if view[:object]
|
72
|
+
object = view[:object]
|
73
|
+
end
|
74
|
+
|
75
|
+
if view[:collection]
|
76
|
+
return view[:collection].map do |object|
|
77
|
+
render({:partial => view[:partial], :object => object})
|
78
|
+
end.join(' ')
|
79
|
+
end
|
80
|
+
|
81
|
+
if view[:partial]
|
82
|
+
add_rack_array = false
|
83
|
+
view = "_#{view[:partial]}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
binding = Proc.new {}.binding
|
87
|
+
if layout
|
88
|
+
body = render_with_layout(view) do
|
89
|
+
render_without_layout(view, binding)
|
90
|
+
end
|
91
|
+
else
|
92
|
+
body = render_without_layout(view, binding)
|
93
|
+
end
|
94
|
+
if add_rack_array
|
95
|
+
::Rack::Response.new(body).finish
|
96
|
+
else
|
97
|
+
body
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# You have to call this with a block - the contents returned from
|
102
|
+
# that block are interpolated into the layout
|
103
|
+
def render_with_layout(view)
|
104
|
+
body = ERB.new(File.read(File.join(VIEW_PATH, 'layouts/copytuner_default.html.erb')))
|
105
|
+
body.result(Proc.new {}.binding)
|
106
|
+
end
|
107
|
+
|
108
|
+
# you have to pass a binding to this (a proc) so that ERB can have
|
109
|
+
# access to helper functions and local variables
|
110
|
+
def render_without_layout(view, binding)
|
111
|
+
ERB.new(File.read(File.join(VIEW_PATH, 'copytuner', view.to_s + '.html.erb')), nil, nil, 'frobnitz').result(binding)
|
112
|
+
end
|
113
|
+
|
29
114
|
def asset_request?(env)
|
30
115
|
env['PATH_INFO'] =~ /^\/assets/
|
31
116
|
end
|
@@ -33,7 +118,11 @@ module CopyTunerClient
|
|
33
118
|
def in_interval?
|
34
119
|
return false if @last_synced.nil?
|
35
120
|
return false if @interval <= 0
|
36
|
-
|
121
|
+
next_sync_at > Time.now.utc
|
122
|
+
end
|
123
|
+
|
124
|
+
def next_sync_at
|
125
|
+
@last_synced + @interval if @last_synced and @interval
|
37
126
|
end
|
38
127
|
|
39
128
|
def update_last_synced
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="span12">
|
3
|
+
<dl>
|
4
|
+
<dt>最終ダウンロード時間</dt>
|
5
|
+
<dd>
|
6
|
+
<%= @cache.last_downloaded_at %>
|
7
|
+
</dd>
|
8
|
+
<dt>最終アップロード時間</dt>
|
9
|
+
<dd>
|
10
|
+
<%= @cache.last_uploaded_at %>
|
11
|
+
</dd>
|
12
|
+
<dt>次回同期時間</dt>
|
13
|
+
<dd>
|
14
|
+
<%= @next_sync_at %>
|
15
|
+
</dd>
|
16
|
+
</dl>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div class="row">
|
21
|
+
<div class="span12">
|
22
|
+
<a href="/copytuner/sync" class="btn btn-primary">
|
23
|
+
翻訳データを同期する
|
24
|
+
</a>
|
25
|
+
|
26
|
+
<% unless @cache.queued.empty? %>
|
27
|
+
<h3>送信前翻訳キー</h3>
|
28
|
+
<ul>
|
29
|
+
<% @cache.queued.each do |key, value| %>
|
30
|
+
<li><%= key %></li>
|
31
|
+
<% end %>
|
32
|
+
</ul>
|
33
|
+
<% end %>
|
34
|
+
</div>
|
35
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css" rel="stylesheet">
|
6
|
+
<style type="text/css">
|
7
|
+
body { margin-top: 60px }
|
8
|
+
</style>
|
9
|
+
<title>CopyTuner Developer Mode</title>
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
<div class="navbar navbar-fixed-top">
|
13
|
+
<div class="navbar-inner">
|
14
|
+
<div class="container">
|
15
|
+
<a class="brand" href="/copytuner/">CopyTuner Developer Mode</a>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<div id='main' class='container'>
|
20
|
+
<%= yield %>
|
21
|
+
</div>
|
22
|
+
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/js/bootstrap.min.js"></script>
|
23
|
+
</body>
|
24
|
+
</html>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: copy_tuner_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|
@@ -204,7 +204,7 @@ dependencies:
|
|
204
204
|
- !ruby/object:Gem::Version
|
205
205
|
version: '0'
|
206
206
|
- !ruby/object:Gem::Dependency
|
207
|
-
name: sqlite3
|
207
|
+
name: sqlite3
|
208
208
|
requirement: !ruby/object:Gem::Requirement
|
209
209
|
none: false
|
210
210
|
requirements:
|
@@ -346,6 +346,8 @@ files:
|
|
346
346
|
- spec/support/middleware_stack.rb
|
347
347
|
- spec/support/writing_cache.rb
|
348
348
|
- tmp/projects.json
|
349
|
+
- ui/views/copytuner/index.html.erb
|
350
|
+
- ui/views/layouts/copytuner_default.html.erb
|
349
351
|
homepage: https://github.com/SonicGarden/copy-tuner-ruby-client
|
350
352
|
licenses: []
|
351
353
|
post_install_message:
|
@@ -360,7 +362,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
360
362
|
version: '0'
|
361
363
|
segments:
|
362
364
|
- 0
|
363
|
-
hash:
|
365
|
+
hash: 1986208387973179793
|
364
366
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
365
367
|
none: false
|
366
368
|
requirements:
|
@@ -369,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
369
371
|
version: '0'
|
370
372
|
segments:
|
371
373
|
- 0
|
372
|
-
hash:
|
374
|
+
hash: 1986208387973179793
|
373
375
|
requirements: []
|
374
376
|
rubyforge_project:
|
375
377
|
rubygems_version: 1.8.23
|