jpmobile 3.0.9 → 4.0.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +19 -0
  3. data/Gemfile +3 -11
  4. data/MIT-LICENSE +1 -1
  5. data/README.rdoc +7 -8
  6. data/Rakefile +1 -43
  7. data/VERSION.yml +1 -1
  8. data/jpmobile.gemspec +22 -38
  9. data/lib/jpmobile.rb +3 -1
  10. data/lib/jpmobile/configuration.rb +19 -0
  11. data/lib/jpmobile/emoticon/z_combine.rb +0 -4
  12. data/lib/jpmobile/hook_action_controller.rb +27 -0
  13. data/lib/jpmobile/mail.rb +56 -77
  14. data/lib/jpmobile/mailer.rb +1 -0
  15. data/lib/jpmobile/rack.rb +0 -16
  16. data/lib/jpmobile/resolver.rb +1 -1
  17. data/lib/jpmobile/util.rb +35 -128
  18. data/lib/jpmobile/version.rb +3 -0
  19. data/lib/tasks/jpmobile_tasks.rake +2 -2
  20. data/spec/unit/receive_mail_spec.rb +3 -28
  21. data/spec/unit/util_spec.rb +12 -23
  22. data/test/rails/overrides/Gemfile +46 -5
  23. data/test/rails/overrides/app/controllers/mobile_spec_controller.rb +3 -0
  24. data/test/rails/overrides/app/models/user.rb +0 -1
  25. data/test/rails/overrides/app/views/layouts/application.html.erb +12 -0
  26. data/test/rails/overrides/app/views/layouts/application_mobile.html.erb +1 -1
  27. data/test/rails/overrides/app/views/mobile_mailer/default_to_mail.text.erb +1 -0
  28. data/test/rails/overrides/app/views/mobile_spec/_partial_view_sample.html.erb +1 -0
  29. data/test/rails/overrides/app/views/mobile_spec/no_mobile.html.erb +3 -0
  30. data/test/rails/overrides/config/routes.rb +2 -2
  31. data/test/rails/overrides/spec/controllers/mobile_spec_controller_spec.rb +36 -2
  32. data/test/rails/overrides/spec/mailers/mobile_mailer_spec.rb +4 -5
  33. metadata +194 -142
  34. data/spec/unit/email-fixtures/iphone-jis.eml +0 -15
  35. data/spec/unit/email-fixtures/pc-mail-attached-without-subject.eml +0 -45
@@ -28,6 +28,7 @@ module Jpmobile
28
28
  m = super(headers, &block)
29
29
 
30
30
  m.mobile = @mobile
31
+ m.charset = @mobile.mail_charset
31
32
 
32
33
  # for decorated-mail manipulation
33
34
  m.rearrange! if @mobile.decorated?
data/lib/jpmobile/rack.rb CHANGED
@@ -11,22 +11,6 @@ module Jpmobile
11
11
  ::Rails.application.middleware.insert_before('ActionDispatch::ParamsParser', Jpmobile::Rack::Filter)
12
12
  end
13
13
  end
14
-
15
- class Configuration
16
- include Singleton
17
-
18
- attr_accessor :form_accept_charset_conversion
19
- attr_accessor :smart_phone_emoticon_compatibility
20
-
21
- def initialize
22
- @form_accept_charset_conversion = false
23
- @smart_phone_emoticon_compatibility = false
24
- end
25
-
26
- def mobile_filter
27
- ::Jpmobile::Rack.mount_middlewares
28
- end
29
- end
30
14
  end
31
15
 
32
16
  module Rack
@@ -49,7 +49,7 @@ module Jpmobile
49
49
 
50
50
  if format
51
51
  variant = template.match(/.+#{path}(.+)\.#{format.to_sym.to_s}.*$/) ? $1 : ''
52
- virtual_path = variant.blank? ? nil : path + variant
52
+ virtual_path = variant.blank? ? path.virtual : path.to_str + variant
53
53
  else
54
54
  virtual_path = path.virtual
55
55
  end
data/lib/jpmobile/util.rb CHANGED
@@ -160,19 +160,11 @@ module Jpmobile
160
160
  end
161
161
 
162
162
  def regexp_utf8_to_sjis(utf8_str)
163
- if Object.const_defined?(:Encoding)
164
- Regexp.compile(Regexp.escape(utf8_to_sjis(utf8_str)))
165
- else
166
- Regexp.compile(Regexp.escape(utf8_to_sjis(utf8_str),"s"),nil,'s')
167
- end
163
+ Regexp.compile(Regexp.escape(utf8_to_sjis(utf8_str)))
168
164
  end
169
165
 
170
166
  def regexp_to_sjis(sjis_str)
171
- if Object.const_defined?(:Encoding)
172
- Regexp.compile(Regexp.escape(sjis(sjis_str)))
173
- else
174
- Regexp.compile(Regexp.escape(sjis_str,"s"),nil,'s')
175
- end
167
+ Regexp.compile(Regexp.escape(sjis(sjis_str)))
176
168
  end
177
169
 
178
170
  def hash_to_utf8(hash)
@@ -183,24 +175,19 @@ module Jpmobile
183
175
  end
184
176
 
185
177
  def sjis_regexp(sjis)
186
- sjis_str = sjis.kind_of?(Numeric) ? [sjis].pack('n') : sjis
178
+ sjis_str = if sjis.kind_of?(Numeric)
179
+ [sjis].pack('n')
180
+ else
181
+ sjis
182
+ end
187
183
 
188
- if Object.const_defined?(:Encoding)
189
- Regexp.compile(Regexp.escape(sjis_str.force_encoding(SJIS)))
190
- else
191
- Regexp.compile(Regexp.escape(sjis_str,"s"),nil,'s')
192
- end
184
+ Regexp.compile(Regexp.escape(sjis_str.force_encoding(SJIS)))
193
185
  end
194
186
 
195
187
  def jis_regexp(jis)
196
188
  jis_str = jis.kind_of?(Numeric) ? [jis].pack('n') : jis
197
189
 
198
- if Object.const_defined?(:Encoding)
199
- # Regexp.compile(Regexp.escape(jis_str.force_encoding("stateless-ISO-2022-JP-KDDI"))) # for au only
200
- Regexp.compile(Regexp.escape(jis_str.force_encoding(BINARY))) # for au only
201
- else
202
- Regexp.compile(Regexp.escape(jis_str,"j"),nil,'j')
203
- end
190
+ Regexp.compile(Regexp.escape(jis_str.force_encoding(BINARY)))
204
191
  end
205
192
 
206
193
  def jis_string_regexp
@@ -217,20 +204,7 @@ module Jpmobile
217
204
  elsif utf8?(str) and charset.match(/utf-8/i)
218
205
  str
219
206
  else
220
- if Object.const_defined?(:Encoding)
221
- str.encode(charset)
222
- else
223
- case charset
224
- when /iso-2022-jp/i
225
- NKF.nkf("-j", str)
226
- when /shift_jis/i
227
- NKF.nkf("-s", str)
228
- when /utf-8/i
229
- NKF.nkf("-w", str)
230
- else
231
- str
232
- end
233
- end
207
+ str.encode(charset)
234
208
  end
235
209
  end
236
210
 
@@ -266,50 +240,22 @@ module Jpmobile
266
240
  s = str.dup
267
241
  return str if detect_encoding(str) == to
268
242
 
269
- if Object.const_defined?(:Encoding)
270
- to = SJIS if to =~ /shift_jis/i
271
-
272
- to_enc = ::Encoding.find(to)
273
- return str if s.encoding == to_enc
243
+ to = SJIS if to =~ /shift_jis/i
274
244
 
275
- if from
276
- from_enc = ::Encoding.find(from)
277
- s.force_encoding(from) unless s.encoding == from_enc
278
- end
245
+ to_enc = ::Encoding.find(to)
246
+ return str if s.encoding == to_enc
279
247
 
280
- s.encode(to)
281
- else
282
- opt = []
283
- opt << case from
284
- when /iso-2022-jp/i
285
- "-Jx"
286
- when /shift_jis/i
287
- "-Sx"
288
- when /utf-8/i
289
- "-Wx"
290
- else
291
- ""
292
- end
293
- opt << case to
294
- when /iso-2022-jp/i
295
- "-j"
296
- when /shift_jis/i, /windows_31j/i
297
- "-s"
298
- when /utf-8/i
299
- "-w"
300
- else
301
- ""
302
- end
303
- NKF.nkf(opt.join(" "), str)
248
+ if from
249
+ from_enc = ::Encoding.find(from)
250
+ s.force_encoding(from) unless s.encoding == from_enc
304
251
  end
252
+
253
+ s.encode(to)
305
254
  end
306
255
 
307
256
  def set_encoding(str, encoding)
308
- if encoding and Object.const_defined?(:Encoding)
309
- encoding = SJIS if encoding =~ /shift_jis/i
310
-
311
- str.force_encoding(encoding)
312
- end
257
+ encoding = SJIS if encoding =~ /shift_jis/i
258
+ str.force_encoding(encoding)
313
259
 
314
260
  str
315
261
  end
@@ -328,32 +274,17 @@ module Jpmobile
328
274
  end
329
275
 
330
276
  def detect_encoding(str)
331
- if Object.const_defined?(:Encoding)
332
- case str.encoding
333
- when ::Encoding::ISO2022_JP
334
- JIS
335
- when ::Encoding::Shift_JIS, ::Encoding::Windows_31J, ::Encoding::CP932
336
- SJIS
337
- when ::Encoding::UTF_8
338
- UTF8
339
- when ::Encoding::ASCII_8BIT
340
- BINARY
341
- else
342
- BINARY
343
- end
277
+ case str.encoding
278
+ when ::Encoding::ISO2022_JP
279
+ JIS
280
+ when ::Encoding::Shift_JIS, ::Encoding::Windows_31J, ::Encoding::CP932
281
+ SJIS
282
+ when ::Encoding::UTF_8
283
+ UTF8
284
+ when ::Encoding::ASCII_8BIT
285
+ BINARY
344
286
  else
345
- case NKF.guess(str)
346
- when NKF::SJIS
347
- SJIS
348
- when NKF::JIS
349
- JIS
350
- when NKF::UTF8
351
- UTF8
352
- when NKF::BINARY
353
- BINARY
354
- else
355
- BINARY
356
- end
287
+ BINARY
357
288
  end
358
289
  end
359
290
 
@@ -384,17 +315,7 @@ module Jpmobile
384
315
  def split_text(str, size = 15)
385
316
  return nil if str.nil? or str == ''
386
317
 
387
- if Object.const_defined?(:Encoding)
388
- [str[0..(size-1)], str[size..-1]]
389
- else
390
- str = str.split(//u)
391
- text = str[0..(size-1)]
392
- text = text.join if text
393
- remain = str[size..-1]
394
- remain = remain.join if remain
395
- [text, remain]
396
- end
397
-
318
+ [str[0..(size-1)], str[size..-1]]
398
319
  end
399
320
 
400
321
  def invert_table(hash)
@@ -427,30 +348,16 @@ module Jpmobile
427
348
  end
428
349
 
429
350
  def check_charset(str, charset)
430
- if Object.const_defined?(:Encoding)
431
- # use NKF.guess
432
- ::Encoding.compatible?(guess_encoding(str), ::Encoding.find(charset))
433
- else
434
- true
435
- end
351
+ # use NKF.guess
352
+ ::Encoding.compatible?(NKF.guess(str), ::Encoding.find(charset))
436
353
  end
437
354
 
438
355
  def correct_encoding(str)
439
- if guess_encoding(str) != str.encoding
440
- str.force_encoding(guess_encoding(str))
356
+ if str.encoding != ::Encoding::ASCII_8BIT and NKF.guess(str) != str.encoding
357
+ str.force_encoding(NKF.guess(str))
441
358
  end
442
359
 
443
360
  str
444
361
  end
445
-
446
- def guess_encoding(str)
447
- encoding = NKF.guess(str)
448
- # ISO-2022-JPにおいて、JIS X201半角カナエスケープシーケンスが含まれていたらCP50220とみなす
449
- if encoding == ::Encoding::ISO2022_JP && str.dup.force_encoding(BINARY).include?("\e(I")
450
- ::Encoding::CP50220
451
- else
452
- encoding
453
- end
454
- end
455
362
  end
456
363
  end
@@ -0,0 +1,3 @@
1
+ module Jpmobile
2
+ VERSION = "4.0.0"
3
+ end
@@ -42,7 +42,7 @@ namespace :test do
42
42
  FileUtils.rm_rf("Gemfile.lock")
43
43
  FileUtils.rm_rf(rails_root)
44
44
  FileUtils.mkdir_p(rails_root)
45
- `bundle exec rails new #{rails_root}`
45
+ `rails new #{rails_root} --skip-bundle`
46
46
  end
47
47
 
48
48
  # setup jpmobile
@@ -93,7 +93,7 @@ END
93
93
  # run tests in rails
94
94
  cd rails_root
95
95
  ruby "-S bundle install"
96
- ruby "-S rake db:migrate test" unless skip
96
+ ruby "-S rake db:migrate" unless skip
97
97
  ruby "-S rake spec"
98
98
  # ruby "-S rspec -b --color spec/requests/filter_spec.rb -e 'jpmobile integration spec HankakuInputFilterController SoftBank 910T からのアクセス it should behave like hankaku_filter :input => true のとき はtextareaの中では半角に変換されないこと'"
99
99
  end
@@ -67,21 +67,6 @@ describe "Jpmobile::Mail#receive" do
67
67
  end
68
68
  end
69
69
 
70
- describe "PC mail without subject" do
71
- before(:each) do
72
- @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/pc-mail-attached-without-subject.eml")).read)
73
- end
74
-
75
- it "body should be parsed correctly" do
76
- @mail.body.parts.size.should == 2
77
- @mail.body.parts.first.body.to_s.should == "本文です\n\n"
78
- end
79
-
80
- it "should encode correctly" do
81
- ascii_8bit(@mail.to_s).should match(/GODlhAQABAIAAAAAAAP/)
82
- end
83
- end
84
-
85
70
  describe "Docomo" do
86
71
  before(:each) do
87
72
  @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "../../test/rails/overrides/spec/fixtures/mobile_mailer/docomo-gmail-sjis.eml")).read)
@@ -273,7 +258,7 @@ describe "Jpmobile::Mail#receive" do
273
258
 
274
259
  it 'should be encoded correctly' do
275
260
  @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/iphone-message.eml")).read)
276
- @mail.encoded.should match(Regexp.escape("%[\e$B1`;yL>\e(B]%\e$B$N\e(B%[\e$BJ]8n<TL>\e(B]%"))
261
+ @mail.encoded
277
262
  end
278
263
  end
279
264
 
@@ -286,14 +271,14 @@ describe "Jpmobile::Mail#receive" do
286
271
 
287
272
  it 'should be encoded correctly' do
288
273
  @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/iphone-mail3.eml")).read)
289
- @mail.encoded.should match(/BK\\J82~9T\$J\$7!2#5#1#2J8;z!2/)
274
+ @mail.encoded
290
275
  end
291
276
  end
292
277
 
293
278
  it 'should not raise when parsing attached email' do
294
279
  lambda {
295
280
  @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/au-attached.eml")).read)
296
- @mail.encoded.should match('/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPQAA')
281
+ @mail.encoded
297
282
  }.should_not raise_error
298
283
  end
299
284
  end
@@ -362,16 +347,6 @@ describe "Jpmobile::Mail#receive" do
362
347
  @mail.body.to_s.should == "テスト本文\n\n"
363
348
  end
364
349
  end
365
-
366
- context "iPhone" do
367
- before(:each) do
368
- @mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/iphone-jis.eml")).read)
369
- end
370
-
371
- it "body should be parsed correctly" do
372
- expect(@mail.body.to_s).to eq("(=゚ω゚)ノ\n\n\n")
373
- end
374
- end
375
350
  end
376
351
 
377
352
  describe 'bounced mail' do
@@ -133,33 +133,22 @@ describe Jpmobile::Util do
133
133
  end
134
134
  end
135
135
 
136
- if defined?(Encoding)
137
- describe 'check_charset' do
138
- it 'returns true if compatible' do
139
- str = 'ABC'.force_encoding('ASCII-8BIT')
140
- check_charset(str, 'UTF-8').should be_true
141
- end
142
-
143
- it 'returns false if incompatible' do
144
- str = '再現'.encode('ISO-2022-JP')
145
- check_charset(str, 'UTF-8').should be_false
146
- end
136
+ describe 'check_charset' do
137
+ it 'returns true if compatible' do
138
+ str = 'ABC'.force_encoding('ASCII-8BIT')
139
+ check_charset(str, 'UTF-8').should be_true
147
140
  end
148
141
 
149
- describe 'correct_encoding' do
150
- it 'updates encoding correctly' do
151
- str = '再現'.force_encoding('ISO-2022-JP')
152
- correct_encoding(str).encoding.should == Encoding::UTF_8
153
- end
142
+ it 'returns false if incompatible' do
143
+ str = '再現'.encode('ISO-2022-JP')
144
+ check_charset(str, 'UTF-8').should be_false
154
145
  end
146
+ end
155
147
 
156
- describe 'guess_encoding' do
157
- it 'guesses encoding correclty' do
158
- expect(guess_encoding('テスト')).to eq Encoding::UTF_8
159
- expect(guess_encoding("\x83\x65\x83\x58\x83\x67")).to eq Encoding::Shift_JIS
160
- expect(guess_encoding("\e\x24\x42\x25\x46\x25\x39\x25\x48\e\x28\x42")).to eq Encoding::ISO2022_JP
161
- expect(guess_encoding("\e\x28\x49\x43\x3D\x44\e\x28\x42")).to eq Encoding::CP50220
162
- end
148
+ describe 'correct_encoding' do
149
+ it 'updates encoding correctly' do
150
+ str = '再現'.force_encoding('ISO-2022-JP')
151
+ correct_encoding(str).encoding.should == Encoding::UTF_8
163
152
  end
164
153
  end
165
154
  end
@@ -1,21 +1,62 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '~> 3.2.8'
3
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
4
+ gem 'rails', '4.0.0'
4
5
 
5
- gem 'sqlite3-ruby', :require => 'sqlite3'
6
+ # Use sqlite3 as the database for Active Record
7
+ gem 'sqlite3'
6
8
 
7
- gem 'geokit'
8
- gem 'hpricot'
9
+ # Use SCSS for stylesheets
10
+ gem 'sass-rails', '~> 4.0.0'
11
+
12
+ # Use Uglifier as compressor for JavaScript assets
13
+ gem 'uglifier', '>= 1.3.0'
14
+
15
+ # Use CoffeeScript for .js.coffee assets and views
16
+ gem 'coffee-rails', '~> 4.0.0'
17
+
18
+ # See https://github.com/sstephenson/execjs#readme for more supported runtimes
19
+ # gem 'therubyracer', platforms: :ruby
9
20
 
21
+ # Use jquery as the JavaScript library
10
22
  gem 'jquery-rails'
11
23
 
24
+ # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
25
+ gem 'turbolinks'
26
+
27
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
28
+ gem 'jbuilder', '~> 1.2'
29
+
30
+ group :doc do
31
+ # bundle exec rake doc:rails generates the API under doc/api.
32
+ gem 'sdoc', require: false
33
+ end
34
+
35
+ # Use ActiveModel has_secure_password
36
+ # gem 'bcrypt-ruby', '~> 3.0.0'
37
+
38
+ # Use unicorn as the app server
39
+ # gem 'unicorn'
40
+
41
+ # Use Capistrano for deployment
42
+ # gem 'capistrano', group: :development
43
+
44
+ # Use debugger
45
+ # gem 'debugger', group: [:development, :test]
46
+
47
+ gem 'geokit'
48
+ gem 'hpricot'
49
+
12
50
  gem 'jpmobile', :path => '../../../'
13
51
  gem 'jpmobile-terminfo', :path => '../../../vendor/jpmobile-terminfo'
14
52
  gem 'jpmobile-ipaddresses', :path => '../../../vendor/jpmobile-ipaddresses'
15
53
 
54
+ gem 'activerecord-session_store', github: 'rails/activerecord-session_store'
55
+
16
56
  # Bundle gems for certain environments:
17
57
  group :development, :test do
18
58
  gem "rspec", ">= 2.8.0"
19
59
  gem "rspec-rails", ">= 2.8.0"
20
60
  gem 'webrat'
61
+ gem 'pry'
21
62
  end