mobylette 1.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 (120) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +83 -0
  3. data/Rakefile +37 -0
  4. data/lib/mobylette.rb +12 -0
  5. data/lib/mobylette/controllers/helpers.rb +52 -0
  6. data/lib/mobylette/controllers/respond_to_mobile_requests.rb +86 -0
  7. data/lib/mobylette/helmet.rb +41 -0
  8. data/lib/mobylette/helmet/faker.rb +19 -0
  9. data/lib/mobylette/helmet/helpers.rb +34 -0
  10. data/lib/mobylette/railtie.rb +10 -0
  11. data/lib/mobylette/version.rb +3 -0
  12. data/lib/tasks/mobylette_tasks.rake +4 -0
  13. data/spec/controllers/actioncontroller_base_spec.rb +16 -0
  14. data/spec/controllers/default_fallback_controller_spec.rb +36 -0
  15. data/spec/controllers/desktop_only_controller_spec.rb +17 -0
  16. data/spec/controllers/force_fallback_controller_spec.rb +41 -0
  17. data/spec/controllers/home_controller_spec.rb +89 -0
  18. data/spec/controllers/no_fallback_controller_spec.rb +56 -0
  19. data/spec/dummy/Rakefile +7 -0
  20. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  21. data/spec/dummy/app/assets/javascripts/application_mobile.js +9 -0
  22. data/spec/dummy/app/assets/javascripts/default_fallback.js +2 -0
  23. data/spec/dummy/app/assets/javascripts/desktop_only.js +2 -0
  24. data/spec/dummy/app/assets/javascripts/fallbacks.js +2 -0
  25. data/spec/dummy/app/assets/javascripts/force_fallback.js +2 -0
  26. data/spec/dummy/app/assets/javascripts/home.js +2 -0
  27. data/spec/dummy/app/assets/javascripts/no_fallback.js +2 -0
  28. data/spec/dummy/app/assets/javascripts/testing.js +2 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +11 -0
  30. data/spec/dummy/app/assets/stylesheets/application_mobile.css +11 -0
  31. data/spec/dummy/app/assets/stylesheets/default_fallback.css +4 -0
  32. data/spec/dummy/app/assets/stylesheets/desktop_only.css +4 -0
  33. data/spec/dummy/app/assets/stylesheets/fallbacks.css +4 -0
  34. data/spec/dummy/app/assets/stylesheets/force_fallback.css +4 -0
  35. data/spec/dummy/app/assets/stylesheets/home.css +4 -0
  36. data/spec/dummy/app/assets/stylesheets/no_fallback.css +4 -0
  37. data/spec/dummy/app/assets/stylesheets/testing.css +4 -0
  38. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  39. data/spec/dummy/app/controllers/default_fallback_controller.rb +13 -0
  40. data/spec/dummy/app/controllers/desktop_only_controller.rb +2 -0
  41. data/spec/dummy/app/controllers/fallbacks_controller.rb +7 -0
  42. data/spec/dummy/app/controllers/force_fallback_controller.rb +13 -0
  43. data/spec/dummy/app/controllers/home_controller.rb +19 -0
  44. data/spec/dummy/app/controllers/no_fallback_controller.rb +13 -0
  45. data/spec/dummy/app/controllers/testing_controller.rb +9 -0
  46. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  47. data/spec/dummy/app/helpers/default_fallback_helper.rb +2 -0
  48. data/spec/dummy/app/helpers/desktop_only_helper.rb +2 -0
  49. data/spec/dummy/app/helpers/fallbacks_helper.rb +2 -0
  50. data/spec/dummy/app/helpers/force_fallback_helper.rb +2 -0
  51. data/spec/dummy/app/helpers/home_helper.rb +2 -0
  52. data/spec/dummy/app/helpers/no_fallback_helper.rb +2 -0
  53. data/spec/dummy/app/helpers/testing_helper.rb +2 -0
  54. data/spec/dummy/app/views/default_fallback/index.html.erb +1 -0
  55. data/spec/dummy/app/views/default_fallback/index.js.erb +1 -0
  56. data/spec/dummy/app/views/default_fallback/index.mobile.erb +1 -0
  57. data/spec/dummy/app/views/default_fallback/test.html.erb +1 -0
  58. data/spec/dummy/app/views/default_fallback/test.js.erb +1 -0
  59. data/spec/dummy/app/views/fallbacks/index.html.erb +2 -0
  60. data/spec/dummy/app/views/fallbacks/index.js.erb +1 -0
  61. data/spec/dummy/app/views/fallbacks/index.mobile.erb +0 -0
  62. data/spec/dummy/app/views/fallbacks/index.xml.erb +0 -0
  63. data/spec/dummy/app/views/fallbacks/no_mobile.html.erb +0 -0
  64. data/spec/dummy/app/views/force_fallback/index.html.erb +1 -0
  65. data/spec/dummy/app/views/force_fallback/index.js.erb +1 -0
  66. data/spec/dummy/app/views/force_fallback/index.mobile.erb +1 -0
  67. data/spec/dummy/app/views/force_fallback/test.html.erb +1 -0
  68. data/spec/dummy/app/views/force_fallback/test.js.erb +1 -0
  69. data/spec/dummy/app/views/home/desktop.html.erb +1 -0
  70. data/spec/dummy/app/views/home/index.html.erb +7 -0
  71. data/spec/dummy/app/views/home/index.mobile.erb +7 -0
  72. data/spec/dummy/app/views/home/mobile.mobile.erb +1 -0
  73. data/spec/dummy/app/views/home/no_mobile_view.html.erb +1 -0
  74. data/spec/dummy/app/views/layouts/application.html.erb +16 -0
  75. data/spec/dummy/app/views/layouts/application.mobile.erb +16 -0
  76. data/spec/dummy/app/views/no_fallback/index.html.erb +1 -0
  77. data/spec/dummy/app/views/no_fallback/index.js.erb +1 -0
  78. data/spec/dummy/app/views/no_fallback/index.mobile.erb +1 -0
  79. data/spec/dummy/app/views/no_fallback/test.html.erb +1 -0
  80. data/spec/dummy/app/views/no_fallback/test.js.erb +1 -0
  81. data/spec/dummy/config.ru +4 -0
  82. data/spec/dummy/config/application.rb +46 -0
  83. data/spec/dummy/config/boot.rb +10 -0
  84. data/spec/dummy/config/database.yml +25 -0
  85. data/spec/dummy/config/environment.rb +5 -0
  86. data/spec/dummy/config/environments/development.rb +33 -0
  87. data/spec/dummy/config/environments/production.rb +51 -0
  88. data/spec/dummy/config/environments/test.rb +42 -0
  89. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  90. data/spec/dummy/config/initializers/inflections.rb +10 -0
  91. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  92. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  93. data/spec/dummy/config/initializers/session_store.rb +8 -0
  94. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  95. data/spec/dummy/config/locales/en.yml +5 -0
  96. data/spec/dummy/config/routes.rb +22 -0
  97. data/spec/dummy/db/development.sqlite3 +0 -0
  98. data/spec/dummy/db/schema.rb +16 -0
  99. data/spec/dummy/db/test.sqlite3 +0 -0
  100. data/spec/dummy/log/development.log +32 -0
  101. data/spec/dummy/log/test.log +1537 -0
  102. data/spec/dummy/public/404.html +26 -0
  103. data/spec/dummy/public/422.html +26 -0
  104. data/spec/dummy/public/500.html +26 -0
  105. data/spec/dummy/public/favicon.ico +0 -0
  106. data/spec/dummy/script/rails +6 -0
  107. data/spec/dummy/tmp/cache/assets/C82/3E0/sprockets%2F48eb4ac616538f8f36870451073315da +0 -0
  108. data/spec/dummy/tmp/cache/assets/CE4/1C0/sprockets%2F18d93e1533d585b2f64ec90b33176ac9 +0 -0
  109. data/spec/dummy/tmp/cache/assets/CED/A70/sprockets%2F621683d8791730a9cc7ce45e17a7e46d +0 -0
  110. data/spec/dummy/tmp/cache/assets/CFC/200/sprockets%2F716f89d85d4855706b8a9abec1969c62 +0 -0
  111. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  112. data/spec/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
  113. data/spec/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  114. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  115. data/spec/dummy/tmp/pids/server.pid +1 -0
  116. data/spec/helpers/mobylette_helpers_spec.rb +59 -0
  117. data/spec/integration/navigation_spec.rb +9 -0
  118. data/spec/mobylette_spec.rb +7 -0
  119. data/spec/spec_helper.rb +35 -0
  120. metadata +320 -0
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,83 @@
1
+ http://fd.img.v4.skyrock.net/fd6/mantaur/pics/206915407_small.jpg
2
+
3
+ = Mobylette http://travis-ci.org/tscolari/mobylette.png
4
+
5
+ This gem works by adding the 'mobile' format to your rails application. Whenever a request come from a mobile device, if you have your controller mobile enabled, it shall render the view.mobile.erb instead of the view.html.erb (or haml, or whatever).
6
+
7
+ This gem is based on the mobile_fu plugin (https://github.com/brendanlim/mobile-fu). Also these pages were very usefull for me:
8
+ * http://stackoverflow.com/questions/5126085/ruby-on-rails-mobile-application
9
+ * http://www.arctickiwi.com/blog/mobile-enable-your-ruby-on-rails-site-for-small-screens
10
+ * http://metautonomo.us/2011/01/05/mobile-devices-and-rails-maintaining-your-sanity/
11
+
12
+ == How does it work?
13
+
14
+ By adding "respond_to_mobile_requests" in your application_controller (or any other controller), your controllers (or that controller) will understand mobile requests as a new mime type alias "mobile". This will make the controller to search for the .mobile.erb file instead of the .html.erb. Also you will be able to do:
15
+
16
+ respond_to do |format|
17
+ format.html { ... }
18
+ format.mobile { ... }
19
+ end
20
+
21
+ == Instalation
22
+
23
+ Add the gem to your gemfile:
24
+
25
+ gem 'mobylette', :git => "git://github.com/tscolari/mobylette.git"
26
+
27
+ And add to your ApplicationController.rb (for enabling it to all your controllers) or to the controllers you want this functionality on:
28
+
29
+ respond_to_mobile_requests
30
+
31
+ After that, you may start adding your .mobile. views.
32
+
33
+ == Helpers
34
+
35
+ ==== is_mobile_request?
36
+
37
+ This helper returns true if the request comes from a mobile device, false if it does not.
38
+
39
+ ==== mobylette_stylesheet_link_tag(*sources)
40
+
41
+ This works like the stylesheet_link_tag helper, but when the request comes from a mobile device, it adds "_mobile" to the stylesheets before calling stylesheet_link_tag
42
+
43
+ ==== mobylette_javascript_include_tag(*soruces)
44
+
45
+ Same as mobylette_stylesheet_link_tag, but for javascript files and javascript_include_tag
46
+
47
+ == Fall Backs
48
+
49
+ By default, when the mobile format is not found, mobylette will fall back to the request original format. For example, if a cell phone makes a request by html, and there is no mobile view, it will render the html. You may force it always to fall back to a especific format, by passing the :fall_back parameter to the respond_to_mobile_requests method:
50
+
51
+ respond_to_mobile_requests :fall_back => :html
52
+
53
+ This would force all views (mobile) to fall back to the html views. You may also disable this behavior, and no fall back will ever occur:
54
+
55
+ respond_to_mobile_requests :fall_back => false
56
+
57
+ == Testing
58
+
59
+ http://image.tin247.com/kenh14/080918143137-689-665.jpg
60
+
61
+ Don't drive your mobylette without your Helmet! It's always safer do tests!
62
+
63
+ For testing, include the Mobylette::Helmet module to your test/test_helpers.rb:
64
+
65
+ include Mobylette::Helmet
66
+
67
+ For RSpec: add to your spec/spec_helpers.rb or create a spec/support/mobylette.rb with the following:
68
+
69
+ RSpec.configure do |config|
70
+ config.include Mobylette::Helmet, :type => :controller
71
+ end
72
+
73
+ This will add 2 methods to your test scope:
74
+
75
+ force_mobile_request_agent(device = "Android")
76
+
77
+ this one will force your user_agent to the one specified, allowing you to test mobile requests.
78
+
79
+ reset_test_request_agent
80
+
81
+ and this one will reset your user_agent to the test default "Rails Testing". You don't need to call this everytime, all your requests by default are "Rails Testing" in your test env.
82
+
83
+ Friendly note: on your tests, call these functions BEFORE you make the request, otherwise they are useless =p
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Mobylette'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'lib'
31
+ t.libs << 'test'
32
+ t.pattern = 'test/**/*_test.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+
37
+ task :default => :test
@@ -0,0 +1,12 @@
1
+ module Mobylette
2
+ module Controllers
3
+ autoload "RespondToMobileRequests", "mobylette/controllers/respond_to_mobile_requests"
4
+ autoload "Helpers" , "mobylette/controllers/helpers"
5
+ end
6
+
7
+ autoload "Helmet" , "mobylette/helmet"
8
+ require 'mobylette/railtie'
9
+ end
10
+
11
+ require 'action_controller'
12
+ Mime::Type.register_alias "text/html", :mobile
@@ -0,0 +1,52 @@
1
+ module Mobylette
2
+ module Controllers
3
+
4
+ #
5
+ # Mobylette::Controllers::Helpers include few methods to
6
+ # include different css/js files for the mobile and for
7
+ # the normal version of your layout
8
+ #
9
+ # Personal note: I'm rethinking and I guess that, since you
10
+ # may have (and probably will) a different layout file for the
11
+ # "normal" and mobile version, you probably wont use this at all
12
+ module Helpers
13
+ extend ActiveSupport::Concern
14
+
15
+ # Adds a "_mobile" sulfix to the files you include (when the request is mobile)
16
+ def mobylette_stylesheet_link_tag(*sources)
17
+ options = sources.extract_options!
18
+ if is_mobile_request?
19
+ stylesheet_link_tag(*sulfix_mobile_assets(sources, :css).insert(-1, options))
20
+ else
21
+ stylesheet_link_tag(*sources.insert(-1, options))
22
+ end
23
+ end
24
+
25
+ # Adds a "_mobile" sulfix to the files you include (when the request is mobile)
26
+ def mobylette_javascript_include_tag(*sources)
27
+ options = sources.extract_options!
28
+ if is_mobile_request?
29
+ javascript_include_tag(*sulfix_mobile_assets(sources, :js).insert(-1, options))
30
+ else
31
+ javascript_include_tag(*sources.insert(-1, options))
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ #
38
+ # Anex the "_mobile" sulfix to each string in the array,
39
+ # before the .#{extension}, if it exists
40
+ def sulfix_mobile_assets(sources, extension)
41
+ sources.map do |source|
42
+ if source =~ /.#{extension}/
43
+ "#{source.split(/.#{extension}$/)[0]}_mobile.#{extension}"
44
+ else
45
+ "#{source}_mobile"
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,86 @@
1
+ module Mobylette
2
+ module Controllers
3
+
4
+ # Mobylette::Controllers::RespondToMobileRequests includes the respond_to_mobile_requests
5
+ # to your ActionController::Base.
6
+ #
7
+ # The respond_to_mobile_requests method enables the controller mobile handling
8
+ module RespondToMobileRequests
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ helper_method :is_mobile_request?
13
+
14
+ # List of mobile agents, from mobile_fu (https://github.com/brendanlim/mobile-fu)
15
+ MOBILE_USER_AGENTS = 'palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
16
+ 'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
17
+ 'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
18
+ 'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\\.b|' +
19
+ 'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
20
+ 'mobile'
21
+ end
22
+
23
+ module ClassMethods
24
+
25
+ # This method enables the controller do handle mobile requests
26
+ # You must add this to every controller you want to respond differently to mobile devices,
27
+ # or make it application wide calling it from the ApplicationController
28
+ #
29
+ # Options:
30
+ # * :fall_back => :html
31
+ # You may pass a fall_back option to the method, it will force the render
32
+ # to look for that other format, in case there is not a .mobile file for the view.
33
+ # By default, it will fall back to the format of the original request.
34
+ # If you don't want fall back at all, pass :fall_back => false
35
+ #
36
+ def respond_to_mobile_requests(options = {})
37
+ return if self.included_modules.include?(Mobylette::Controllers::RespondToMobileRequestsMethods)
38
+
39
+ cattr_accessor :fall_back_format
40
+ self.fall_back_format = options[:fall_back]
41
+
42
+ self.send(:include, Mobylette::Controllers::RespondToMobileRequestsMethods)
43
+ end
44
+ end
45
+
46
+ module InstanceMethods
47
+
48
+ private
49
+
50
+ # helper method to check if the current request if from a mobile device or not
51
+ def is_mobile_request?
52
+ return true if (request.format.to_s == "mobile") or (params[:format] == "mobile")
53
+ request.user_agent.to_s.downcase =~ /#{MOBILE_USER_AGENTS}/
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ # RespondToMobileRequestsMethods is included by respond_to_mobile_requests
60
+ # This will check if the request is from a mobile device and change
61
+ # the request format to :mobile
62
+ module RespondToMobileRequestsMethods
63
+ extend ActiveSupport::Concern
64
+
65
+ included do
66
+ before_filter :handle_mobile
67
+ end
68
+
69
+ module InstanceMethods
70
+ private
71
+
72
+ # Changes the request.form to :mobile, when the request is from
73
+ # a mobile device
74
+ def handle_mobile
75
+ if is_mobile_request?
76
+ original_format = request.format.to_sym
77
+ request.format = :mobile
78
+ if self.fall_back_format != false
79
+ request.formats << Mime::Type.new((self.fall_back_format if self.fall_back_format) || original_format)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,41 @@
1
+ module Mobylette
2
+ # Mobylette::Helmet provides helper methods to help you when testing your controllers
3
+ # for a mobile request.
4
+ #
5
+ # You must include Mobylette::Helmet into your test case, in the README there is more
6
+ # documentation about how to make this test wide.
7
+ module Helmet
8
+ extend ActiveSupport::Concern
9
+ autoload "Helpers", "mobylette/helmet/helpers"
10
+ autoload "Faker" , "mobylette/helmet/faker"
11
+
12
+ # Force the request for the user_agent
13
+ # Remember to add it BEFORE the request
14
+ #
15
+ # Example:
16
+ #
17
+ # it "should render the mobile_device view on mobile request" do
18
+ # force_mobile_request_agent("Android")
19
+ # get :index
20
+ # response.should render_template(:mobile_device)
21
+ # end
22
+ def force_mobile_request_agent(user_agent = "Android")
23
+ request.user_agent = user_agent
24
+ end
25
+
26
+ # Reset the user_aget to the default ("Rails Testing")
27
+ # Remember to add it BEFORE the request
28
+ #
29
+ # Example:
30
+ #
31
+ # it "should render the normal_view view on mobile request" do
32
+ # reset_test_request_agent
33
+ # get :index
34
+ # response.should render_template(:normal_view)
35
+ # end
36
+ def reset_test_request_agent
37
+ request.user_agent = "Rails Testing"
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ module Mobylette
2
+ module Helmet
3
+
4
+ # Forces the helper to think that all requests come
5
+ # from a mobile device
6
+ module Faker
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ cattr_accessor :is_mobile_request
11
+ end
12
+
13
+ def is_mobile_request?
14
+ is_mobile_request
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ module Mobylette
2
+ module Helmet
3
+ # This module is only for testing the view's helpers of the module
4
+ # it simulates the Helmet helpers and the controller methods
5
+ # that are necessary for the tests
6
+ module Helpers
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ cattr_accessor :user_agent
11
+ end
12
+
13
+
14
+ def force_mobile_request_agent
15
+ insert_faker
16
+ ActionController::Base.is_mobile_request = true
17
+ end
18
+
19
+ def reset_test_request_agent
20
+ insert_faker
21
+ ActionController::Base.is_mobile_request = false
22
+ end
23
+
24
+ private
25
+
26
+ def insert_faker
27
+ return if ActionController::Base.included_modules.include?(Mobylette::Helmet::Faker)
28
+ ActionController::Base.send(:include, Mobylette::Helmet::Faker)
29
+ end
30
+
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module Mobylette
2
+ class Railtie < ::Rails::Railtie
3
+ initializer :mobylette do
4
+ ActiveSupport.on_load(:action_controller) do
5
+ ::ActionController::Base.send(:include, Mobylette::Controllers::RespondToMobileRequests)
6
+ ::ActionController::Base.helper Mobylette::Controllers::Helpers
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Mobylette
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :mobylette do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActionController::Base do
4
+
5
+ it "ActionController::Base class should respond to the respond_to_mobile_requests" do
6
+ ActionController::Base.respond_to?(:respond_to_mobile_requests).should be_true
7
+ end
8
+
9
+ it "should have the :is_mobile_request? method" do
10
+ # works on ruby 1.9.2, but not on 1.8.7:
11
+ #@controller.private_methods.include?(:is_mobile_request?).should be_true
12
+
13
+ @controller.send(:is_mobile_request?).should be_nil
14
+ end
15
+
16
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe DefaultFallbackController do
4
+ render_views
5
+
6
+ it "should find the correct view when it exists" do
7
+ force_mobile_request_agent
8
+ get :index
9
+ response.should render_template(:index)
10
+ response.body.should contain("MOBILE VIEW")
11
+ end
12
+
13
+ it "should find the correct view when it exists" do
14
+ reset_test_request_agent
15
+ get :index
16
+ response.should render_template(:index)
17
+ response.body.should contain("HTML VIEW")
18
+ end
19
+
20
+
21
+ it "should fall back to the default request format when it doesnt" do
22
+ force_mobile_request_agent
23
+ get :test
24
+ response.should render_template(:test)
25
+ response.body.should contain("HTML VIEW")
26
+ end
27
+
28
+ it "should fall back to the default request format when it doesnt (js)" do
29
+ force_mobile_request_agent
30
+ get :test, :format => :js
31
+ response.should render_template(:test)
32
+ response.body.should contain("JS VIEW")
33
+ end
34
+
35
+
36
+ end