rewritten 0.15.2 → 0.16.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 +4 -4
- data/.rubocop.yml +12 -0
- data/.rubocop_todo.yml +116 -0
- data/Gemfile +1 -1
- data/HISTORY.rdoc +4 -0
- data/Rakefile +1 -5
- data/bin/rewritten-dump.rb +11 -14
- data/bin/rewritten-import.rb +9 -12
- data/bin/rewritten-web.rb +7 -9
- data/config.ru +0 -1
- data/lib/rack/canonical.rb +6 -14
- data/lib/rack/dummy.rb +7 -14
- data/lib/rack/html.rb +4 -13
- data/lib/rack/record.rb +3 -9
- data/lib/rack/subdomain.rb +5 -13
- data/lib/rack/url.rb +19 -24
- data/lib/rewritten.rb +45 -69
- data/lib/rewritten/config.ru +0 -1
- data/lib/rewritten/document.rb +6 -7
- data/lib/rewritten/helpers.rb +0 -1
- data/lib/rewritten/rails/url_helpers.rb +0 -3
- data/lib/rewritten/server.rb +58 -73
- data/lib/rewritten/server/test_helper.rb +2 -2
- data/lib/rewritten/version.rb +1 -2
- data/rewritten.gemspec +19 -22
- data/test/rack/rewritten_canonical_test.rb +23 -31
- data/test/rack/rewritten_html_test.rb +16 -21
- data/test/rack/rewritten_url_test.rb +77 -95
- data/test/rewritten/document_test.rb +28 -28
- data/test/rewritten_test.rb +25 -36
- data/test/test_helper.rb +2 -4
- metadata +4 -2
data/lib/rewritten/config.ru
CHANGED
data/lib/rewritten/document.rb
CHANGED
@@ -7,32 +7,31 @@ module Rewritten
|
|
7
7
|
def path
|
8
8
|
plural = ActiveSupport::Inflector.pluralize(self.class.to_s)
|
9
9
|
resources = ActiveSupport::Inflector.underscore(plural)
|
10
|
-
"/#{resources}/#{
|
10
|
+
"/#{resources}/#{id}"
|
11
11
|
end
|
12
12
|
|
13
13
|
def rewritten_url
|
14
|
-
return
|
14
|
+
return '' unless persisted?
|
15
15
|
Rewritten.get_current_translation(path)
|
16
16
|
end
|
17
17
|
|
18
18
|
def rewritten_url=(new_url)
|
19
|
-
if !new_url.nil? && new_url !=
|
19
|
+
if !new_url.nil? && new_url != '' && new_url != rewritten_url
|
20
20
|
Rewritten.add_translation(new_url, path)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def rewritten_urls
|
25
|
-
return [] unless persisted?
|
25
|
+
return [] unless persisted?
|
26
26
|
Rewritten.get_all_translations(path)
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
29
|
+
def rewritten_url?
|
30
30
|
Rewritten.exist_translation_for?(path)
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def remove_rewritten_urls
|
34
34
|
Rewritten.remove_all_translations(path)
|
35
35
|
end
|
36
|
-
|
37
36
|
end
|
38
37
|
end
|
data/lib/rewritten/helpers.rb
CHANGED
data/lib/rewritten/server.rb
CHANGED
@@ -6,7 +6,6 @@ require 'time'
|
|
6
6
|
|
7
7
|
module Rewritten
|
8
8
|
class Server < Sinatra::Base
|
9
|
-
|
10
9
|
dir = File.dirname(File.expand_path(__FILE__))
|
11
10
|
|
12
11
|
set :views, "#{dir}/server/views"
|
@@ -18,15 +17,15 @@ module Rewritten
|
|
18
17
|
alias_method :h, :escape_html
|
19
18
|
|
20
19
|
def current_section
|
21
|
-
url_path request.path_info.sub('/','').split('/')[0].downcase
|
20
|
+
url_path request.path_info.sub('/', '').split('/')[0].downcase
|
22
21
|
end
|
23
22
|
|
24
23
|
def current_page
|
25
|
-
url_path request.path_info.sub('/','')
|
24
|
+
url_path request.path_info.sub('/', '')
|
26
25
|
end
|
27
26
|
|
28
27
|
def url_path(*path_parts)
|
29
|
-
[
|
28
|
+
[path_prefix, path_parts].join('/').squeeze('/')
|
30
29
|
end
|
31
30
|
alias_method :u, :url_path
|
32
31
|
|
@@ -63,7 +62,7 @@ module Rewritten
|
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
def redis_get_value_as_array(key, start=0)
|
65
|
+
def redis_get_value_as_array(key, start = 0)
|
67
66
|
case Resque.redis.type(key)
|
68
67
|
when 'none'
|
69
68
|
[]
|
@@ -79,12 +78,12 @@ module Rewritten
|
|
79
78
|
end
|
80
79
|
|
81
80
|
def extract_translations
|
82
|
-
text = params[:translations]
|
81
|
+
text = params[:translations] || ''
|
83
82
|
text.split("\n").map(&:strip).reject(&:empty?)
|
84
83
|
end
|
85
84
|
|
86
85
|
def show_args(args)
|
87
|
-
Array(args).map
|
86
|
+
Array(args).map(&:inspect).join("\n")
|
88
87
|
end
|
89
88
|
|
90
89
|
def worker_hosts
|
@@ -95,7 +94,7 @@ module Rewritten
|
|
95
94
|
hosts = Hash.new { [] }
|
96
95
|
|
97
96
|
Resque.workers.each do |worker|
|
98
|
-
host,
|
97
|
+
host, = worker.to_s.split(':')
|
99
98
|
hosts[host] += [worker.to_s]
|
100
99
|
end
|
101
100
|
|
@@ -108,94 +107,86 @@ module Rewritten
|
|
108
107
|
|
109
108
|
def partial(template, local_vars = {})
|
110
109
|
@partial = true
|
111
|
-
erb(template.to_sym, {:
|
110
|
+
erb(template.to_sym, { layout: false }, local_vars)
|
112
111
|
ensure
|
113
112
|
@partial = false
|
114
113
|
end
|
115
114
|
|
116
115
|
def poll
|
117
116
|
if @polling
|
118
|
-
text = "Last Updated: #{Time.now.strftime(
|
117
|
+
text = "Last Updated: #{Time.now.strftime('%H:%M:%S')}"
|
119
118
|
else
|
120
119
|
text = "<a href='#{u(request.path_info)}.poll' rel='poll'>Live Poll</a>"
|
121
120
|
end
|
122
121
|
"<p class='poll'>#{text}</p>"
|
123
122
|
end
|
124
|
-
|
125
123
|
end # enf of helpers
|
126
|
-
|
127
124
|
|
128
125
|
def show(page, layout = true)
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
erb :error, {:layout => false}, :error => "Can't connect to Redis! (#{Rewritten.redis_id})"
|
133
|
-
end
|
126
|
+
erb page.to_sym, { layout: layout }, rewritten: Rewritten
|
127
|
+
rescue Errno::ECONNREFUSED
|
128
|
+
erb :error, { layout: false }, error: "Can't connect to Redis! (#{Rewritten.redis_id})"
|
134
129
|
end
|
135
|
-
|
130
|
+
|
136
131
|
def show_for_polling(page)
|
137
|
-
content_type
|
132
|
+
content_type 'text/html'
|
138
133
|
@polling = true
|
139
134
|
show(page.to_sym, false).gsub(/\s{1,}/, ' ')
|
140
135
|
end
|
141
136
|
|
142
|
-
|
143
137
|
################################################################################
|
144
138
|
|
145
|
-
|
146
|
-
get "/?" do
|
139
|
+
get '/?' do
|
147
140
|
redirect url_path(:translations)
|
148
141
|
end
|
149
142
|
|
150
|
-
get
|
143
|
+
get '/translations' do
|
151
144
|
@size = 0
|
152
145
|
@start = params[:start].to_i
|
153
146
|
|
154
147
|
filter = params[:f]
|
155
148
|
|
156
|
-
if filter && filter !=
|
149
|
+
if filter && filter != ''
|
157
150
|
@translations = []
|
158
151
|
|
159
152
|
keys = Rewritten.redis.keys("from:#{filter}") +
|
160
|
-
Rewritten.redis.keys("to:#{filter}")
|
153
|
+
Rewritten.redis.keys("to:#{filter}")
|
161
154
|
|
162
155
|
keys.each do |key|
|
163
|
-
prefix, url = key.split(
|
164
|
-
if prefix ==
|
156
|
+
prefix, url = key.split(':')
|
157
|
+
if prefix == 'from'
|
165
158
|
to = Rewritten.translate(url)
|
166
159
|
@translations << [url, to]
|
167
|
-
elsif prefix ==
|
168
|
-
from = Rewritten.get_current_translation(url)
|
160
|
+
elsif prefix == 'to'
|
161
|
+
from = Rewritten.get_current_translation(url)
|
169
162
|
@translations << [from, url]
|
170
163
|
end
|
171
164
|
end
|
172
165
|
|
173
166
|
@size = @translations.size
|
174
|
-
@translations = @translations[params[:start].to_i..params[:start].to_i+Rewritten.per_page-1]
|
167
|
+
@translations = @translations[params[:start].to_i..params[:start].to_i + Rewritten.per_page - 1]
|
175
168
|
|
176
169
|
else
|
177
170
|
@size = Rewritten.num_froms
|
178
|
-
froms = Rewritten.all_froms[@start, @start+Rewritten.per_page-1]
|
179
|
-
@translations = froms.map{|f| [f, Rewritten.translate(f)]}
|
171
|
+
froms = Rewritten.all_froms[@start, @start + Rewritten.per_page - 1]
|
172
|
+
@translations = froms.map { |f| [f, Rewritten.translate(f)] }
|
180
173
|
end
|
181
174
|
|
182
|
-
|
183
175
|
show 'translations'
|
184
176
|
end
|
185
177
|
|
186
|
-
get
|
178
|
+
get '/new' do
|
187
179
|
@translations = []
|
188
|
-
show
|
180
|
+
show 'new'
|
189
181
|
end
|
190
182
|
|
191
|
-
get
|
183
|
+
get '/edit' do
|
192
184
|
@old_to = @to = params[:to]
|
193
|
-
@translations = Rewritten.get_all_translations(@to).map{|t| Rewritten.full_line(t)}
|
194
|
-
show
|
185
|
+
@translations = Rewritten.get_all_translations(@to).map { |t| Rewritten.full_line(t) }
|
186
|
+
show 'edit'
|
195
187
|
end
|
196
188
|
|
197
|
-
post
|
198
|
-
|
189
|
+
post '/edit' do
|
199
190
|
@old_to = params[:old].strip
|
200
191
|
@to = params[:to].strip
|
201
192
|
@translations = extract_translations
|
@@ -205,85 +196,79 @@ module Rewritten
|
|
205
196
|
# delete old translations
|
206
197
|
Rewritten.remove_all_translations(@old_to)
|
207
198
|
# create new translations
|
208
|
-
|
199
|
+
|
209
200
|
Rewritten.add_translations(@to, @translations)
|
210
201
|
|
211
202
|
redirect u("/to?to=#{escape(@to)}")
|
212
203
|
else
|
213
|
-
show
|
204
|
+
show 'edit'
|
214
205
|
end
|
215
|
-
|
216
206
|
end
|
217
207
|
|
218
|
-
post
|
208
|
+
post '/translations' do
|
219
209
|
@to = params[:to].strip
|
220
|
-
@translations = extract_translations
|
210
|
+
@translations = extract_translations
|
221
211
|
if @to != '' && @translations.size > 0
|
222
212
|
Rewritten.add_translations(@to, @translations)
|
223
213
|
redirect u('translations')
|
224
214
|
else
|
225
|
-
show
|
215
|
+
show 'new'
|
226
216
|
end
|
227
217
|
end
|
228
218
|
|
229
|
-
get
|
219
|
+
get '/to' do
|
230
220
|
@translations = Rewritten.get_all_translations(params[:to])
|
231
|
-
show
|
221
|
+
show 'to'
|
232
222
|
end
|
233
223
|
|
234
|
-
get
|
224
|
+
get '/cleanup' do
|
235
225
|
# find keys that have no target
|
236
|
-
@from_without_tos= []
|
226
|
+
@from_without_tos = []
|
237
227
|
Rewritten.all_froms.each do |from|
|
238
|
-
if Rewritten.redis.get("from:#{from}").empty?
|
239
|
-
@from_without_tos << from
|
240
|
-
end
|
228
|
+
@from_without_tos << from if Rewritten.redis.get("from:#{from}").empty?
|
241
229
|
end
|
242
|
-
|
243
|
-
show
|
230
|
+
|
231
|
+
show 'cleanup'
|
244
232
|
end
|
245
233
|
|
246
|
-
get
|
234
|
+
get '/delete' do
|
247
235
|
@from = params[:from]
|
248
236
|
@to = params[:to]
|
249
|
-
show
|
237
|
+
show 'delete'
|
250
238
|
end
|
251
239
|
|
252
240
|
post '/delete' do
|
253
241
|
from = params[:from]
|
254
242
|
to = params[:to]
|
255
243
|
Rewritten.remove_translation(from, to)
|
256
|
-
redirect u(
|
244
|
+
redirect u('/')
|
257
245
|
end
|
258
246
|
|
259
|
-
get
|
247
|
+
get '/delete_all' do
|
260
248
|
@to = params[:to]
|
261
|
-
show
|
249
|
+
show 'delete_all'
|
262
250
|
end
|
263
251
|
|
264
|
-
post
|
252
|
+
post '/delete_all' do
|
265
253
|
Rewritten.remove_all_translations(params[:to])
|
266
|
-
redirect u(
|
254
|
+
redirect u('/')
|
267
255
|
end
|
268
256
|
|
269
|
-
get
|
270
|
-
show
|
257
|
+
get '/hits' do
|
258
|
+
show 'hits'
|
271
259
|
end
|
272
260
|
|
273
|
-
get
|
274
|
-
show
|
261
|
+
get '/hits/clear' do
|
262
|
+
show 'clear_hits'
|
275
263
|
end
|
276
264
|
|
277
|
-
post
|
278
|
-
Rewritten.redis.del(
|
279
|
-
redirect u(
|
265
|
+
post '/hits/clear' do
|
266
|
+
Rewritten.redis.del('hits')
|
267
|
+
redirect u('/hits')
|
280
268
|
end
|
281
269
|
|
282
270
|
def self.tabs
|
283
|
-
@tabs ||=
|
271
|
+
@tabs ||= %w(Translations Hits)
|
284
272
|
end
|
285
|
-
|
286
273
|
end
|
287
274
|
end
|
288
|
-
|
289
|
-
|
@@ -7,10 +7,10 @@ module Resque
|
|
7
7
|
include Rack::Test::Methods
|
8
8
|
def app
|
9
9
|
Resque::Server.new
|
10
|
-
end
|
10
|
+
end
|
11
11
|
|
12
12
|
def self.should_respond_with_success
|
13
|
-
test
|
13
|
+
test 'should respond with success' do
|
14
14
|
assert last_response.ok?, last_response.errors
|
15
15
|
end
|
16
16
|
end
|
data/lib/rewritten/version.rb
CHANGED
data/rewritten.gemspec
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
require
|
2
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'rewritten/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
6
|
+
s.name = 'rewritten'
|
7
7
|
s.version = Rewritten::VERSION
|
8
|
-
s.authors = [
|
9
|
-
s.email = [
|
10
|
-
s.homepage =
|
11
|
-
s.summary =
|
8
|
+
s.authors = ['Kai Rubarth']
|
9
|
+
s.email = ['kai@doxter.de']
|
10
|
+
s.homepage = ''
|
11
|
+
s.summary = 'A redis-based URL rewriting engine'
|
12
12
|
|
13
|
-
s.rubyforge_project =
|
13
|
+
s.rubyforge_project = 'rewritten'
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
-
s.require_paths = [
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ['lib']
|
19
19
|
|
20
|
-
s.add_dependency
|
21
|
-
s.add_dependency
|
22
|
-
s.add_dependency
|
23
|
-
s.add_dependency
|
24
|
-
s.add_dependency
|
20
|
+
s.add_dependency 'redis-namespace'
|
21
|
+
s.add_dependency 'vegas', '~> 0.1.2'
|
22
|
+
s.add_dependency 'sinatra', '>= 0.9.2'
|
23
|
+
s.add_dependency 'multi_json', '~> 1.0'
|
24
|
+
s.add_dependency 'activesupport'
|
25
25
|
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
28
|
-
s.add_development_dependency
|
29
|
-
s.add_development_dependency
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'minitest'
|
28
|
+
s.add_development_dependency 'pry'
|
29
|
+
s.add_development_dependency 'coveralls'
|
30
30
|
|
31
31
|
s.description = <<description
|
32
32
|
Rewritten is a lookup-based rewriting engine that rewrites requested
|
@@ -46,7 +46,4 @@ Gem::Specification.new do |s|
|
|
46
46
|
4. A Rack app for substituting URLs in HTML pages with their current translation (Rack::Rewritten::Html)
|
47
47
|
5. A Rack app for recording successful request (Rack::Rewritten::Record)
|
48
48
|
description
|
49
|
-
|
50
49
|
end
|
51
|
-
|
52
|
-
|
@@ -1,22 +1,20 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
describe Rack::Rewritten::Canonical do
|
4
|
-
|
5
|
-
|
6
|
-
{'HTTP_HOST' => 'www.example.org',
|
4
|
+
def call_args(overrides = {})
|
5
|
+
{ 'HTTP_HOST' => 'www.example.org',
|
7
6
|
'REQUEST_URI' => '/foo/with/params',
|
8
|
-
'SCRIPT_INFO'=> '',
|
7
|
+
'SCRIPT_INFO' => '',
|
9
8
|
'PATH_INFO' => '/foo/with/params',
|
10
9
|
'QUERY_STRING' => '',
|
11
10
|
'SERVER_PORT' => 80,
|
12
11
|
'rack.input' => '',
|
13
|
-
'rack.url_scheme' => 'http'}.merge(overrides)
|
14
|
-
end
|
15
|
-
|
16
|
-
def request_url(url, params={})
|
17
|
-
call_args.merge({'REQUEST_URI' => url, 'PATH_INFO' => url}.merge(params) )
|
12
|
+
'rack.url_scheme' => 'http' }.merge(overrides)
|
18
13
|
end
|
19
14
|
|
15
|
+
def request_url(url, params = {})
|
16
|
+
call_args.merge({ 'REQUEST_URI' => url, 'PATH_INFO' => url }.merge(params))
|
17
|
+
end
|
20
18
|
|
21
19
|
before do
|
22
20
|
Rewritten.add_translation '/foo/bar', '/products/1'
|
@@ -29,37 +27,31 @@ describe Rack::Rewritten::Canonical do
|
|
29
27
|
<body>Hello</body>
|
30
28
|
</html>
|
31
29
|
HTML
|
32
|
-
@rack = Rack::Rewritten::Canonical.new(
|
33
|
-
|
30
|
+
@rack = Rack::Rewritten::Canonical.new(->(_env) { [200, { 'Content-Type' => 'text/html' }, [@html_body]] })
|
34
31
|
end
|
35
32
|
|
36
|
-
describe 'canonical tag' do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
html =
|
41
|
-
html.must_include '<link rel="canonical" href="http://www.example.org/foo/baz"/>'
|
33
|
+
describe 'canonical tag' do
|
34
|
+
it 'must add the canonical tag to current translation if on non-translated page' do
|
35
|
+
_res, _env, body = @rack.call request_url('/products/1')
|
36
|
+
html = body.join('')
|
37
|
+
html.must_include '<link rel="canonical" href="http://www.example.org/foo/baz"/>'
|
42
38
|
end
|
43
39
|
|
44
|
-
it
|
45
|
-
|
46
|
-
html = body.join(
|
47
|
-
html.must_include
|
40
|
+
it 'the target of the canonical tag must have no params' do
|
41
|
+
_res, _env, body = @rack.call request_url('/products/1').merge('QUERY_STRING' => 'some=param')
|
42
|
+
html = body.join('')
|
43
|
+
html.must_include '<link rel="canonical" href="http://www.example.org/foo/baz"/>'
|
48
44
|
end
|
49
45
|
|
50
46
|
describe 'context partial' do
|
51
|
-
before{ Rewritten.translate_partial = true }
|
52
|
-
after{ Rewritten.translate_partial = false }
|
47
|
+
before { Rewritten.translate_partial = true }
|
48
|
+
after { Rewritten.translate_partial = false }
|
53
49
|
|
54
|
-
it
|
55
|
-
|
56
|
-
html = body.join(
|
57
|
-
html.must_include
|
50
|
+
it 'must add the canonical tag to pages with tail' do
|
51
|
+
_res, _env, body = @rack.call request_url('/products/1/with/tail')
|
52
|
+
html = body.join('')
|
53
|
+
html.must_include '<link rel="canonical" href="http://www.example.org/foo/baz"/>'
|
58
54
|
end
|
59
|
-
|
60
55
|
end
|
61
|
-
|
62
56
|
end
|
63
|
-
|
64
57
|
end
|
65
|
-
|