jpmobile 4.2.5 → 5.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/jpmobile.gemspec +1 -2
  4. data/lib/jpmobile.rb +17 -7
  5. data/lib/jpmobile/configuration.rb +1 -1
  6. data/lib/jpmobile/encoding.rb +13 -19
  7. data/lib/jpmobile/{hook_action_controller.rb → fallback_view_selector.rb} +4 -6
  8. data/lib/jpmobile/filter.rb +13 -10
  9. data/lib/jpmobile/mobile/abstract_mobile.rb +2 -2
  10. data/lib/jpmobile/mobile/google_emoticon.rb +2 -2
  11. data/lib/jpmobile/mobile/smart_phone.rb +2 -2
  12. data/lib/jpmobile/mobile/unicode_emoticon.rb +2 -2
  13. data/lib/jpmobile/rack/filter.rb +36 -38
  14. data/lib/jpmobile/rack/mobile_carrier.rb +8 -10
  15. data/lib/jpmobile/rack/params_filter.rb +32 -34
  16. data/lib/jpmobile/rails.rb +17 -4
  17. data/lib/jpmobile/resolver.rb +2 -3
  18. data/lib/jpmobile/trans_sid.rb +58 -78
  19. data/lib/jpmobile/util.rb +0 -17
  20. data/lib/jpmobile/version.rb +1 -1
  21. data/lib/tasks/jpmobile_tasks.rake +31 -37
  22. data/spec/rack/jpmobile/android_spec.rb +2 -2
  23. data/spec/rack/jpmobile/au_spec.rb +17 -17
  24. data/spec/rack/jpmobile/black_berry_spec.rb +2 -2
  25. data/spec/rack/jpmobile/docomo_spec.rb +15 -15
  26. data/spec/rack/jpmobile/emoticon_spec.rb +57 -57
  27. data/spec/rack/jpmobile/filter_spec.rb +25 -25
  28. data/spec/rack/jpmobile/iphone_spec.rb +3 -3
  29. data/spec/rack/jpmobile/mobile_by_ua_spec.rb +3 -3
  30. data/spec/rack/jpmobile/params_filter_spec.rb +10 -10
  31. data/spec/rack/jpmobile/softbank_spec.rb +9 -9
  32. data/spec/rack/jpmobile/willcom_spec.rb +6 -6
  33. data/spec/rack/jpmobile/windows_phone.rb +2 -2
  34. data/spec/rack_helper.rb +0 -1
  35. data/spec/unit/mail_spec.rb +1 -10
  36. data/spec/unit/util_spec.rb +42 -56
  37. data/test/rails/overrides/Gemfile.jpmobile +5 -3
  38. data/test/rails/overrides/app/controllers/filter_controller.rb +0 -1
  39. data/test/rails/overrides/app/controllers/filter_controller_base.rb +14 -9
  40. data/test/rails/overrides/app/controllers/hankaku_input_filter_controller.rb +2 -2
  41. data/test/rails/overrides/app/controllers/trans_sid_metal_controller.rb +0 -1
  42. data/test/rails/overrides/app/views/filter/text_template.html.erb +1 -0
  43. data/test/rails/overrides/spec/controllers/mobile_spec_controller_spec.rb +3 -3
  44. data/test/rails/overrides/spec/controllers/trans_sid_controller_spec.rb +2 -2
  45. data/test/rails/overrides/spec/features/filter_spec.rb +10 -9
  46. data/test/rails/overrides/spec/helpers/helpers_spec.rb +5 -3
  47. data/test/rails/overrides/spec/requests/docomo_spec.rb +6 -6
  48. data/test/rails/overrides/spec/requests/emobile_spec.rb +6 -6
  49. data/test/rails/overrides/spec/requests/pc_spec.rb +3 -3
  50. data/test/rails/overrides/spec/requests/softbank_emulator_spec.rb +4 -4
  51. data/test/rails/overrides/spec/requests/template_path_spec.rb +1 -1
  52. data/test/rails/overrides/spec/requests/trans_sid_spec.rb +7 -9
  53. metadata +12 -28
  54. data/lib/jpmobile/hook_action_dispatch.rb +0 -2
  55. data/lib/jpmobile/rack.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75c55dcda88eb9b688229ad95addf319f2f9c5bc
4
- data.tar.gz: 2c7b30902e3cd5174f4c76c2beaa34f6aa26f91a
3
+ metadata.gz: dbcc78220f8ee88ca102524a012cb278a111af2b
4
+ data.tar.gz: 7578e413d0afb4020c51127f6b6e15a5c7c57c4d
5
5
  SHA512:
6
- metadata.gz: 8786691f538410a72d3ba82d91e0ebd83d0a594932b6174543ed1395125645809fee135a8c0f9ebe650aa71095bb48fc69558f3e9371731762472ce828a312a7
7
- data.tar.gz: 59d9d825bc60b73fdadc69b6a233fdf19ef80960f82a6d6a5f5d86cd72ef2c23bffa8ffcdb85fca4153d6f5e9979ef31d0247c8542cd45922e0fec57d7d67694
6
+ metadata.gz: 1d8730c91d837df4c844138703365232a8d339e4b0cd0c0438d3812f44644fe2c9be4ee9478294e8aad2afa72195acd5458c18d0a774b0307e50138d0f94fc1d
7
+ data.tar.gz: 3c72edb2d3fbe357cfcdeb6a6d6a6e4a769be0bae1ba9883e4f20841da5a00f7de2497c9a2d105c2336ecd2ec52a0297c1255c449cea972398e051971680713b
data/.gitignore CHANGED
@@ -17,5 +17,4 @@ rdoc
17
17
  spec/reports
18
18
  test/tmp
19
19
  test/version_tmp
20
- .ruby-version
21
- .envrc
20
+ .ruby-version
data/jpmobile.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
17
  gem.require_paths = ["lib"]
18
18
 
19
- gem.add_development_dependency 'rails', '~> 4.2'
19
+ gem.add_development_dependency 'rails', '5.0.0.beta1'
20
20
  gem.add_development_dependency 'rspec'
21
21
  gem.add_development_dependency 'rspec-rails'
22
22
  gem.add_development_dependency 'rspec-its'
@@ -26,5 +26,4 @@ Gem::Specification.new do |gem|
26
26
  gem.add_development_dependency 'hpricot'
27
27
  gem.add_development_dependency 'git'
28
28
  gem.add_development_dependency 'pry'
29
- gem.add_development_dependency 'mail', '2.5.5'
30
29
  end
data/lib/jpmobile.rb CHANGED
@@ -2,6 +2,8 @@
2
2
  $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) ||
3
3
  $:.include?(File.expand_path(File.dirname(__FILE__)))
4
4
  require "jpmobile/version"
5
+ require 'singleton'
6
+ require 'rack/utils'
5
7
 
6
8
  module Jpmobile
7
9
  autoload :Email, 'jpmobile/email'
@@ -52,22 +54,30 @@ module Jpmobile
52
54
  require 'jpmobile/mobile/abstract_mobile'
53
55
  end
54
56
 
55
- # autoload Rack middlewares
56
- autoload :Rack, 'jpmobile/rack'
57
- module Rack
58
- autoload :MobileCarrier, 'jpmobile/rack/mobile_carrier'
59
- autoload :ParamsFilter, 'jpmobile/rack/params_filter'
60
- autoload :Filter, 'jpmobile/rack/filter'
61
- end
62
57
  autoload :Configuration, 'jpmobile/configuration'
63
58
 
59
+ autoload :MobileCarrier, 'jpmobile/rack/mobile_carrier'
60
+ autoload :ParamsFilter, 'jpmobile/rack/params_filter'
61
+ autoload :Filter, 'jpmobile/rack/filter'
62
+
64
63
  autoload :Mailer, 'jpmobile/mailer'
65
64
  autoload :Resolver, 'jpmobile/resolver'
66
65
 
66
+ autoload :FallbackViewSelector, 'jpmobile/fallback_view_selector'
67
+
68
+ autoload :TransSidRedirecting, 'jpmobile/trans_sid'
69
+ autoload :TransSid, 'jpmobile/trans_sid'
70
+
67
71
  module_function
68
72
  def config
69
73
  ::Jpmobile::Configuration.instance
70
74
  end
75
+
76
+ def mount_middlewares
77
+ # 漢字コード・絵文字フィルター
78
+ ::Rails.application.middleware.insert_after ::Jpmobile::MobileCarrier, ::Jpmobile::ParamsFilter
79
+ ::Rails.application.middleware.insert_after ::Jpmobile::ParamsFilter, ::Jpmobile::Filter
80
+ end
71
81
  end
72
82
 
73
83
  if defined?(Rails)
@@ -13,7 +13,7 @@ module Jpmobile
13
13
  end
14
14
 
15
15
  def mobile_filter
16
- ::Jpmobile::Rack.mount_middlewares
16
+ ::Jpmobile.mount_middlewares
17
17
  end
18
18
 
19
19
  def session_store(&block)
@@ -2,28 +2,22 @@
2
2
  # params を UTF-8 にする拡張
3
3
  module Jpmobile
4
4
  module Encoding
5
- def self.included(base)
6
- base.class_eval do
7
- alias_method :parameters_without_jpmobile, :parameters
5
+ def parameters
6
+ return @parameters if @jpmobile_params_converted
8
7
 
9
- def parameters
10
- return @parameters if @jpmobile_params_converted
11
-
12
- # load params
13
- @parameters = parameters_without_jpmobile
14
- # 変換
15
- @parameters = Jpmobile::Util.deep_convert(@parameters) do |value|
16
- value = Jpmobile::Util.utf8(value)
17
- end
18
-
19
- @jpmobile_params_converted = true
20
- if @parameters.respond_to?(:with_indifferent_access)
21
- @parameters = @parameters.with_indifferent_access
22
- end
8
+ # load params
9
+ @parameters = super
10
+ # 変換
11
+ @parameters = Jpmobile::Util.deep_convert(@parameters) do |value|
12
+ value = Jpmobile::Util.utf8(value)
13
+ end
23
14
 
24
- @parameters
25
- end
15
+ @jpmobile_params_converted = true
16
+ if @parameters.respond_to?(:with_indifferent_access)
17
+ @parameters = @parameters.with_indifferent_access
26
18
  end
19
+
20
+ @parameters
27
21
  end
28
22
  end
29
23
  end
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'jpmobile/lookup_context'
3
3
 
4
- module ActionController
5
- module Renderers
6
- def render_to_body_with_jpmobile(options)
4
+ module Jpmobile
5
+ module FallbackViewSelector
6
+ def render_to_body(options)
7
7
  if Jpmobile.config.fallback_view_selector and
8
8
  lookup_context.mobile.present? and !lookup_context.mobile.empty?
9
9
  begin
@@ -21,9 +21,7 @@ module ActionController
21
21
  end
22
22
  end
23
23
 
24
- render_to_body_without_jpmobile(options)
24
+ super(options)
25
25
  end
26
-
27
- alias_method_chain :render_to_body, :jpmobile
28
26
  end
29
27
  end
@@ -7,12 +7,6 @@ ActiveSupport.on_load(:action_controller) do
7
7
  before_action Jpmobile::HankakuFilter.new(options)
8
8
  after_action Jpmobile::HankakuFilter.new(options)
9
9
  end
10
-
11
- def self.mobile_filter(options={})
12
- STDERR.puts "Method mobile_filter is now deprecated. Use hankaku_filter instead for Hankaku-conversion."
13
-
14
- self.hankaku_filter(options)
15
- end
16
10
  end
17
11
 
18
12
  module Jpmobile
@@ -75,10 +69,9 @@ module Jpmobile
75
69
 
76
70
  def before(controller)
77
71
  @controller = controller
72
+
78
73
  if apply_incoming?
79
- Util.deep_apply(@controller.params) do |value|
80
- value = to_internal(value)
81
- end
74
+ @controller.params = convert_parameters(@controller.params.dup)
82
75
  end
83
76
  end
84
77
 
@@ -128,7 +121,7 @@ module Jpmobile
128
121
  end
129
122
 
130
123
  def filter(method, str)
131
- str = str.dup
124
+ str = str.clone
132
125
 
133
126
  # 一度UTF-8に変換
134
127
  before_encoding = nil
@@ -172,5 +165,15 @@ module Jpmobile
172
165
  @controller.request.mobile.default_charset
173
166
  end
174
167
  end
168
+
169
+ def convert_parameters(params)
170
+ params.each do |k, v|
171
+ if params[k].respond_to?(:each)
172
+ params[k] = convert_parameters(params[k])
173
+ else
174
+ params[k] = to_internal(v)
175
+ end
176
+ end
177
+ end
175
178
  end
176
179
  end
@@ -58,12 +58,12 @@ module Jpmobile::Mobile
58
58
  false
59
59
  end
60
60
 
61
- # Jpmobile::Rack::Filter を適用するかどうか
61
+ # Jpmobile::Filter を適用するかどうか
62
62
  def apply_filter?
63
63
  true
64
64
  end
65
65
 
66
- # Jpmobile::Rack::ParamsFilter を適用するかどうか
66
+ # Jpmobile::ParamsFilter を適用するかどうか
67
67
  def apply_params_filter?
68
68
  true
69
69
  end
@@ -1,12 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Jpmobile::Mobile
3
3
  module GoogleEmoticon
4
- # Jpmobile::Rack::Filter を適用する
4
+ # Jpmobile::Filter を適用する
5
5
  def apply_filter?
6
6
  Jpmobile.config.smart_phone_emoticon_compatibility
7
7
  end
8
8
 
9
- # Jpmobile::Rack::ParamsFilter を適用する
9
+ # Jpmobile::ParamsFilter を適用する
10
10
  def apply_params_filter?
11
11
  Jpmobile.config.smart_phone_emoticon_compatibility
12
12
  end
@@ -18,12 +18,12 @@ module Jpmobile::Mobile
18
18
  true
19
19
  end
20
20
 
21
- # Jpmobile::Rack::Filter は適用しない
21
+ # Jpmobile::Filter は適用しない
22
22
  def apply_filter?
23
23
  false
24
24
  end
25
25
 
26
- # Jpmobile::Rack::ParamsFilter は適用しない
26
+ # Jpmobile::ParamsFilter は適用しない
27
27
  def apply_params_filter?
28
28
  false
29
29
  end
@@ -1,12 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Jpmobile::Mobile
3
3
  module UnicodeEmoticon
4
- # Jpmobile::Rack::Filter を適用する
4
+ # Jpmobile::Filter を適用する
5
5
  def apply_filter?
6
6
  Jpmobile.config.smart_phone_emoticon_compatibility
7
7
  end
8
8
 
9
- # Jpmobile::Rack::ParamsFilter を適用する
9
+ # Jpmobile::ParamsFilter を適用する
10
10
  def apply_params_filter?
11
11
  Jpmobile.config.smart_phone_emoticon_compatibility
12
12
  end
@@ -3,55 +3,53 @@
3
3
  require 'scanf'
4
4
 
5
5
  module Jpmobile
6
- module Rack
7
- class Filter
8
- def initialize(app)
9
- @app = app
10
- end
11
-
12
- def call(env)
13
- # 入力を保存
14
- mobile = env['rack.jpmobile']
6
+ class Filter
7
+ def initialize(app)
8
+ @app = app
9
+ end
15
10
 
16
- status, env, response = @app.call(env)
11
+ def call(env)
12
+ # 入力を保存
13
+ mobile = env['rack.jpmobile']
17
14
 
18
- if env['Content-Type'] =~ %r!text/html|application/xhtml\+xml!
19
- if mobile and mobile.apply_filter?
20
- type, charset = env['Content-Type'].split(/;\s*charset=/)
15
+ status, env, response = @app.call(env)
21
16
 
22
- body = response_to_body(response)
23
- body = body.gsub(/<input name="utf8" type="hidden" value="#{[0x2713].pack("U")}"[^>]*?>/, ' ')
24
- body = body.gsub(/<input name="utf8" type="hidden" value="&#x2713;"[^>]*?>/, ' ')
17
+ if env['Content-Type'] =~ %r!text/html|application/xhtml\+xml!
18
+ if mobile and mobile.apply_filter?
19
+ type, charset = env['Content-Type'].split(/;\s*charset=/)
25
20
 
26
- response, charset = mobile.to_external(body, type, charset)
21
+ body = response_to_body(response)
22
+ body = body.gsub(/<input name="utf8" type="hidden" value="#{[0x2713].pack("U")}"[^>]*?>/, ' ')
23
+ body = body.gsub(/<input name="utf8" type="hidden" value="&#x2713;"[^>]*?>/, ' ')
27
24
 
28
- if type and charset
29
- env['Content-Type'] = "#{type}; charset=#{charset}"
30
- end
31
- elsif Jpmobile::Emoticon.pc_emoticon?
32
- body = response_to_body(response)
25
+ response, charset = mobile.to_external(body, type, charset)
33
26
 
34
- response = Jpmobile::Emoticon.emoticons_to_image(body)
27
+ if type and charset
28
+ env['Content-Type'] = "#{type}; charset=#{charset}"
35
29
  end
36
- end
30
+ elsif Jpmobile::Emoticon.pc_emoticon?
31
+ body = response_to_body(response)
37
32
 
38
- new_response = ::Rack::Response.new(response, status, env)
39
- new_response.finish
33
+ response = Jpmobile::Emoticon.emoticons_to_image(body)
34
+ end
40
35
  end
41
36
 
42
- private
43
- def response_to_body(response)
44
- if response.respond_to?(:to_str)
45
- response.to_str
46
- elsif response.respond_to?(:each)
47
- body = []
48
- response.each do |part|
49
- body << response_to_body(part)
50
- end
51
- body.join("\n")
52
- else
53
- body
37
+ new_response = ::Rack::Response.new(response, status, env)
38
+ new_response.finish
39
+ end
40
+
41
+ private
42
+ def response_to_body(response)
43
+ if response.respond_to?(:to_str)
44
+ response.to_str
45
+ elsif response.respond_to?(:each)
46
+ body = []
47
+ response.each do |part|
48
+ body << response_to_body(part)
54
49
  end
50
+ body.join("\n")
51
+ else
52
+ body
55
53
  end
56
54
  end
57
55
  end
@@ -1,21 +1,19 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # UserAgent から生成すべき class 名を判定する
3
3
  module Jpmobile
4
- module Rack
5
- class MobileCarrier
6
- def initialize(app)
7
- @app = app
8
- end
4
+ class MobileCarrier
5
+ def initialize(app)
6
+ @app = app
7
+ end
9
8
 
10
- def call(env)
11
- env['rack.jpmobile'] = Jpmobile::Mobile::AbstractMobile.carrier(env)
9
+ def call(env)
10
+ env['rack.jpmobile'] = Jpmobile::Mobile::AbstractMobile.carrier(env)
12
11
 
13
- @app.call(env)
14
- end
12
+ @app.call(env)
15
13
  end
16
14
  end
17
15
  end
18
16
 
19
17
  class Rack::Request
20
- include Jpmobile::RequestWithMobile
18
+ include ::Jpmobile::RequestWithMobile
21
19
  end
@@ -1,49 +1,47 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # リクエストパラメータの変換
3
3
  module Jpmobile
4
- module Rack
5
- class ParamsFilter
6
- def initialize(app)
7
- @app = app
8
- end
4
+ class ParamsFilter
5
+ def initialize(app)
6
+ @app = app
7
+ end
9
8
 
10
- def call(env)
11
- # 入力
12
- if mobile = env['rack.jpmobile'] and mobile.apply_params_filter?
13
- # パラメータをkey, valueに分解
14
- # form_params
15
- unless env['REQUEST_METHOD'] == 'GET' || env['REQUEST_METHOD'] == 'HEAD'
16
- unless env['CONTENT_TYPE'] =~ /application\/json|application\/xml/
17
- env['rack.input'] = StringIO.new(parse_query(env['rack.input'].read, mobile))
18
- end
9
+ def call(env)
10
+ # 入力
11
+ if @mobile = env['rack.jpmobile'] and @mobile.apply_params_filter?
12
+ # パラメータをkey, valueに分解
13
+ # form_params
14
+ unless env['REQUEST_METHOD'] == 'GET' || env['REQUEST_METHOD'] == 'HEAD'
15
+ unless env['CONTENT_TYPE'] =~ /application\/json|application\/xml/
16
+ env['rack.input'] = StringIO.new(parse_query(env['rack.input'].read))
19
17
  end
20
-
21
- # query_params
22
- env['QUERY_STRING'] = parse_query(env['QUERY_STRING'], mobile)
23
18
  end
24
19
 
25
- status, env, body = @app.call(env)
26
-
27
- [status, env, body]
20
+ # query_params
21
+ env['QUERY_STRING'] = parse_query(env['QUERY_STRING'])
28
22
  end
29
23
 
30
- private
31
- def to_internal(str, mobile)
32
- ::Rack::Utils.escape(mobile.to_internal(::Rack::Utils.unescape(str)))
33
- end
34
- def parse_query(str, mobile)
35
- return nil unless str
24
+ status, env, body = @app.call(env)
36
25
 
37
- new_array = []
38
- str.split("&").each do |param_pair|
39
- k, v = param_pair.split("=")
40
- k = to_internal(k, mobile) if k
41
- v = to_internal(v, mobile) if v
42
- new_array << "#{k}=#{v}" if k
43
- end
26
+ [status, env, body]
27
+ end
44
28
 
45
- new_array.join("&")
29
+ private
30
+ def to_internal(str)
31
+ ::Rack::Utils.escape(@mobile.to_internal(::Rack::Utils.unescape(str)))
32
+ end
33
+ def parse_query(str)
34
+ return nil unless str
35
+
36
+ new_array = []
37
+ str.split("&").each do |param_pair|
38
+ k, v = param_pair.split("=")
39
+ k = to_internal(k) if k
40
+ v = to_internal(v) if v
41
+ new_array << "#{k}=#{v}" if k
46
42
  end
43
+
44
+ new_array.join("&")
47
45
  end
48
46
  end
49
47
  end