jpmobile 5.0.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -3
- data/.rubocop.yml +123 -0
- data/CONTRIBUTING.md +16 -14
- data/Gemfile +6 -0
- data/Gemfile.lock +198 -0
- data/README.md +409 -0
- data/Rakefile +9 -9
- data/circle.yml +14 -0
- data/jpmobile.gemspec +9 -10
- data/lib/jpmobile.rb +6 -5
- data/lib/jpmobile/datum_conv.rb +35 -35
- data/lib/jpmobile/docomo_guid.rb +7 -8
- data/lib/jpmobile/email.rb +12 -12
- data/lib/jpmobile/emoticon.rb +85 -76
- data/lib/jpmobile/emoticon/au.rb +1284 -1284
- data/lib/jpmobile/emoticon/conversion_table.rb +3905 -3906
- data/lib/jpmobile/emoticon/docomo.rb +252 -252
- data/lib/jpmobile/emoticon/google.rb +9 -9
- data/lib/jpmobile/emoticon/softbank.rb +471 -471
- data/lib/jpmobile/emoticon/unicode.rb +9 -9
- data/lib/jpmobile/emoticon/z_combine.rb +20 -23
- data/lib/jpmobile/encoding.rb +1 -1
- data/lib/jpmobile/fallback_view_selector.rb +2 -3
- data/lib/jpmobile/filter.rb +44 -47
- data/lib/jpmobile/helpers.rb +38 -38
- data/lib/jpmobile/hook_action_view.rb +7 -7
- data/lib/jpmobile/hook_test_request.rb +0 -1
- data/lib/jpmobile/lookup_context.rb +1 -2
- data/lib/jpmobile/mail.rb +156 -134
- data/lib/jpmobile/mailer.rb +4 -4
- data/lib/jpmobile/mobile/abstract_mobile.rb +62 -36
- data/lib/jpmobile/mobile/android.rb +0 -1
- data/lib/jpmobile/mobile/android_tablet.rb +0 -1
- data/lib/jpmobile/mobile/au.rb +40 -28
- data/lib/jpmobile/mobile/black_berry.rb +0 -1
- data/lib/jpmobile/mobile/ddipocket.rb +1 -2
- data/lib/jpmobile/mobile/docomo.rb +47 -36
- data/lib/jpmobile/mobile/emobile.rb +1 -2
- data/lib/jpmobile/mobile/google_emoticon.rb +1 -1
- data/lib/jpmobile/mobile/ipad.rb +0 -1
- data/lib/jpmobile/mobile/iphone.rb +0 -1
- data/lib/jpmobile/mobile/smart_phone.rb +0 -1
- data/lib/jpmobile/mobile/softbank.rb +24 -20
- data/lib/jpmobile/mobile/tablet.rb +0 -1
- data/lib/jpmobile/mobile/unicode_emoticon.rb +15 -15
- data/lib/jpmobile/mobile/vodafone.rb +0 -1
- data/lib/jpmobile/mobile/willcom.rb +7 -7
- data/lib/jpmobile/mobile/windows_phone.rb +0 -1
- data/lib/jpmobile/path_set.rb +1 -1
- data/lib/jpmobile/position.rb +30 -14
- data/lib/jpmobile/rack/filter.rb +4 -4
- data/lib/jpmobile/rack/mobile_carrier.rb +0 -1
- data/lib/jpmobile/rack/params_filter.rb +7 -6
- data/lib/jpmobile/rails.rb +3 -4
- data/lib/jpmobile/request_with_mobile.rb +9 -6
- data/lib/jpmobile/resolver.rb +23 -17
- data/lib/jpmobile/session/active_record_store.rb +7 -9
- data/lib/jpmobile/session/mem_cache_store.rb +7 -9
- data/lib/jpmobile/sinatra.rb +1 -1
- data/lib/jpmobile/trans_sid.rb +15 -20
- data/lib/jpmobile/util.rb +61 -77
- data/lib/jpmobile/version.rb +1 -1
- data/lib/tasks/jpmobile_tasks.rake +35 -28
- data/spec/rack/jpmobile/android_spec.rb +5 -5
- data/spec/rack/jpmobile/au_spec.rb +74 -59
- data/spec/rack/jpmobile/black_berry_spec.rb +5 -5
- data/spec/rack/jpmobile/docomo_spec.rb +77 -64
- data/spec/rack/jpmobile/emoticon_spec.rb +137 -121
- data/spec/rack/jpmobile/filter_spec.rb +149 -128
- data/spec/rack/jpmobile/iphone_spec.rb +9 -8
- data/spec/rack/jpmobile/mobile_by_ua_spec.rb +22 -21
- data/spec/rack/jpmobile/params_filter_spec.rb +104 -96
- data/spec/rack/jpmobile/softbank_spec.rb +49 -42
- data/spec/rack/jpmobile/willcom_spec.rb +22 -18
- data/spec/rack/jpmobile/windows_phone.rb +5 -5
- data/spec/rack_helper.rb +9 -8
- data/spec/spec_helper.rb +5 -6
- data/spec/unit/decorated_mail_spec.rb +8 -9
- data/spec/unit/email_spec.rb +44 -44
- data/spec/unit/emoticon_spec.rb +57 -58
- data/spec/unit/encoding_spec.rb +35 -36
- data/spec/unit/is_carrier_spec.rb +49 -49
- data/spec/unit/mail_spec.rb +153 -143
- data/spec/unit/mobile/iphone_spec.rb +6 -7
- data/spec/unit/receive_mail_spec.rb +172 -173
- data/spec/unit/spec_helper.rb +6 -6
- data/spec/unit/util_spec.rb +125 -46
- data/spec/unit/valid_ip_spec.rb +35 -35
- data/spec/unit/variants_spec.rb +18 -19
- data/test/rails/overrides/Gemfile +54 -0
- data/test/rails/overrides/Gemfile.jpmobile +1 -2
- data/test/rails/overrides/app/controllers/admin/top_controller.rb +1 -1
- data/test/rails/overrides/app/controllers/docomo_guid_base_controller.rb +1 -1
- data/test/rails/overrides/app/controllers/filter_controller_base.rb +14 -6
- data/test/rails/overrides/app/controllers/hankaku_input_filter_controller.rb +1 -1
- data/test/rails/overrides/app/controllers/mobile_spec_controller.rb +1 -1
- data/test/rails/overrides/app/controllers/template_path_controller.rb +1 -2
- data/test/rails/overrides/app/controllers/trans_sid_base_controller.rb +18 -10
- data/test/rails/overrides/app/controllers/trans_sid_metal_controller.rb +0 -1
- data/test/rails/overrides/app/mailers/decorated_mailer.rb +3 -4
- data/test/rails/overrides/app/mailers/mobile_mailer.rb +5 -6
- data/test/rails/overrides/app/mailers/normal_mailer.rb +2 -3
- data/test/rails/overrides/autotest/discover.rb +2 -2
- data/test/rails/overrides/config/initializers/jpmobile_generator.rb +2 -2
- data/test/rails/overrides/config/routes.rb +95 -2
- data/test/rails/overrides/db/migrate/001_add_sessions_table.rb +2 -2
- data/test/rails/overrides/db/migrate/20100824062306_create_users.rb +1 -1
- data/test/rails/overrides/spec/controllers/docomo_guid_spec.rb +24 -25
- data/test/rails/overrides/spec/controllers/helpers_spec.rb +88 -88
- data/test/rails/overrides/spec/controllers/mobile_spec_controller_spec.rb +9 -9
- data/test/rails/overrides/spec/controllers/template_path_spec.rb +19 -19
- data/test/rails/overrides/spec/features/admin/top_spec.rb +7 -7
- data/test/rails/overrides/spec/features/filter_spec.rb +101 -102
- data/test/rails/overrides/spec/helpers/helpers_spec.rb +4 -4
- data/test/rails/overrides/spec/mailers/decorated_mailer_spec.rb +12 -12
- data/test/rails/overrides/spec/mailers/mobile_mailer_spec.rb +209 -194
- data/test/rails/overrides/spec/mailers/normal_mailer_spec.rb +10 -10
- data/test/rails/overrides/spec/rails_helper.rb +1 -1
- data/test/rails/overrides/spec/requests/docomo_spec.rb +13 -13
- data/test/rails/overrides/spec/requests/emobile_spec.rb +19 -19
- data/test/rails/overrides/spec/requests/pc_spec.rb +6 -6
- data/test/rails/overrides/spec/requests/softbank_emulator_spec.rb +6 -6
- data/test/rails/overrides/spec/requests/template_path_spec.rb +60 -60
- data/test/rails/overrides/spec/requests/trans_sid_spec.rb +89 -89
- data/test/sinatra/test/filter_test.rb +10 -11
- data/tools/e4u_conv.rb +0 -1
- metadata +18 -14
- data/README +0 -0
- data/README.rdoc +0 -308
@@ -2,14 +2,14 @@ require 'rails_helper'
|
|
2
2
|
|
3
3
|
def get_with_session(controller, action, user_agent)
|
4
4
|
open_session do |sess|
|
5
|
-
sess.get "/#{controller}/#{action}", params: {}, env: {
|
5
|
+
sess.get "/#{controller}/#{action}", params: {}, env: { 'HTTP_USER_AGENT' => user_agent }
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
def describe_mobile_with_ua(user_agent, charset, &block)
|
10
10
|
describe("trans_sid :mobile が指定されているコントローラに #{user_agent} からアクセスしたとき") do
|
11
11
|
before(:each) do
|
12
|
-
@controller =
|
12
|
+
@controller = 'trans_sid_mobile'
|
13
13
|
@user_agent = user_agent
|
14
14
|
@charset = charset
|
15
15
|
end
|
@@ -18,186 +18,186 @@ def describe_mobile_with_ua(user_agent, charset, &block)
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
describe
|
21
|
+
describe 'trans_sid functional', type: :request do
|
22
22
|
before(:each) do
|
23
|
-
@user ||= User.create(name:
|
23
|
+
@user ||= User.create(name: 'hoge')
|
24
24
|
end
|
25
25
|
|
26
|
-
shared_examples_for
|
27
|
-
it
|
28
|
-
res = get_with_session(@controller,
|
26
|
+
shared_examples_for 'trans_sid が起動しないとき' do
|
27
|
+
it 'で link_to の自動書き換えが行われない' do
|
28
|
+
res = get_with_session(@controller, 'link', @user_agent)
|
29
29
|
|
30
|
-
expect(res.response.body).to match(
|
30
|
+
expect(res.response.body).to match(%r{<a href=\"/.+?/link\">linkto</a>})
|
31
31
|
end
|
32
|
-
it
|
33
|
-
res = get_with_session(@controller,
|
32
|
+
it 'で form の自動書き換えが行われない' do
|
33
|
+
res = get_with_session(@controller, 'form', @user_agent)
|
34
34
|
|
35
|
-
expect(res.response.body).to match(
|
35
|
+
expect(res.response.body).to match(%r{<form.*action=\"/.+?/form\".*accept-charset="#{@charset}"})
|
36
36
|
end
|
37
|
-
it
|
38
|
-
res = get_with_session(@controller,
|
37
|
+
it 'で redirect の自動書き換えが行われない' do
|
38
|
+
res = get_with_session(@controller, 'redirect', @user_agent)
|
39
39
|
|
40
|
-
expect(res.response.header['Location']).to match(
|
40
|
+
expect(res.response.header['Location']).to match(%r{/$})
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
shared_examples_for
|
45
|
-
it
|
46
|
-
res = get_with_session(@controller,
|
44
|
+
shared_examples_for 'trans_sid が起動するとき' do
|
45
|
+
it 'で link_to の自動書き換えが行われる' do
|
46
|
+
res = get_with_session(@controller, 'link', @user_agent)
|
47
47
|
|
48
|
-
expect(res.response.body).to match(
|
48
|
+
expect(res.response.body).to match(%r{<a href=\"/.+?/link\?_session_id=[a-zA-Z0-9]{32}\">linkto</a>})
|
49
49
|
end
|
50
|
-
it
|
51
|
-
res = get_with_session(@controller,
|
50
|
+
it 'で form内にhiddenが差し込まれる' do
|
51
|
+
res = get_with_session(@controller, 'form', @user_agent)
|
52
52
|
expect(res.response.body).to match(/<input type=\"hidden\" name=\".+\" value=\"[a-zA-Z0-9]{32}\"/)
|
53
53
|
end
|
54
|
-
it
|
55
|
-
res = get_with_session(@controller,
|
54
|
+
it 'で form の自動書き換えが行われる' do
|
55
|
+
res = get_with_session(@controller, 'form', @user_agent)
|
56
56
|
|
57
|
-
expect(res.response.body).to match(
|
57
|
+
expect(res.response.body).to match(%r{<form.*action=\"/.+?/form\?_session_id=[a-zA-Z0-9]{32}\".*accept-charset="#{@charset}"})
|
58
58
|
end
|
59
|
-
it
|
60
|
-
res = get_with_session(@controller,
|
59
|
+
it 'で redirect の自動書き換えが行われる' do
|
60
|
+
res = get_with_session(@controller, 'redirect', @user_agent)
|
61
61
|
|
62
62
|
expect(res.response.header['Location']).to match(/\?_session_id=[a-zA-Z0-9]{32}$/)
|
63
63
|
end
|
64
64
|
|
65
65
|
# resource paths
|
66
|
-
it
|
67
|
-
res = get_with_session(@controller,
|
66
|
+
it 'で @user の link_to の自動書き換えが行われる' do
|
67
|
+
res = get_with_session(@controller, 'link_path', @user_agent)
|
68
68
|
|
69
|
-
expect(res.response.body).to match(
|
69
|
+
expect(res.response.body).to match(%r{<a href=\"/users/1\?_session_id=[a-zA-Z0-9]{32}\">linkto</a>})
|
70
70
|
end
|
71
|
-
it
|
72
|
-
res = get_with_session(@controller,
|
71
|
+
it 'で @user の form の自動書き換えが行われる' do
|
72
|
+
res = get_with_session(@controller, 'form_path', @user_agent)
|
73
73
|
|
74
|
-
expect(res.response.body).to match(
|
74
|
+
expect(res.response.body).to match(%r{<form.*action=\"/users/1\?_session_id=[a-zA-Z0-9]{32}\".*accept-charset="#{@charset}"})
|
75
75
|
end
|
76
|
-
it
|
77
|
-
res = get_with_session(@controller,
|
76
|
+
it 'で @path の redirect の自動書き換えが行われる' do
|
77
|
+
res = get_with_session(@controller, 'redirect_path', @user_agent)
|
78
78
|
|
79
79
|
expect(res.response.header['Location']).to match(/\?_session_id=[a-zA-Z0-9]{32}$/)
|
80
80
|
end
|
81
81
|
|
82
82
|
# resource path with prefix
|
83
|
-
it
|
84
|
-
res = get_with_session(@controller,
|
83
|
+
it 'で [:admin, @user] の link_to の自動書き換えが行われる' do
|
84
|
+
res = get_with_session(@controller, 'link_path_admin', @user_agent)
|
85
85
|
|
86
|
-
expect(res.response.body).to match(
|
86
|
+
expect(res.response.body).to match(%r{<a href=\"/admin/users/1\?_session_id=[a-zA-Z0-9]{32}\">linkto</a>})
|
87
87
|
end
|
88
|
-
it
|
89
|
-
res = get_with_session(@controller,
|
88
|
+
it 'で [:admin, @user] の form の自動書き換えが行われる' do
|
89
|
+
res = get_with_session(@controller, 'form_path_admin', @user_agent)
|
90
90
|
|
91
|
-
expect(res.response.body).to match(
|
91
|
+
expect(res.response.body).to match(%r{<form.*action=\"/admin/users/1\?_session_id=[a-zA-Z0-9]{32}\".* accept-charset="#{@charset}"})
|
92
92
|
end
|
93
|
-
it
|
94
|
-
res = get_with_session(@controller,
|
93
|
+
it 'で [:admin, @path] の redirect の自動書き換えが行われる' do
|
94
|
+
res = get_with_session(@controller, 'redirect_path_admin', @user_agent)
|
95
95
|
|
96
96
|
expect(res.response.header['Location']).to match(/\?_session_id=[a-zA-Z0-9]{32}$/)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
describe TransSidBaseController,
|
100
|
+
describe TransSidBaseController, 'という trans_sid が有効になっていないコントローラ' do
|
101
101
|
before(:each) do
|
102
|
-
@controller =
|
103
|
-
@user_agent =
|
104
|
-
@charset =
|
102
|
+
@controller = 'trans_sid_base'
|
103
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
104
|
+
@charset = 'UTF-8'
|
105
105
|
end
|
106
106
|
|
107
|
-
it
|
108
|
-
get "/#{@controller}/link", params: {}, env: {
|
107
|
+
it 'の trans_sid_mode は nil' do
|
108
|
+
get "/#{@controller}/link", params: {}, env: { 'HTTP_USER_AGENT' => @user_agent }
|
109
109
|
|
110
110
|
expect(controller.trans_sid_mode).to be_nil
|
111
111
|
end
|
112
|
-
it_should_behave_like
|
112
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
113
113
|
end
|
114
114
|
|
115
|
-
describe TransSidNoneController,
|
115
|
+
describe TransSidNoneController, 'という trans_sid :none が指定されているコントローラ' do
|
116
116
|
before(:each) do
|
117
|
-
@controller =
|
118
|
-
@user_agent =
|
119
|
-
@charset =
|
117
|
+
@controller = 'trans_sid_none'
|
118
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
119
|
+
@charset = 'UTF-8'
|
120
120
|
end
|
121
121
|
|
122
|
-
it
|
123
|
-
get "/#{@controller}/link", params: {}, env: {
|
122
|
+
it 'の trans_sid_mode は :none' do
|
123
|
+
get "/#{@controller}/link", params: {}, env: { 'HTTP_USER_AGENT' => @user_agent }
|
124
124
|
|
125
125
|
expect(controller.trans_sid_mode).to eq(:none)
|
126
126
|
end
|
127
|
-
it_should_behave_like
|
127
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
128
128
|
end
|
129
129
|
|
130
|
-
describe TransSidAlwaysController,
|
130
|
+
describe TransSidAlwaysController, 'という trans_sid :always が指定されているコントローラ' do
|
131
131
|
before(:each) do
|
132
|
-
@controller =
|
133
|
-
@user_agent =
|
134
|
-
@charset =
|
132
|
+
@controller = 'trans_sid_always'
|
133
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
134
|
+
@charset = 'UTF-8'
|
135
135
|
end
|
136
136
|
|
137
|
-
it
|
138
|
-
get "/#{@controller}/link", params: {}, env: {
|
137
|
+
it 'の trans_sid_mode は :always' do
|
138
|
+
get "/#{@controller}/link", params: {}, env: { 'HTTP_USER_AGENT' => @user_agent }
|
139
139
|
|
140
140
|
expect(controller.trans_sid_mode).to eq(:always)
|
141
141
|
end
|
142
|
-
it_should_behave_like
|
142
|
+
it_should_behave_like 'trans_sid が起動するとき'
|
143
143
|
end
|
144
144
|
|
145
|
-
describe TransSidMetalController,
|
145
|
+
describe TransSidMetalController, 'という ActionController::Metal のコントローラ' do
|
146
146
|
before(:each) do
|
147
|
-
@controller =
|
148
|
-
@user_agent =
|
149
|
-
@charset =
|
147
|
+
@controller = 'trans_sid_metal'
|
148
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
149
|
+
@charset = 'UTF-8'
|
150
150
|
end
|
151
151
|
|
152
|
-
it
|
153
|
-
res = get_with_session(@controller,
|
152
|
+
it 'で redirect_to がエラーにならない' do
|
153
|
+
res = get_with_session(@controller, 'redirect', @user_agent)
|
154
154
|
|
155
155
|
expect(res.response).to be_redirect
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
-
describe TransSidMobileController,
|
159
|
+
describe TransSidMobileController, 'という trans_sid :mobile が指定されているコントローラ' do
|
160
160
|
before(:each) do
|
161
|
-
@controller =
|
162
|
-
@user_agent =
|
163
|
-
@charset =
|
161
|
+
@controller = 'trans_sid_mobile'
|
162
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
163
|
+
@charset = 'UTF-8'
|
164
164
|
end
|
165
165
|
|
166
|
-
it
|
167
|
-
get "/#{@controller}/link", params: {}, env: {
|
166
|
+
it 'の trans_sid_mode は :mobile' do
|
167
|
+
get "/#{@controller}/link", params: {}, env: { 'HTTP_USER_AGENT' => @user_agent }
|
168
168
|
|
169
169
|
expect(controller.trans_sid_mode).to eq(:mobile)
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
173
|
-
describe TransSidAlwaysAndSessionOffController,
|
173
|
+
describe TransSidAlwaysAndSessionOffController, 'という trans_sid :always が指定されていて session がロードされていないとき' do
|
174
174
|
before(:each) do
|
175
|
-
@controller =
|
176
|
-
@user_agent =
|
177
|
-
@charset =
|
175
|
+
@controller = 'trans_sid_always_and_session_off'
|
176
|
+
@user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)'
|
177
|
+
@charset = 'UTF-8'
|
178
178
|
end
|
179
179
|
|
180
|
-
it
|
181
|
-
res = get_with_session(@controller,
|
180
|
+
it 'の trans_sid_mode は :always' do
|
181
|
+
res = get_with_session(@controller, 'link', @user_agent)
|
182
182
|
|
183
183
|
expect(res.controller.trans_sid_mode).to eq(:always)
|
184
184
|
end
|
185
|
-
it_should_behave_like
|
185
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
186
186
|
end
|
187
187
|
|
188
|
-
describe_mobile_with_ua
|
189
|
-
it_should_behave_like
|
188
|
+
describe_mobile_with_ua 'DoCoMo/2.0 SH902i(c100;TB;W24H12)', 'Shift_JIS' do
|
189
|
+
it_should_behave_like 'trans_sid が起動するとき'
|
190
190
|
end
|
191
191
|
|
192
|
-
describe_mobile_with_ua
|
193
|
-
it_should_behave_like
|
192
|
+
describe_mobile_with_ua 'KDDI-CA32 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0', 'Shift_JIS' do
|
193
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
194
194
|
end
|
195
195
|
|
196
|
-
describe_mobile_with_ua
|
197
|
-
it_should_behave_like
|
196
|
+
describe_mobile_with_ua 'SoftBank/1.0/910T/TJ001/SN000000000000000 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1', 'UTF-8' do
|
197
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
198
198
|
end
|
199
199
|
|
200
|
-
describe_mobile_with_ua
|
201
|
-
it_should_behave_like
|
200
|
+
describe_mobile_with_ua 'Vodafone/1.0/V903T/TJ001 Browser/VF-Browser/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Profile/JSCL-1.2.2 Ext-V-Profile/VSCL-2.0.0', 'UTF-8' do
|
201
|
+
it_should_behave_like 'trans_sid が起動しないとき'
|
202
202
|
end
|
203
203
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
require 'guestbook'
|
3
2
|
require 'rack/test'
|
4
3
|
require 'test/unit'
|
@@ -16,25 +15,25 @@ class SinatraOnJpmobile < Test::Unit::TestCase
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def test_not_convert_pc_get
|
19
|
-
get '/', {:
|
20
|
-
assert_equal last_response.body,
|
18
|
+
get '/', { g: Jpmobile::Util.sjis('万葉') }, {}
|
19
|
+
assert_equal last_response.body, '万葉'
|
21
20
|
end
|
22
21
|
|
23
22
|
def test_not_convert_pc_post
|
24
|
-
post '/', {:
|
25
|
-
assert_equal last_response.body,
|
23
|
+
post '/', { p: Jpmobile::Util.utf8('けーたい') }, {}
|
24
|
+
assert_equal last_response.body, 'けーたい'
|
26
25
|
end
|
27
26
|
|
28
27
|
def test_docomo_get_convert_to_utf8
|
29
|
-
get '/', {:
|
30
|
-
assert_equal last_app.assigns(:g),
|
31
|
-
assert_equal last_response.body, utf8_to_sjis(
|
28
|
+
get '/', { g: utf8_to_sjis('万葉') }, { 'HTTP_USER_AGENT' => 'DoCoMo/2.0 SH902i(c100;TB;W24H12)' }
|
29
|
+
assert_equal last_app.assigns(:g), '万葉'
|
30
|
+
assert_equal last_response.body, utf8_to_sjis('万葉')
|
32
31
|
end
|
33
32
|
|
34
33
|
def test_docomo_post_convert_to_utf8
|
35
|
-
post '/', {:
|
36
|
-
assert_equal last_app.assigns(:p),
|
37
|
-
assert_equal last_response.body, utf8_to_sjis(
|
34
|
+
post '/', { p: utf8_to_sjis('けーたい') }, { 'HTTP_USER_AGENT' => 'DoCoMo/2.0 SH902i(c100;TB;W24H12)' }
|
35
|
+
assert_equal last_app.assigns(:p), 'けーたい'
|
36
|
+
assert_equal last_response.body, utf8_to_sjis('けーたい')
|
38
37
|
end
|
39
38
|
|
40
39
|
# def test_view_selector_pc
|
data/tools/e4u_conv.rb
CHANGED
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: 5.0.
|
4
|
+
version: 5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shin-ichiro OGAWA
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-03-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -29,30 +29,30 @@ dependencies:
|
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: '0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rspec-rails
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: '0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec-its
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,12 +160,14 @@ extra_rdoc_files: []
|
|
160
160
|
files:
|
161
161
|
- ".gitignore"
|
162
162
|
- ".rspec"
|
163
|
+
- ".rubocop.yml"
|
163
164
|
- CONTRIBUTING.md
|
164
165
|
- Gemfile
|
166
|
+
- Gemfile.lock
|
165
167
|
- MIT-LICENSE
|
166
|
-
- README
|
167
|
-
- README.rdoc
|
168
|
+
- README.md
|
168
169
|
- Rakefile
|
170
|
+
- circle.yml
|
169
171
|
- init.rb
|
170
172
|
- jpmobile.gemspec
|
171
173
|
- lib/jpmobile.rb
|
@@ -279,6 +281,7 @@ files:
|
|
279
281
|
- spec/unit/variants_spec.rb
|
280
282
|
- test/rails/.gitignore
|
281
283
|
- test/rails/overrides/.rspec
|
284
|
+
- test/rails/overrides/Gemfile
|
282
285
|
- test/rails/overrides/Gemfile.jpmobile
|
283
286
|
- test/rails/overrides/app/controllers/admin/top_controller.rb
|
284
287
|
- test/rails/overrides/app/controllers/application_controller.rb
|
@@ -433,10 +436,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
433
436
|
version: '0'
|
434
437
|
requirements: []
|
435
438
|
rubyforge_project:
|
436
|
-
rubygems_version: 2.6.
|
439
|
+
rubygems_version: 2.6.14.1
|
437
440
|
signing_key:
|
438
441
|
specification_version: 4
|
439
|
-
summary:
|
442
|
+
summary: Rails plugin for mobile devices in Japan
|
440
443
|
test_files:
|
441
444
|
- spec/rack/jpmobile/android_spec.rb
|
442
445
|
- spec/rack/jpmobile/au_spec.rb
|
@@ -494,6 +497,7 @@ test_files:
|
|
494
497
|
- spec/unit/variants_spec.rb
|
495
498
|
- test/rails/.gitignore
|
496
499
|
- test/rails/overrides/.rspec
|
500
|
+
- test/rails/overrides/Gemfile
|
497
501
|
- test/rails/overrides/Gemfile.jpmobile
|
498
502
|
- test/rails/overrides/app/controllers/admin/top_controller.rb
|
499
503
|
- test/rails/overrides/app/controllers/application_controller.rb
|
data/README
DELETED
File without changes
|
data/README.rdoc
DELETED
@@ -1,308 +0,0 @@
|
|
1
|
-
= jpmobile: A Rails plugin for Japanese mobile-phones
|
2
|
-
|
3
|
-
== jpmobileとは
|
4
|
-
携帯電話特有の機能を Rails 4.0 や Rack middleware で利用するためのプラグイン。
|
5
|
-
以下の機能を備える。
|
6
|
-
|
7
|
-
* 携帯電話のキャリア判別
|
8
|
-
* 端末位置情報の取得
|
9
|
-
* {GeoKit}[http://geokit.rubyforge.org] との連携
|
10
|
-
* 端末製造番号、契約者番号等の取得
|
11
|
-
* IPアドレスの検証(キャリアが公開しているIPアドレス帯域からのアクセスか判定)
|
12
|
-
* IPアドレスの検証には {jpmobile-ipaddresses}[http://github.com/jpmobile/jpmobile-ipaddresses] が必要です。
|
13
|
-
* ディスプレイ情報(画面サイズ、ブラウザ画面サイズ、カラー・白黒、色数)の取得
|
14
|
-
* ディスプレイ情報の取得には {jpmobile-terminfo}[http://github.com/jpmobile/jpmobile-terminfo] が必要です。
|
15
|
-
* 文字コード変換機能/絵文字のキャリア間相互変換
|
16
|
-
* メールの送信
|
17
|
-
* 絵文字と漢字コードの変換
|
18
|
-
* メールの受信(experimental)
|
19
|
-
* 絵文字と漢字コードの変換
|
20
|
-
|
21
|
-
また Rails 4.0 に以下の機能を追加する
|
22
|
-
* ビューへの自動振分け
|
23
|
-
* 位置情報取得などのリンクヘルパーの追加
|
24
|
-
* セッションIDをフォーム/リンクに付与(Trans SID)
|
25
|
-
|
26
|
-
他のバージョンの Rails については {Versions : Jpmobile vs Rails}[https://github.com/jpmobile/jpmobile/wiki/Version-:-Jpmobile-vs-Rails] を参照。
|
27
|
-
|
28
|
-
== インストール
|
29
|
-
=== Rails pluginとしてインストールする場合
|
30
|
-
% rails plugin install git://github.com/jpmobile/jpmobile.git
|
31
|
-
==== IPアドレス検証が必要な場合
|
32
|
-
% rails plugin install git://github.com/jpmobile/jpmobile-ipaddresses.git
|
33
|
-
==== ディスプレイ情報を取得する必要がある場合
|
34
|
-
% rails plugin install git://github.com/jpmobile/jpmobile-terminfo.git
|
35
|
-
|
36
|
-
=== gemでインストールする場合
|
37
|
-
% gem install jpmobile
|
38
|
-
==== IPアドレス検証が必要な場合
|
39
|
-
% gem install jpmobile-ipaddresses
|
40
|
-
==== ディスプレイ情報を取得する必要がある場合
|
41
|
-
% gem install jpmobile-terminfo
|
42
|
-
|
43
|
-
== 使用例
|
44
|
-
|
45
|
-
=== 携帯電話の識別
|
46
|
-
環境変数 env['rack.jpmobile'] にキャリアクラスのインスタンスが格納されています。また Rack::Request#mobile としても取得可能です。
|
47
|
-
|
48
|
-
==== キャリアの識別
|
49
|
-
|
50
|
-
case request.mobile
|
51
|
-
when Jpmobile::Mobile::Docomo
|
52
|
-
# for DoCoMo
|
53
|
-
when Jpmobile::Mobile::Au
|
54
|
-
# for au
|
55
|
-
when Jpmobile::Mobile::Softbank
|
56
|
-
# for SoftBank
|
57
|
-
when Jpmobile::Mobile::Willcom
|
58
|
-
# for Willcom
|
59
|
-
when Jpmobile::Mobile::Emobile
|
60
|
-
# for EMOBILE
|
61
|
-
else
|
62
|
-
# for PC
|
63
|
-
end
|
64
|
-
|
65
|
-
あるいは
|
66
|
-
if request.mobile.is_a?(Jpmobile::Mobile::Docomo)
|
67
|
-
# for DoCoMo
|
68
|
-
end
|
69
|
-
|
70
|
-
==== ビューの中で一部を切替える例
|
71
|
-
<% if request.mobile? %>
|
72
|
-
携帯電話からのアクセスです。
|
73
|
-
<% else %>
|
74
|
-
携帯電話からのアクセスではありません。
|
75
|
-
<% end %>
|
76
|
-
|
77
|
-
<% if request.smart_phone? %>
|
78
|
-
スマートフォンからのアクセスです。
|
79
|
-
<% else %>
|
80
|
-
スマートフォンからのアクセスではありません。
|
81
|
-
<% end %>
|
82
|
-
|
83
|
-
<% if request.tablet? %>
|
84
|
-
タブレットからのアクセスです。
|
85
|
-
<% else %>
|
86
|
-
タブレットからのアクセスではありません。
|
87
|
-
<% end %>
|
88
|
-
|
89
|
-
|
90
|
-
==== 別に用意した携帯電話用コントローラへリダイレクトする例
|
91
|
-
class PcController < ApplicationController
|
92
|
-
before_action :redirect_if_mobile
|
93
|
-
|
94
|
-
def index
|
95
|
-
end
|
96
|
-
|
97
|
-
private
|
98
|
-
def redirect_if_mobile
|
99
|
-
if request.mobile?
|
100
|
-
pa = params.dup
|
101
|
-
pa[:controller] = "/mobile"
|
102
|
-
redirect_to pa
|
103
|
-
elsif request.smart_phone?
|
104
|
-
pa = params.dup
|
105
|
-
pa[:controller] = "/smart_phone"
|
106
|
-
redirect_to pa
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class MobileController < ApplicationController
|
112
|
-
end
|
113
|
-
|
114
|
-
=== 位置情報の取得
|
115
|
-
Rack::Request#mobile.position に位置情報が格納されます。
|
116
|
-
|
117
|
-
@latitude = request.mobile.position.lat
|
118
|
-
@longuitude = request.mobile.position.lon
|
119
|
-
|
120
|
-
==== {GeoKit}[http://geokit.rubyforge.org] との連携
|
121
|
-
|
122
|
-
vendor/plugins/geokit以下にGeoKitがインストールされていると、Jpmobile::PositionにGeoKit::Mappableがincludeされる。したがって、
|
123
|
-
|
124
|
-
request.mobile.position.distance_to('札幌駅')
|
125
|
-
|
126
|
-
とすることで、端末と「札幌駅」との距離を求めることができる。詳細は http://geokit.rubyforge.org/api/index.html 参照。
|
127
|
-
|
128
|
-
=== 端末情報の取得
|
129
|
-
|
130
|
-
端末側から通知されている場合、request.mobile.ident で
|
131
|
-
契約に固有の識別子もしくは端末の製造番号を取得できる。
|
132
|
-
両方存在する場合は契約に固有のIDが優先される。
|
133
|
-
|
134
|
-
* 契約に固有のID (request.mobile.ident_subscriber)
|
135
|
-
* au: EZ番号(サブスクライバ番号)
|
136
|
-
* DoCoMo: FOMAカード製造番号
|
137
|
-
* EMOBILE: EMnet対応端末から通知されるユニークなユーザID
|
138
|
-
* 端末製造番号 (request.mobile.ident_device)
|
139
|
-
* DoCoMo: 端末製造番号(FOMA, MOVA)
|
140
|
-
* SoftBank: 製造番号
|
141
|
-
|
142
|
-
=== IPの検証
|
143
|
-
キャリアが公開しているIPアドレス帯域からのアクセスか判定する。
|
144
|
-
request.mobile.valid_ip?
|
145
|
-
ただし {jpmobile-ipaddresses}[http://github.com/jpmobile/jpmobile-ipaddresses] がインストールされていないか、スマートフォンの場合は必ずfalseとなる。
|
146
|
-
|
147
|
-
=== 端末の画面サイズ
|
148
|
-
request.mobile.display で Jpmobile::Display クラスのインスタンスが返る。
|
149
|
-
画面幅 <%= request.mobile.display.width %>
|
150
|
-
画面高さ <%= request.mobile.display.height %>
|
151
|
-
ただし {jpmobile-terminfo}[http://github.com/jpmobile/jpmobile-terminfo] がインストールされていない場合はエラーとなるので注意が必要。
|
152
|
-
|
153
|
-
=== 文字コード変換機能/絵文字のキャリア間相互変換
|
154
|
-
|
155
|
-
jpmobileを読み込むとDoCoMo、Au、SoftBankの絵文字を透過的に扱うことができる。
|
156
|
-
|
157
|
-
* Rails の場合は vendor/plugins に配置し、下記の設定を追加することで有効になる。
|
158
|
-
# Rack middleware を追加するメソッド
|
159
|
-
Rails.application.config.jpmobile.mobile_filter
|
160
|
-
or
|
161
|
-
Jpmobile.config.mobile_filter
|
162
|
-
|
163
|
-
* 下記の設定を追加することで、<form> タグの accept-charset が変更される。
|
164
|
-
# <form accept-charset="Shift_JIS" ...> などに変更する
|
165
|
-
Rails.application.config.jpmobile.form_accept_charset_conversion = true
|
166
|
-
or
|
167
|
-
Jpmobile.config.form_accept_charset_conversion = true
|
168
|
-
|
169
|
-
* Andriod/iPhone では Google 絵文字や Unicode 6.0 絵文字が使われています。下記の設定を追加すると、互換性をもたせるために3キャリアの絵文字に変換することができます。また表示の変換も可能です。
|
170
|
-
Rails.application.config.jpmobile.smart_phone_emoticon_compatibility = true
|
171
|
-
or
|
172
|
-
Jpmobile.config.smart_phone_emoticon_compatibility = true
|
173
|
-
|
174
|
-
携帯電話上では特に問題とならない。PCブラウザでテストする際に問題となるためのオプション。
|
175
|
-
|
176
|
-
* Sinatra の場合は下記のように指定する。
|
177
|
-
$LOAD_PATH << './lib/jpmobile/lib'
|
178
|
-
require 'jpmobile'
|
179
|
-
require 'jpmobile/rack'
|
180
|
-
|
181
|
-
use Jpmobile::Rack::MobileCarrier
|
182
|
-
use Jpmobile::Rack::ParamsFilter
|
183
|
-
use Jpmobile::Rack::Filter
|
184
|
-
|
185
|
-
get '/' do
|
186
|
-
erb :index
|
187
|
-
end
|
188
|
-
|
189
|
-
Rails のみ半角・全角の自動変換フィルターが用意されている。用いるには
|
190
|
-
class MyController
|
191
|
-
hankaku_filter
|
192
|
-
end
|
193
|
-
|
194
|
-
と指定する。またtextareaやhidden/text/passwordのinputタグで半角に変換したくない場合は :input => true を指定する。このときNokogiriが必要となるため、Gemfileに追記してインストールする必要がある。
|
195
|
-
class MyController
|
196
|
-
hankaku_filter :input => true
|
197
|
-
end
|
198
|
-
|
199
|
-
Jpmobile内では、各キャリアの絵文字はUnicode私的領域上にマッピングされ、管理される。
|
200
|
-
このとき、DoCoMo、Auは公式サイト記載のマッピングが使用される。
|
201
|
-
ただしSoftBankはAuとの重複を避けるため、公式のマッピングに0x1000加算しU+F001以降に割り当てる。
|
202
|
-
テンプレート内ではUTF-8でエンコードするか、数値文字参照の&#xHHHH;形式で指定する。
|
203
|
-
|
204
|
-
絵文字は送出時に内蔵の変換表に基づいて変換され、携帯電話のエンコーディングにあわせて送出される。
|
205
|
-
携帯電話から受信した絵文字は上記マッピングに基づいてUTF-8でparamsに渡される。
|
206
|
-
|
207
|
-
* DoCoMo、Auとの通信時にはShift_JIS、SoftBankとの通信時にはUTF-8が使用される。
|
208
|
-
* :hankaku=>true指定時は、カタカナは半角カナに変換されて送出される。携帯電話から送られた半角カナは全角カナに変換される。
|
209
|
-
* 絵文字はキャリアにあわせて変換されて送出される。
|
210
|
-
* 携帯電話からの絵文字はUnicode私的領域にマップされ、UTF-8でparamsに格納される。
|
211
|
-
|
212
|
-
=== ビューの自動振り分け
|
213
|
-
ビューの自動振り分けを行うには、以下の設定が必要です。
|
214
|
-
|
215
|
-
class ApplicationController < ActionController::Base
|
216
|
-
include Jpmobile::ViewSelector
|
217
|
-
end
|
218
|
-
|
219
|
-
DoCoMo携帯電話からアクセスすると、
|
220
|
-
* index_mobile_docomo.html.erb
|
221
|
-
* index_mobile.html.erb
|
222
|
-
* index.html.erb
|
223
|
-
の順でテンプレートを検索し、最初に見付かったテンプレートが利用される。
|
224
|
-
Auの場合は、index_mobile_au.html.erb、Softbankの場合はindex_mobile_softbank.html.erbが最初に検索される。
|
225
|
-
|
226
|
-
またiPhoneからアクセスすると、
|
227
|
-
* index_smart_phone_iphone.html.erb
|
228
|
-
* index_smart_phone.html.erb
|
229
|
-
* index.html.erb
|
230
|
-
の順でテンプレートを検索する。
|
231
|
-
Androidの場合はindex_smart_phone_android.html.erb、Windows Phoneの場合はindex_smart_phone_windows_phone.html.erbが最初に検索される。
|
232
|
-
|
233
|
-
自動振り分けを無効化するには、アクションにおいて以下のように設定する
|
234
|
-
|
235
|
-
def index
|
236
|
-
disable_mobile_view!
|
237
|
-
end
|
238
|
-
|
239
|
-
=== 位置情報の取得用リンクの生成
|
240
|
-
|
241
|
-
以下のようなコードで、端末に位置情報を要求するリンクを出力する。
|
242
|
-
<%= get_position_link_to("位置情報を取得する", :action=>:gps) %>
|
243
|
-
|
244
|
-
=== セッションIDの付与(Trans SID)
|
245
|
-
==== Cookie非対応携帯だけに付与する
|
246
|
-
class MyController
|
247
|
-
trans_sid
|
248
|
-
end
|
249
|
-
|
250
|
-
==== PCにも付与する
|
251
|
-
class MyController
|
252
|
-
trans_sid :always
|
253
|
-
end
|
254
|
-
|
255
|
-
trans_sid 機能を使う場合には、cookie session store を使用することができず、
|
256
|
-
active_record_storeのgemパッケージが必要です。
|
257
|
-
また Rails 4.0 では Cookie が使える場合にはそちらが優先されてしまうため、:always を指定した場合に問題になる場合があります。
|
258
|
-
trans_sid を使用する際には、例えば config/initializers/session_store.rb で
|
259
|
-
Rails.application.config.session_store :active_record_store
|
260
|
-
Rails.application.config.session_options = {:cookie_only => false}
|
261
|
-
として active_record_store を使用するように設定し、:cookie_only => false として Cookie を優先しないように設定します。
|
262
|
-
このとき ApplicationController において protect_from_forgery の :secret を指定するか、
|
263
|
-
あるいは protect_from_forgery を解除する必要があるでしょう。
|
264
|
-
|
265
|
-
また、
|
266
|
-
link_to "hoge", "/controller/action/id"
|
267
|
-
のようにリンク先を直接指定するとセッションIDは付加されません。
|
268
|
-
link_to "hoge", :controller => "controller", :action => "action", :id => "id"
|
269
|
-
のように指定する必要があります。
|
270
|
-
|
271
|
-
=== メールの送受信
|
272
|
-
メールにて絵文字や漢字コードの変換、ビューの自動振り分けを行なうには Jpmobile::Mailer::Base を使う。
|
273
|
-
|
274
|
-
class MobileMailer < Jpmobile::Mailer::Base
|
275
|
-
default :from => "info@jpmobile-rails.org"
|
276
|
-
|
277
|
-
def registration(to)
|
278
|
-
mail(:to => to)
|
279
|
-
end
|
280
|
-
|
281
|
-
def receive(email)
|
282
|
-
email
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
* デフォルトで ISO-2022-JP エンコードで送信
|
287
|
-
* docomo/SoftBank には Shift_JIS で送信
|
288
|
-
* au は ISO-2022-JP エンコードで送信
|
289
|
-
* ビューやレイアウトの自動振り分け
|
290
|
-
* docomo であれば app/views/mobile_mailer/registration_mobile_docomo.html.erb など
|
291
|
-
* 受信に関しては、docomo/SoftBank でテストできていないため、実験版とします。
|
292
|
-
* テストして問題あれば随時報告してください。
|
293
|
-
* オプションに :decorated => true を追加すると、各キャリアのデコメに適したフォーマットで送信します。
|
294
|
-
* ただし docomo/SoftBank でテスト出来ていないため、実験版とします。
|
295
|
-
|
296
|
-
== jpmobileの開発方法
|
297
|
-
|
298
|
-
jpmobileの開発に関しては {こちら}[https://github.com/jpmobile/jpmobile/blob/master/CONTRIBUTING.md] へ
|
299
|
-
|
300
|
-
== リンク
|
301
|
-
|
302
|
-
* http://jpmobile-rails.org
|
303
|
-
|
304
|
-
== 作者
|
305
|
-
|
306
|
-
Copyright 2006-2012 (c) Yoji Shidara, under MIT License.
|
307
|
-
|
308
|
-
Shin-ichiro OGAWA <rust.stnard@gmail.com>, Yoji Shidara <dara@shidara.net>
|