jpmobile 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +4 -4
- data/VERSION.yml +1 -1
- data/lib/jpmobile/emoticon.rb +3 -1
- data/lib/jpmobile/filter.rb +6 -1
- data/lib/jpmobile/mobile/abstract_mobile.rb +10 -0
- data/lib/jpmobile/mobile/iphone.rb +10 -0
- data/lib/jpmobile/mobile/smart_phone.rb +10 -0
- data/lib/jpmobile/rack/filter.rb +45 -1
- data/lib/jpmobile/rack/params_filter.rb +1 -1
- data/lib/jpmobile/sinatra.rb +16 -0
- data/lib/jpmobile/trans_sid.rb +1 -1
- data/spec/rack/jpmobile/emoticon_spec.rb +52 -0
- data/spec/unit/emoticon_spec.rb +4 -0
- data/spec/unit/encoding_spec.rb +2 -2
- data/spec/unit/mail_spec.rb +2 -2
- data/spec/unit/receive_mail_spec.rb +5 -5
- data/test/rails/overrides/app/controllers/hankaku_input_filter_controller.rb +3 -0
- data/test/rails/overrides/app/views/hankaku_input_filter/with_charset.html.erb +1 -0
- data/test/rails/overrides/app/views/layouts/with_charset.html.erb +13 -0
- data/test/rails/overrides/spec/models/mobile_mailer_spec.rb +1 -1
- data/test/rails/overrides/spec/requests/filter_spec.rb +10 -0
- data/test/sinatra/config.ru +2 -0
- data/test/sinatra/guestbook.rb +8 -7
- data/test/sinatra/test/filter_test.rb +10 -0
- data/test/sinatra/views/index.erb +1 -0
- data/test/sinatra/views/index_mobile.erb +1 -0
- metadata +42 -36
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= jpmobile: A Rails plugin for Japanese mobile-phones
|
2
2
|
|
3
3
|
== jpmobileとは
|
4
|
-
携帯電話特有の機能を Rails 3.
|
4
|
+
携帯電話特有の機能を Rails 3.1 や Rack middleware で利用するためのプラグイン。
|
5
5
|
以下の機能を備える。
|
6
6
|
|
7
7
|
* 携帯電話のキャリア判別
|
@@ -18,7 +18,7 @@
|
|
18
18
|
* メールの受信(experimental)
|
19
19
|
* 絵文字と漢字コードの変換
|
20
20
|
|
21
|
-
また Rails 3.
|
21
|
+
また Rails 3.1 に以下の機能を追加する
|
22
22
|
* ビューへの自動振分け
|
23
23
|
* 位置情報取得などのリンクヘルパーの追加
|
24
24
|
* セッションIDをフォーム/リンクに付与(Trans SID)
|
@@ -223,7 +223,7 @@ Androidの場合はindex_smart_phone_android.html.erb、Windows Phoneの場合
|
|
223
223
|
=== 位置情報の取得用リンクの生成
|
224
224
|
|
225
225
|
以下のようなコードで、端末に位置情報を要求するリンクを出力する。
|
226
|
-
<%= get_position_link_to(:action=>:gps) %>
|
226
|
+
<%= get_position_link_to("位置情報を取得する", :action=>:gps) %>
|
227
227
|
|
228
228
|
=== セッションIDの付与(Trans SID)
|
229
229
|
==== Cookie非対応携帯だけに付与する
|
@@ -237,7 +237,7 @@ Androidの場合はindex_smart_phone_android.html.erb、Windows Phoneの場合
|
|
237
237
|
end
|
238
238
|
|
239
239
|
trans_sid 機能を使う場合には cookie session store を使用することができません。
|
240
|
-
また Rails 3.
|
240
|
+
また Rails 3.1 では Cookie が使える場合にはそちらが優先されてしまうため、:always を指定した場合に問題になる場合があります。
|
241
241
|
trans_sid を使用する際には、例えば config/initializers/session_store.rb で
|
242
242
|
Rails.application.config.session_store :active_record_store
|
243
243
|
Rails.application.config.session_options = {:cookie_only => false}
|
data/VERSION.yml
CHANGED
data/lib/jpmobile/emoticon.rb
CHANGED
@@ -153,7 +153,7 @@ module Jpmobile
|
|
153
153
|
def self.unicodecr_to_au_email(in_str)
|
154
154
|
str = Jpmobile::Util.ascii_8bit(in_str)
|
155
155
|
regexp = Regexp.compile(Jpmobile::Util.ascii_8bit("&#x([0-9a-f]{4});"), Regexp::IGNORECASE)
|
156
|
-
str.gsub(regexp) do |match|
|
156
|
+
str = str.gsub(regexp) do |match|
|
157
157
|
unicode = $1.scanf("%x").first
|
158
158
|
converted = CONVERSION_TABLE_TO_AU[unicode]
|
159
159
|
|
@@ -176,6 +176,8 @@ module Jpmobile
|
|
176
176
|
match
|
177
177
|
end
|
178
178
|
end
|
179
|
+
regexp = Regexp.compile(Regexp.escape(Jpmobile::Util.ascii_8bit("\x1b\x28\x42\x1b\x24\x42")), Regexp::IGNORECASE)
|
180
|
+
str.gsub(regexp, '')
|
179
181
|
end
|
180
182
|
|
181
183
|
# +str+ のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する
|
data/lib/jpmobile/filter.rb
CHANGED
@@ -40,6 +40,9 @@ module Jpmobile
|
|
40
40
|
# 内部コードから外部コードに変換
|
41
41
|
def after(controller, options = {})
|
42
42
|
if apply_outgoing?(controller) and controller.response.body.is_a?(String)
|
43
|
+
if controller.request.mobile?
|
44
|
+
options.merge!(:charset => controller.request.mobile.default_charset)
|
45
|
+
end
|
43
46
|
controller.response.body = to_external(controller.response.body, options)
|
44
47
|
end
|
45
48
|
end
|
@@ -64,7 +67,9 @@ module Jpmobile
|
|
64
67
|
|
65
68
|
doc = convert_text_content(doc)
|
66
69
|
|
67
|
-
doc.to_html.gsub("\xc2\xa0"," ")
|
70
|
+
html = doc.to_html.gsub("\xc2\xa0"," ")
|
71
|
+
html = html.gsub(/charset=[a-z0-9\-]+/i, "charset=#{options[:charset]}") if options[:charset]
|
72
|
+
html
|
68
73
|
end
|
69
74
|
end
|
70
75
|
|
@@ -58,6 +58,16 @@ module Jpmobile::Mobile
|
|
58
58
|
false
|
59
59
|
end
|
60
60
|
|
61
|
+
# Jpmobile::Rack::Filter を適用するかどうか
|
62
|
+
def apply_filter?
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
# Jpmobile::Rack::ParamsFilter を適用するかどうか
|
67
|
+
def apply_params_filter?
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
61
71
|
# エンコーディング変換用
|
62
72
|
def to_internal(str)
|
63
73
|
str
|
@@ -7,6 +7,16 @@ module Jpmobile::Mobile
|
|
7
7
|
# 対応するUser-Agentの正規表現
|
8
8
|
USER_AGENT_REGEXP = /iPhone/
|
9
9
|
|
10
|
+
# Jpmobile::Rack::Filter を適用する
|
11
|
+
def apply_filter?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
# Jpmobile::Rack::ParamsFilter を適用する
|
16
|
+
def apply_params_filter?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
10
20
|
# 文字コード変換
|
11
21
|
def to_internal(str)
|
12
22
|
# 絵文字を数値参照に変換
|
data/lib/jpmobile/rack/filter.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# 出力変換
|
3
|
+
require 'scanf'
|
4
|
+
|
3
5
|
module Jpmobile
|
4
6
|
module Rack
|
5
7
|
class Filter
|
@@ -13,7 +15,7 @@ module Jpmobile
|
|
13
15
|
|
14
16
|
status, env, response = @app.call(env)
|
15
17
|
|
16
|
-
if mobile and env['Content-Type'] =~ %r!text/html|application/xhtml\+xml!
|
18
|
+
if mobile and mobile.apply_filter? and env['Content-Type'] =~ %r!text/html|application/xhtml\+xml!
|
17
19
|
type, charset = env['Content-Type'].split(/;\s*charset=/)
|
18
20
|
|
19
21
|
body = response_to_body(response)
|
@@ -25,6 +27,17 @@ module Jpmobile
|
|
25
27
|
if type and charset
|
26
28
|
env['Content-Type'] = "#{type}; charset=#{charset}"
|
27
29
|
end
|
30
|
+
elsif pc_emoticon?
|
31
|
+
body = response_to_body(response)
|
32
|
+
|
33
|
+
response = body.gsub(/&#x([0-9a-f]{4});/i) do |match|
|
34
|
+
img = @pc_emoticon_hash[$1.upcase] || (@pc_emoticon_hash[("%x" % ($1.scanf("%x").first - 0x1000)).upcase] rescue nil)
|
35
|
+
if img
|
36
|
+
"<img src=\"#{@@pc_emoticon_image_path}/#{img}.gif\" alt=\"#{img}\" />"
|
37
|
+
else
|
38
|
+
""
|
39
|
+
end
|
40
|
+
end
|
28
41
|
end
|
29
42
|
|
30
43
|
new_response = ::Rack::Response.new(response, status, env)
|
@@ -32,6 +45,25 @@ module Jpmobile
|
|
32
45
|
end
|
33
46
|
|
34
47
|
private
|
48
|
+
def pc_emoticon?
|
49
|
+
if @@pc_emoticon_yaml and File.exist?(@@pc_emoticon_yaml) and
|
50
|
+
@@pc_emoticon_image_path and FileTest.directory?(@@pc_emoticon_image_path)
|
51
|
+
|
52
|
+
unless @pc_emoticon_hash
|
53
|
+
begin
|
54
|
+
yaml_hash = YAML.load_file(@@pc_emoticon_yaml)
|
55
|
+
@pc_emoticon_hash = Hash[*(yaml_hash.values.inject([]){ |r, v| r += v.to_a.flatten; r})]
|
56
|
+
@@pc_emoticon_image_path.chop if @@pc_emoticon_image_path.match(/\/$/)
|
57
|
+
|
58
|
+
return true
|
59
|
+
rescue => ex
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
|
35
67
|
def response_to_body(response)
|
36
68
|
if response.respond_to?(:to_str)
|
37
69
|
response.to_str
|
@@ -45,6 +77,18 @@ module Jpmobile
|
|
45
77
|
body
|
46
78
|
end
|
47
79
|
end
|
80
|
+
|
81
|
+
@@pc_emoticon_image_path = nil
|
82
|
+
@@pc_emoticon_yaml = nil
|
83
|
+
class << self
|
84
|
+
def pc_emoticon_image_path=(path)
|
85
|
+
@@pc_emoticon_image_path = path
|
86
|
+
end
|
87
|
+
|
88
|
+
def pc_emoticon_yaml=(file)
|
89
|
+
@@pc_emoticon_yaml = file
|
90
|
+
end
|
91
|
+
end
|
48
92
|
end
|
49
93
|
end
|
50
94
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Jpmobile
|
2
|
+
module Sinatra
|
3
|
+
class Base < ::Sinatra::Base
|
4
|
+
# Calls the given block for every possible template file in views,
|
5
|
+
# named name.ext, where ext is registered on engine.
|
6
|
+
def find_template(views, name, engine)
|
7
|
+
if env['rack.jpmobile'] and !env['rack.jpmobile'].variants.empty?
|
8
|
+
env['rack.jpmobile'].variants.each do |variant|
|
9
|
+
yield ::File.join(views, "#{name}_#{variant}.#{@preferred_extension}")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/jpmobile/trans_sid.rb
CHANGED
@@ -16,6 +16,9 @@ describe "絵文字が" do
|
|
16
16
|
|
17
17
|
@softbank_cr = ""
|
18
18
|
@softbank_utf8 = [0xf04a].pack("U")
|
19
|
+
|
20
|
+
@emoticon_yaml = File.join(File.expand_path(File.dirname(__FILE__)), "../../../tmp/emoticon.yml")
|
21
|
+
@emoticon_images = File.join(File.expand_path(File.dirname(__FILE__)), "../../../tmp/emoticons")
|
19
22
|
end
|
20
23
|
|
21
24
|
context "PC のとき" do
|
@@ -45,6 +48,55 @@ describe "絵文字が" do
|
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
context "PC で絵文字を変換するとき" do
|
52
|
+
before(:each) do
|
53
|
+
unless FileTest.exist?(File.join(File.expand_path(File.dirname(__FILE__)), '../../../tmp/emoticon.yaml')) and
|
54
|
+
FileTest.directory?(File.join(File.expand_path(File.dirname(__FILE__)), '../../../tmp/emoticons'))
|
55
|
+
pending "emoticon.yaml and emoticons directory don't exists"
|
56
|
+
end
|
57
|
+
|
58
|
+
@res = Rack::MockRequest.env_for("/", 'Content-Type' => 'text/html; charset=utf-8')
|
59
|
+
|
60
|
+
Jpmobile::Rack::Filter.pc_emoticon_yaml = "tmp/emoticon.yaml"
|
61
|
+
Jpmobile::Rack::Filter.pc_emoticon_image_path = @path = "tmp/emoticons"
|
62
|
+
end
|
63
|
+
|
64
|
+
after(:each) do
|
65
|
+
Jpmobile::Rack::Filter.pc_emoticon_yaml = nil
|
66
|
+
Jpmobile::Rack::Filter.pc_emoticon_image_path = nil
|
67
|
+
end
|
68
|
+
|
69
|
+
it "docomo 絵文字が画像に変換されること" do
|
70
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@docomo_cr))).call(@res)[2]
|
71
|
+
response_body(response).should == "<img src=\"#{@path}/sun.gif\" alt=\"sun\" />"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "docomo 絵文字コードの埋込みは変換されないこと" do
|
75
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@docomo_utf8))).call(@res)[2]
|
76
|
+
response_body(response).should == @docomo_utf8
|
77
|
+
end
|
78
|
+
|
79
|
+
it "au 絵文字が画像に変換されること" do
|
80
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@au_cr))).call(@res)[2]
|
81
|
+
response_body(response).should == "<img src=\"#{@path}/sun.gif\" alt=\"sun\" />"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "au 絵文字コードの埋込みは変換されないこと" do
|
85
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@au_utf8))).call(@res)[2]
|
86
|
+
response_body(response).should == @au_utf8
|
87
|
+
end
|
88
|
+
|
89
|
+
it "softbank 絵文字が画像に変換されること" do
|
90
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@softbank_cr))).call(@res)[2]
|
91
|
+
response_body(response).should == "<img src=\"#{@path}/sun.gif\" alt=\"sun\" />"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "softbank 絵文字コードの埋込みは変換されないこと" do
|
95
|
+
response = Jpmobile::Rack::MobileCarrier.new(Jpmobile::Rack::Filter.new(UnitApplication.new(@softbank_utf8))).call(@res)[2]
|
96
|
+
response_body(response).should == @softbank_utf8
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
48
100
|
context "docomo のとき" do
|
49
101
|
before(:each) do
|
50
102
|
@res = Rack::MockRequest.env_for(
|
data/spec/unit/emoticon_spec.rb
CHANGED
@@ -85,6 +85,10 @@ describe Jpmobile::Emoticon do
|
|
85
85
|
it "should not convert ascii string to unicodecr" do
|
86
86
|
Jpmobile::Emoticon.external_to_unicodecr_au_mail(utf8_to_jis("-------=_NextPart_15793_72254_63179")).should_not match(/e5c2/i)
|
87
87
|
end
|
88
|
+
|
89
|
+
it "should not include extra JIS escape sequence between Kanji-code and emoticon" do
|
90
|
+
Jpmobile::Emoticon.unicodecr_to_au_email(utf8_to_jis("掲示板")).should == Jpmobile::Util.ascii_8bit("\x1b\x24\x42\x75\x3a\x37\x47\x3C\x28\x48\x44\x1b\x28\x42")
|
91
|
+
end
|
88
92
|
end
|
89
93
|
end
|
90
94
|
end
|
data/spec/unit/encoding_spec.rb
CHANGED
@@ -59,7 +59,7 @@ describe "Jpmobile::Mobile" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should convert emoticon  to \x75\x41 in B-Encoding" do
|
62
|
-
@mobile.to_mail_subject("ほげ").should == "=?ISO-2022-JP?B?
|
62
|
+
@mobile.to_mail_subject("ほげ").should == "=?ISO-2022-JP?B?GyRCJFskMnVBGyhC?="
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -69,7 +69,7 @@ describe "Jpmobile::Mobile" do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should convert emoticon  to \x75\x41" do
|
72
|
-
ascii_8bit(@mobile.to_mail_body("ほげ")).should == ascii_8bit(
|
72
|
+
ascii_8bit(@mobile.to_mail_body("ほげ")).should == ascii_8bit(jis("\e\x24\x42\x24\x5B\x24\x32\x75\x41\x1b\x28\x42"))
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
data/spec/unit/mail_spec.rb
CHANGED
@@ -111,8 +111,8 @@ describe "Jpmobile::Mail" do
|
|
111
111
|
@mail.subject += ""
|
112
112
|
@mail.body = "#{@mail.body}"
|
113
113
|
|
114
|
-
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape("=?ISO-2022-JP?B?
|
115
|
-
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit("\
|
114
|
+
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape("=?ISO-2022-JP?B?GyRCS3xNVXVBGyhC?=")))
|
115
|
+
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit("\e\x24\x42\x24\x5B\x24\x32\x75\x41\e\x28\x42"))))
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
@@ -105,7 +105,7 @@ describe "Jpmobile::Mail#receive" do
|
|
105
105
|
end
|
106
106
|
|
107
107
|
it "should encode correctly" do
|
108
|
-
ascii_8bit(@mail.to_s).should match(Regexp.escape("
|
108
|
+
ascii_8bit(@mail.to_s).should match(Regexp.escape("GyRCJUYlOSVIdk8bKEI="))
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -201,23 +201,23 @@ describe "Jpmobile::Mail#receive" do
|
|
201
201
|
|
202
202
|
context "to_s" do
|
203
203
|
it "should have subject which is same as original" do
|
204
|
-
ascii_8bit(@mail.to_s).should match(Regexp.escape("
|
204
|
+
ascii_8bit(@mail.to_s).should match(Regexp.escape("GyRCQmpMPnZeGyhC"))
|
205
205
|
end
|
206
206
|
|
207
207
|
it "should have body which is same as original" do
|
208
|
-
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit(
|
208
|
+
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit("\e\x24\x42\x4B\x5C\x4A\x38\x76\x7D\e\x28\x42"))))
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
212
212
|
context "modify and to_s" do
|
213
213
|
it "should encode subject correctly" do
|
214
214
|
@mail.subject = "大江戸"
|
215
|
-
ascii_8bit(@mail.to_s).should match(
|
215
|
+
ascii_8bit(@mail.to_s).should match(/\?GyRCQmc5PjhNdUEbKEI=/)
|
216
216
|
end
|
217
217
|
|
218
218
|
it "should encode body correctly" do
|
219
219
|
@mail.body = "会議が開催"
|
220
|
-
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit("\x1b\x24\x42\x32\x71\x35\x44\x24\x2C\x33\x2B\x3A\x45\
|
220
|
+
ascii_8bit(@mail.to_s).should match(Regexp.compile(Regexp.escape(ascii_8bit("\x1b\x24\x42\x32\x71\x35\x44\x24\x2C\x33\x2B\x3A\x45\x75\x48\x1b\x28\x42"))))
|
221
221
|
end
|
222
222
|
end
|
223
223
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= link_to 'リンク', '#' -%>
|
@@ -163,7 +163,7 @@ describe MobileMailer do
|
|
163
163
|
|
164
164
|
raw_mail = ascii_8bit(email.to_s)
|
165
165
|
raw_mail.should match(/For au/)
|
166
|
-
raw_mail.should match(Regexp.escape("
|
166
|
+
raw_mail.should match(Regexp.escape("GyRCRnxLXDhsQmpMPnZeGyhC"))
|
167
167
|
raw_mail.should match(Regexp.compile(ascii_8bit("\x76\x21")))
|
168
168
|
end
|
169
169
|
|
@@ -215,6 +215,11 @@ describe "jpmobile integration spec" do
|
|
215
215
|
end
|
216
216
|
it_should_behave_like "Shift_JISで通信する端末との通信(半角変換付き)"
|
217
217
|
it_should_behave_like "hankaku_filter :input => true のとき"
|
218
|
+
|
219
|
+
it "Content-Type が Shift_JIS であること" do
|
220
|
+
get "/#{@controller}/with_charset", {}, {"HTTP_USER_AGENT" => @user_agent}
|
221
|
+
body.should match(/Shift_JIS/)
|
222
|
+
end
|
218
223
|
end
|
219
224
|
|
220
225
|
describe HankakuInputFilterController, "SoftBank 910T からのアクセス" do
|
@@ -225,5 +230,10 @@ describe "jpmobile integration spec" do
|
|
225
230
|
end
|
226
231
|
it_should_behave_like "UTF-8で通信する端末との通信(半角変換付き)"
|
227
232
|
it_should_behave_like "hankaku_filter :input => true のとき"
|
233
|
+
|
234
|
+
it "Content-Type が UTF-8 であること" do
|
235
|
+
get "/#{@controller}/with_charset", {}, {"HTTP_USER_AGENT" => @user_agent}
|
236
|
+
body.should match(/UTF-8/)
|
237
|
+
end
|
228
238
|
end
|
229
239
|
end
|
data/test/sinatra/guestbook.rb
CHANGED
@@ -1,26 +1,25 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sinatra'
|
3
|
-
require 'jpmobile'
|
3
|
+
require File.join(File.dirname(__FILE__), '../../lib/jpmobile')
|
4
4
|
require 'jpmobile/rack'
|
5
5
|
require 'singleton'
|
6
6
|
require 'pp'
|
7
7
|
|
8
|
-
require 'jpmobile'
|
9
|
-
require 'jpmobile/rack'
|
8
|
+
require 'jpmobile/sinatra'
|
10
9
|
|
11
10
|
class SinatraTestHelper
|
12
11
|
include Singleton
|
13
12
|
attr_accessor :last_app
|
14
13
|
end
|
15
14
|
|
16
|
-
class Guestbook < Sinatra::Base
|
15
|
+
class Guestbook < Jpmobile::Sinatra::Base
|
17
16
|
use Jpmobile::Rack::MobileCarrier
|
18
17
|
use Jpmobile::Rack::ParamsFilter
|
19
18
|
use Jpmobile::Rack::Filter
|
20
19
|
|
21
20
|
def call(env)
|
22
21
|
_dup = dup
|
23
|
-
SinatraTestHelper.instance.last_app = _dup
|
22
|
+
::SinatraTestHelper.instance.last_app = _dup
|
24
23
|
_dup.call!(env)
|
25
24
|
end
|
26
25
|
|
@@ -35,6 +34,8 @@ class Guestbook < Sinatra::Base
|
|
35
34
|
post '/' do
|
36
35
|
@p = params[:p]
|
37
36
|
end
|
38
|
-
end
|
39
37
|
|
40
|
-
|
38
|
+
get '/top' do
|
39
|
+
erb :index
|
40
|
+
end
|
41
|
+
end
|
@@ -36,4 +36,14 @@ class SinatraOnJpmobile < Test::Unit::TestCase
|
|
36
36
|
assert_equal last_app.assigns(:p), "けーたい"
|
37
37
|
assert_equal last_response.body, utf8_to_sjis("けーたい")
|
38
38
|
end
|
39
|
+
|
40
|
+
# def test_view_selector_pc
|
41
|
+
# get '/top', {}, {"HTTP_USER_AGENT" => "Mozilla"}
|
42
|
+
# assert_equal last_response.body, 'PC'
|
43
|
+
# end
|
44
|
+
|
45
|
+
# def test_view_selector_mobile
|
46
|
+
# get '/top', {}, {"HTTP_USER_AGENT" => "DoCoMo/2.0 SH902i(c100;TB;W24H12)"}
|
47
|
+
# assert_equal last_response.body, 'MOBILE'
|
48
|
+
# end
|
39
49
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
PC
|
@@ -0,0 +1 @@
|
|
1
|
+
MOBILE
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jpmobile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-26 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: jeweler
|
17
|
-
requirement: &
|
17
|
+
requirement: &20415560 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *20415560
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rails
|
28
|
-
requirement: &
|
28
|
+
requirement: &20415080 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 3.1.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *20415080
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &20393360 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *20393360
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rspec-rails
|
50
|
-
requirement: &
|
50
|
+
requirement: &20392880 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *20392880
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: webrat
|
61
|
-
requirement: &
|
61
|
+
requirement: &20392400 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *20392400
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: geokit
|
72
|
-
requirement: &
|
72
|
+
requirement: &20391920 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *20391920
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: sqlite3-ruby
|
83
|
-
requirement: &
|
83
|
+
requirement: &20391440 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *20391440
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: hpricot
|
94
|
-
requirement: &
|
94
|
+
requirement: &20390860 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ! '>='
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: '0'
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *20390860
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: rails
|
105
|
-
requirement: &
|
105
|
+
requirement: &20390380 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
108
|
- - ! '>='
|
@@ -110,10 +110,10 @@ dependencies:
|
|
110
110
|
version: 3.1.0
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
|
-
version_requirements: *
|
113
|
+
version_requirements: *20390380
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
115
|
name: jeweler
|
116
|
-
requirement: &
|
116
|
+
requirement: &20389820 !ruby/object:Gem::Requirement
|
117
117
|
none: false
|
118
118
|
requirements:
|
119
119
|
- - ! '>='
|
@@ -121,10 +121,10 @@ dependencies:
|
|
121
121
|
version: 1.5.1
|
122
122
|
type: :development
|
123
123
|
prerelease: false
|
124
|
-
version_requirements: *
|
124
|
+
version_requirements: *20389820
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rspec
|
127
|
-
requirement: &
|
127
|
+
requirement: &20389320 !ruby/object:Gem::Requirement
|
128
128
|
none: false
|
129
129
|
requirements:
|
130
130
|
- - ! '>='
|
@@ -132,10 +132,10 @@ dependencies:
|
|
132
132
|
version: 2.6.0
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
|
-
version_requirements: *
|
135
|
+
version_requirements: *20389320
|
136
136
|
- !ruby/object:Gem::Dependency
|
137
137
|
name: rspec-rails
|
138
|
-
requirement: &
|
138
|
+
requirement: &20388840 !ruby/object:Gem::Requirement
|
139
139
|
none: false
|
140
140
|
requirements:
|
141
141
|
- - ! '>='
|
@@ -143,10 +143,10 @@ dependencies:
|
|
143
143
|
version: 2.6.0
|
144
144
|
type: :development
|
145
145
|
prerelease: false
|
146
|
-
version_requirements: *
|
146
|
+
version_requirements: *20388840
|
147
147
|
- !ruby/object:Gem::Dependency
|
148
148
|
name: webrat
|
149
|
-
requirement: &
|
149
|
+
requirement: &20388340 !ruby/object:Gem::Requirement
|
150
150
|
none: false
|
151
151
|
requirements:
|
152
152
|
- - ! '>='
|
@@ -154,10 +154,10 @@ dependencies:
|
|
154
154
|
version: 0.7.2
|
155
155
|
type: :development
|
156
156
|
prerelease: false
|
157
|
-
version_requirements: *
|
157
|
+
version_requirements: *20388340
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
159
|
name: geokit
|
160
|
-
requirement: &
|
160
|
+
requirement: &20387800 !ruby/object:Gem::Requirement
|
161
161
|
none: false
|
162
162
|
requirements:
|
163
163
|
- - ! '>='
|
@@ -165,10 +165,10 @@ dependencies:
|
|
165
165
|
version: 1.5.0
|
166
166
|
type: :development
|
167
167
|
prerelease: false
|
168
|
-
version_requirements: *
|
168
|
+
version_requirements: *20387800
|
169
169
|
- !ruby/object:Gem::Dependency
|
170
170
|
name: sqlite3-ruby
|
171
|
-
requirement: &
|
171
|
+
requirement: &20387280 !ruby/object:Gem::Requirement
|
172
172
|
none: false
|
173
173
|
requirements:
|
174
174
|
- - ! '>='
|
@@ -176,10 +176,10 @@ dependencies:
|
|
176
176
|
version: 1.3.2
|
177
177
|
type: :development
|
178
178
|
prerelease: false
|
179
|
-
version_requirements: *
|
179
|
+
version_requirements: *20387280
|
180
180
|
- !ruby/object:Gem::Dependency
|
181
181
|
name: hpricot
|
182
|
-
requirement: &
|
182
|
+
requirement: &20386760 !ruby/object:Gem::Requirement
|
183
183
|
none: false
|
184
184
|
requirements:
|
185
185
|
- - ! '>='
|
@@ -187,10 +187,10 @@ dependencies:
|
|
187
187
|
version: 0.8.3
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
|
-
version_requirements: *
|
190
|
+
version_requirements: *20386760
|
191
191
|
- !ruby/object:Gem::Dependency
|
192
192
|
name: git
|
193
|
-
requirement: &
|
193
|
+
requirement: &20386260 !ruby/object:Gem::Requirement
|
194
194
|
none: false
|
195
195
|
requirements:
|
196
196
|
- - ! '>='
|
@@ -198,7 +198,7 @@ dependencies:
|
|
198
198
|
version: 1.2.5
|
199
199
|
type: :development
|
200
200
|
prerelease: false
|
201
|
-
version_requirements: *
|
201
|
+
version_requirements: *20386260
|
202
202
|
description: A Rails plugin for Japanese mobile-phones
|
203
203
|
email: dara@shidara.net
|
204
204
|
executables: []
|
@@ -259,6 +259,7 @@ files:
|
|
259
259
|
- lib/jpmobile/rails.rb
|
260
260
|
- lib/jpmobile/request_with_mobile.rb
|
261
261
|
- lib/jpmobile/resolver.rb
|
262
|
+
- lib/jpmobile/sinatra.rb
|
262
263
|
- lib/jpmobile/trans_sid.rb
|
263
264
|
- lib/jpmobile/util.rb
|
264
265
|
- lib/tasks/jpmobile_tasks.rake
|
@@ -326,7 +327,9 @@ files:
|
|
326
327
|
- test/rails/overrides/app/views/hankaku_filter/index.html.erb
|
327
328
|
- test/rails/overrides/app/views/hankaku_input_filter/index.html.erb
|
328
329
|
- test/rails/overrides/app/views/hankaku_input_filter/index_xhtml.html.erb
|
330
|
+
- test/rails/overrides/app/views/hankaku_input_filter/with_charset.html.erb
|
329
331
|
- test/rails/overrides/app/views/layouts/application_mobile.html.erb
|
332
|
+
- test/rails/overrides/app/views/layouts/with_charset.html.erb
|
330
333
|
- test/rails/overrides/app/views/layouts/xhtml.html.erb
|
331
334
|
- test/rails/overrides/app/views/links/au_gps.html.erb
|
332
335
|
- test/rails/overrides/app/views/links/au_location.html.erb
|
@@ -398,8 +401,11 @@ files:
|
|
398
401
|
- test/rails/overrides/spec/requests/template_path_spec.rb
|
399
402
|
- test/rails/overrides/spec/requests/trans_sid_spec.rb
|
400
403
|
- test/rails/overrides/spec/spec_helper.rb
|
404
|
+
- test/sinatra/config.ru
|
401
405
|
- test/sinatra/guestbook.rb
|
402
406
|
- test/sinatra/test/filter_test.rb
|
407
|
+
- test/sinatra/views/index.erb
|
408
|
+
- test/sinatra/views/index_mobile.erb
|
403
409
|
- tools/emoji/genregexp.rb
|
404
410
|
- tools/generate_au_emoticon_table.rb
|
405
411
|
- tools/generate_docomo_emoticon_table.rb
|