jpmobile 4.2.5 → 5.0.0.beta1

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 (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