jpmobile 3.0.9 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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