rails_amp 0.1.4

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 (104) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/Gemfile +14 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +370 -0
  6. data/Rakefile +23 -0
  7. data/gemfiles/Gemfile-rails.4.1.x +4 -0
  8. data/gemfiles/Gemfile-rails.4.2.x +4 -0
  9. data/lib/generators/rails_amp/install_generator.rb +23 -0
  10. data/lib/generators/rails_amp/templates/rails_amp.yml +39 -0
  11. data/lib/generators/rails_amp/templates/rails_amp_application.amp.erb +34 -0
  12. data/lib/rails_amp/config.rb +106 -0
  13. data/lib/rails_amp/overrider.rb +44 -0
  14. data/lib/rails_amp/railtie.rb +17 -0
  15. data/lib/rails_amp/version.rb +3 -0
  16. data/lib/rails_amp/view_helpers/action_view.rb +68 -0
  17. data/lib/rails_amp/view_helpers/image_tag_helper.rb +57 -0
  18. data/lib/rails_amp.rb +95 -0
  19. data/rails_amp.gemspec +23 -0
  20. data/spec/controllers/application_controller_spec.rb +142 -0
  21. data/spec/dummy/.rspec +2 -0
  22. data/spec/dummy/Rakefile +6 -0
  23. data/spec/dummy/app/assets/config/manifest.js +4 -0
  24. data/spec/dummy/app/assets/images/.keep +0 -0
  25. data/spec/dummy/app/assets/images/rails.png +0 -0
  26. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  27. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  28. data/spec/dummy/app/assets/javascripts/channels/.keep +0 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  31. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  33. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  34. data/spec/dummy/app/controllers/home_controller.rb +17 -0
  35. data/spec/dummy/app/controllers/users_controller.rb +25 -0
  36. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  37. data/spec/dummy/app/jobs/application_job.rb +2 -0
  38. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  39. data/spec/dummy/app/models/application_record.rb +3 -0
  40. data/spec/dummy/app/models/concerns/.keep +0 -0
  41. data/spec/dummy/app/models/user.rb +2 -0
  42. data/spec/dummy/app/views/home/_amp_info.html.erb +19 -0
  43. data/spec/dummy/app/views/home/about.html.erb +2 -0
  44. data/spec/dummy/app/views/home/help.html.erb +2 -0
  45. data/spec/dummy/app/views/home/index.html.erb +2 -0
  46. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  47. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  48. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  49. data/spec/dummy/app/views/layouts/rails_amp_application.amp.erb +34 -0
  50. data/spec/dummy/app/views/users/index.html.erb +11 -0
  51. data/spec/dummy/app/views/users/show.html.erb +7 -0
  52. data/spec/dummy/bin/bundle +3 -0
  53. data/spec/dummy/bin/rails +4 -0
  54. data/spec/dummy/bin/rake +4 -0
  55. data/spec/dummy/bin/setup +34 -0
  56. data/spec/dummy/bin/update +29 -0
  57. data/spec/dummy/config/application.rb +23 -0
  58. data/spec/dummy/config/boot.rb +5 -0
  59. data/spec/dummy/config/cable.yml +9 -0
  60. data/spec/dummy/config/database.yml +25 -0
  61. data/spec/dummy/config/environment.rb +5 -0
  62. data/spec/dummy/config/environments/development.rb +54 -0
  63. data/spec/dummy/config/environments/production.rb +86 -0
  64. data/spec/dummy/config/environments/test.rb +42 -0
  65. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  66. data/spec/dummy/config/initializers/assets.rb +11 -0
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  69. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  70. data/spec/dummy/config/initializers/inflections.rb +16 -0
  71. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  72. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  73. data/spec/dummy/config/initializers/session_store.rb +3 -0
  74. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  75. data/spec/dummy/config/locales/en.yml +23 -0
  76. data/spec/dummy/config/puma.rb +47 -0
  77. data/spec/dummy/config/rails_amp.yml +39 -0
  78. data/spec/dummy/config/routes.rb +10 -0
  79. data/spec/dummy/config/secrets.yml +22 -0
  80. data/spec/dummy/config/spring.rb +6 -0
  81. data/spec/dummy/config.ru +5 -0
  82. data/spec/dummy/db/migrate/20170130074559_create_users.rb +10 -0
  83. data/spec/dummy/db/schema.rb +22 -0
  84. data/spec/dummy/lib/assets/.keep +0 -0
  85. data/spec/dummy/log/.keep +0 -0
  86. data/spec/dummy/public/404.html +67 -0
  87. data/spec/dummy/public/422.html +67 -0
  88. data/spec/dummy/public/500.html +66 -0
  89. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  90. data/spec/dummy/public/apple-touch-icon.png +0 -0
  91. data/spec/dummy/public/favicon.ico +0 -0
  92. data/spec/rails_amp_spec.rb +242 -0
  93. data/spec/rails_helper.rb +66 -0
  94. data/spec/spec_helper.rb +99 -0
  95. data/spec/support/config/amp_format.yml +4 -0
  96. data/spec/support/config/controller_actions.yml +5 -0
  97. data/spec/support/config/controller_all.yml +3 -0
  98. data/spec/support/config/disable_all.yml +2 -0
  99. data/spec/support/config/enable_all.yml +3 -0
  100. data/spec/support/config/enable_analytics.yml +2 -0
  101. data/spec/support/config/various.yml +12 -0
  102. data/spec/utilities.rb +5 -0
  103. data/spec/view_helpers/action_view_spec.rb +37 -0
  104. metadata +287 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 41090d7cbfa0a001a9e1648ae23cd8597f10f571
4
+ data.tar.gz: 93b900a423f87244c74ac738b4cff363638858c8
5
+ SHA512:
6
+ metadata.gz: 42eeb0062a86bb316413c3fd9ab6ecef11ca34ba6d7f21fe4b47bfe6932f4db24dfa13ecfd3726f732ec4b3d05270ca4314675aede6fb529dc758037d2afeced
7
+ data.tar.gz: c08fe3e59be882193b4e9f6ba6b3be994aeb54607e34173dff1248294ca5a7f0e390348a0750c57e3813160b0a58d8cb1d2cced47a9318c4ac833e84949c0c3c
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ spec/dummy/db/*.sqlite3
5
+ spec/dummy/db/*.sqlite3-journal
6
+ spec/dummy/log/*.log
7
+ spec/dummy/tmp/
8
+ /vendor/bundle/
9
+ .DS_Store
10
+ *.gem
11
+ *.rbc
12
+ Gemfile.lock
13
+ gemfiles/*.lock
14
+ coverage
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Declare your gem's dependencies in rails_amp.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Declare any dependencies that are still in development here instead of in
9
+ # your gemspec. These might include edge Rails or gems from your path or
10
+ # Git. Remember to move these dependencies to your gemspec before releasing
11
+ # your gem to rubygems.org.
12
+
13
+ # To use a debugger
14
+ # gem 'byebug', group: [:development, :test]
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Takafumi Yamano
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.
data/README.md ADDED
@@ -0,0 +1,370 @@
1
+ # RailsAmp
2
+
3
+ RailsAmp is a Ruby on Rails plugin that makes it easy to build views for AMP(Accelerated Mobile Pages).
4
+
5
+ ## Supported Versions
6
+
7
+ Rails 4.1, 4.2, 5.0
8
+
9
+ ## Installation
10
+
11
+ In your Gemfile:
12
+
13
+ ```ruby
14
+ gem 'rails_amp'
15
+ ```
16
+
17
+ And install:
18
+
19
+ ```bash
20
+ $ bundle install
21
+ ```
22
+
23
+ And then, generate codes and files:
24
+
25
+ ```bash
26
+ $ rails generate rails_amp:install
27
+ ```
28
+
29
+ This step generates the followings.
30
+
31
+ ```bash
32
+ insert config/initializers/mime_types.rb
33
+ create config/rails_amp.yml
34
+ create app/views/layouts/rails_amp_application.amp.erb
35
+ ```
36
+
37
+ In config/initializers/mime_types.rb:
38
+
39
+ ```ruby
40
+ Mime::Type.register_alias 'text/html', RailsAmp.default_format
41
+ ```
42
+
43
+ This line must be added to make rails to recognize the amp format. The default format is :amp. You can change the value in config/rails_amp.yml
44
+
45
+ ## Configurations
46
+
47
+ You can change RailsAmp configurations in your `config/rails_amp.yml`. Write configs with yaml.
48
+
49
+ In config/rails_amp.yml:
50
+
51
+ ```yaml
52
+ # ### Here are some config samples to use rails_amp.
53
+
54
+ # --------------------------------------------------
55
+ # To enable amp on specific controllers and actions.
56
+ # --------------------------------------------------
57
+ # ### Enable amp on users all actions.
58
+ # targets:
59
+ # users:
60
+ #
61
+ # ### Enable amp on users#index, users#show, posts#index, posts#show.
62
+ # ### controller: action1 action2 action3 ...
63
+ # targets:
64
+ # users: index show
65
+ # posts: index show
66
+ #
67
+ # ### Enable amp on all controllers and actions.
68
+ # targets:
69
+ # application: all
70
+ #
71
+ # ### Disable amp completely.
72
+ # targets:
73
+ #
74
+ targets:
75
+ users: index show
76
+
77
+ # --------------------------------------------------
78
+ # To set initial configurations.
79
+ # --------------------------------------------------
80
+ # ### Enable Google Analytics page tracking. Set your Google Analytics Account.
81
+ # analytics: UA-*****-*
82
+ #
83
+ # ### Change default amp format. The default value is amp.
84
+ # ### If you want to use 'mobile' as amp format, set 'mobile' to default_format.
85
+ # ### And you can access the amp page like /users/index.mobile
86
+ # default_format: mobile
87
+ #
88
+ # ### Set formats that used as amp. The default is html.
89
+ # ### These formats are used in the order, when the amp specialized view like 'users/index.amp.erb' is not found.
90
+ # lookup_formats: html xhtml
91
+ ```
92
+
93
+ ### Examples
94
+
95
+ Set the controllers and actions that you want to enable amp.
96
+
97
+ Enable amp on users all actions except for new, create, edit, update, destroy actions.
98
+
99
+ ```yaml
100
+ targets:
101
+ users:
102
+ ```
103
+
104
+ Note that RailsAmp automatically excludes the post-method related actions `new, create, edit, update, destroy` that originally provided by Rails from the amp targets.
105
+
106
+ Enable amp on some specific controllers and actions. e.g.) users#index, users#show, posts#show.
107
+
108
+ ```yaml
109
+ targets:
110
+ users: index show
111
+ posts: show
112
+ ```
113
+
114
+ Enable amp on all controllers and actions. (It's a bit dangerous, so I don't recommend.)
115
+
116
+ ```yaml
117
+ targets:
118
+ application: all
119
+ ```
120
+
121
+ Disable amp completely.
122
+
123
+ ```yaml
124
+ targets:
125
+ ```
126
+
127
+ Other configurations.
128
+
129
+ Enable Google Analytics page tracking. Set your Google Analytics Account.
130
+
131
+ ```yaml
132
+ analytics: UA-*****-*
133
+ ```
134
+
135
+ Change the amp default format. The default value is 'amp'. If you want to use 'mobile' as the default format, set 'mobile' to default_format. And you can access the amp page like `http://example.com/users.mobile`.
136
+
137
+ ```yaml
138
+ default_format: mobile
139
+ ```
140
+
141
+ Change formats that used as amp. The default is html. These formats are used in the order, when the amp specialized view like `app/views/users/index.amp.erb` is not found.
142
+
143
+ ```yaml
144
+ lookup_formats: html xhtml
145
+ ```
146
+
147
+ Note that you need to restart a server to reload the configurations after changing config/rails_amp.yml.
148
+
149
+ ## Setup
150
+
151
+ Add the following code in your default layout head like `application.html.erb`.
152
+
153
+ In app/views/layouts/application.html.erb:
154
+
155
+ ```html
156
+ <%= rails_amp_amphtml_link_tag %>
157
+ ```
158
+
159
+ This code will put out the html header to inform where the amp url is.
160
+
161
+ ```html
162
+ <link rel="amphtml" href="http://example.com/users.amp" />
163
+ ```
164
+
165
+ ### AMP link for root_url(root_path)
166
+
167
+ When you enable amp on the controller and action for root_url, the helper `rails_amp_amphtml_link_tag` will put out the following amphtml link in the root url.
168
+
169
+ In your config/routes.rb:
170
+
171
+ ```ruby
172
+ root 'home#index'
173
+ ```
174
+
175
+ And, in config/rails_amp.yml:
176
+
177
+ ```yaml
178
+ targets:
179
+ home: index
180
+ ```
181
+
182
+ The helper `rails_amp_amphtml_link_tag` will put out the following in the root url.
183
+
184
+ In `http://example.com/`:
185
+
186
+ ```html
187
+ <link rel="amphtml" href="http://example.com/home/index.amp" />
188
+ ```
189
+
190
+ So, you need to add a routing for this amp url.
191
+
192
+ In your config/routes.rb:
193
+
194
+ ```ruby
195
+ get '/home/index', to: 'home#index'
196
+ ```
197
+
198
+
199
+ ## Customize AMP layout
200
+
201
+ In app/views/layouts/rails_amp_application.amp.erb:
202
+
203
+ ```html
204
+ <!doctype html>
205
+ <html amp>
206
+ <head>
207
+ <meta charset="utf-8">
208
+ <title>Rails AMP</title>
209
+ <link rel="canonical" href="<%= rails_amp_canonical_url %>" />
210
+ <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
211
+
212
+ <!-- Set page data type by JSON-LD and schema.org. -->
213
+ <!-- If you don't use page data type, remove this block. -->
214
+ <script type="application/ld+json">
215
+ {
216
+ "@context": "http://schema.org",
217
+ "@type": "*****",
218
+ "mainEntityOfPage": "*****",
219
+ "datePublished": "*****"
220
+ }
221
+ </script>
222
+
223
+ <!-- Write custom css sytle for amp html here. -->
224
+ <style amp-custom>
225
+ body {
226
+ }
227
+ amp-img {
228
+ }
229
+ </style>
230
+
231
+ <%= rails_amp_google_analytics_page_tracking %>
232
+ <%= rails_amp_html_header %>
233
+ </head>
234
+ <body>
235
+ <%= yield %>
236
+ </body>
237
+ </html>
238
+ ```
239
+
240
+ Customize the page data type by JSON-LD and schema.org, and write custom css styles in the `<style amp-custom>` block. You can customize any other parts of this amp layout file as you like, but you need to follow the amp restrictions.
241
+
242
+ ### Canonical link for root_url(root_path)
243
+
244
+ When you enable amp on the controller and action for root_url, the helper `rails_amp_canonical_url` will put out the following canonical link tag in the amp url for root_url.
245
+
246
+ In `http://example.com/home/index.amp`:
247
+
248
+ ```html
249
+ <link rel="canonical" href="http://example.com/home/index" />
250
+ ```
251
+
252
+ If you want to use the root_url as the canonical url, you should customize the codes.
253
+
254
+ ```html
255
+ <% if controller_name == 'home' && action_name == 'index' %>
256
+ <link rel="canonical" href="<%= root_url %>" />
257
+ <% else %>
258
+ <link rel="canonical" href="<%= rails_amp_canonical_url %>" />
259
+ <% end %>
260
+ ```
261
+
262
+ ## Usage
263
+
264
+ To access amp pages, add the amp default format at the end of the url before queries like the followings.
265
+
266
+ ```
267
+ http://example.com/users.amp
268
+ http://example.com/users.amp?sort=name
269
+ ```
270
+
271
+ If you change the amp default format, you have to use it as the format.
272
+
273
+ In your config/rails_amp.yml
274
+
275
+ ```yaml
276
+ default_format: mobile
277
+ ```
278
+
279
+ Access the amp pages.
280
+
281
+ ```
282
+ http://example.com/users.mobile
283
+ http://example.com/users.mobile?sort=name
284
+ ```
285
+
286
+ ### When not creating another view for amp. (When the template for amp not found)
287
+
288
+ If you don't create another view for amp (When the template for amp not found), RailsAmp tries to find amp-available formats accoding to the config `lookup_formats`, and uses the existing html view for the amp page as is.
289
+
290
+ e.g.) When you enable amp on `users#index` in config and don't create another amp view like `app/views/users/index.amp.erb`, RailsAmp uses the existing html view like `app/views/users/index.html.erb` for the amp page.
291
+
292
+ Then, you can access the amp page as `http://example.com/users.amp` by adding the amp default format at the end of the url before queries.
293
+
294
+ ### When creating another view for amp.
295
+
296
+ If you want to use specialized views for amp pages, you can create another view for amp like `app/views/users/index.amp.erb`. When accessing `http://example.com/users.amp`, the amp specialized view will be used.
297
+
298
+ If you change the amp default format, create the view template with the format.
299
+
300
+ In config/rails_amp.yml:
301
+
302
+ ```yaml
303
+ default_format: mobile
304
+ ```
305
+
306
+ Create the view template as `app/views/users/index.mobile.erb`, and access the amp page as `http://example.com/users.mobile`.
307
+
308
+ ### View Helpers
309
+
310
+ You can use a helper `amp_renderable?` in views. Use `amp_renderable?` in your existing html views to switch some codes. Here is a sample to switch codes for Twitter tweet display.
311
+
312
+ ```html
313
+ <% if amp_renderable? %>
314
+ <!-- For amp -->
315
+ <amp-twitter width=486 height=657
316
+ layout="responsive"
317
+ data-tweetid="*****"
318
+ data-cards="hidden">
319
+ <blockquote placeholder class="twitter-tweet" data-lang="en">*****</blockquote>
320
+ </amp-twitter>
321
+ <% else %>
322
+ <!-- For normal html -->
323
+ <blockquote class="twitter-tweet" data-lang="ja">*****</blockquote>
324
+ <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
325
+ <% end %>
326
+ ```
327
+
328
+ ## Supported AMP tags
329
+
330
+ RailsAmp supports a tag `<amp-img>` so far.
331
+
332
+ ### amp-img
333
+
334
+ You have to use the `<amp-img>` tag to render images in amp pages, instead of a normal html tag `<img>`. When you use a rails built-in helper `image_tag` in view templates, RailsAmp automatically renders images with the `<amp-img>` tag in amp format pages. Also, the helper `image_tag` renders images with the `<img>` tag in normal html format pages.
335
+
336
+ The `<amp-img>` tag requires `width` and `height` attributes. When the `image_tag` helper is used with a `size` or `width`, `height` option, the `<amp-img>` tag uses the option's value as its `width` and `height` attributes.
337
+
338
+ If the `image_tag` helper doesn't have a `size` or `width` or `height` option, RailsAmp computes the image size using FastImage. FastImage is a great gem to fetch the size and other information of an image quickly. If FastImage even cannot fetch the image size, the `<amp-img>` tag's width and height attributes are set to `300` and `300`.
339
+
340
+ So, for amp format pages, I recommend that you use the `image_tag` helper with a `size` or `width`, `height` option as much as possible.
341
+
342
+ ## Check AMP validation
343
+
344
+ In Google Chrome browser:
345
+
346
+ 1. Start the Developer Tools.
347
+ 1. Select the Console tab.
348
+ 1. Access the amp page with `#development=1` like `http://localhost:3000/users.amp#development=1`
349
+
350
+ If `AMP validation successful` shows, the amp page is valid. If some errors are detected, fix your existing html view using the `amp_renderable?` helper or create another amp specialized view.
351
+
352
+ ## References
353
+
354
+ [Accelerated Mobile Pages Project](https://www.ampproject.org/)
355
+
356
+ ## Contributing
357
+
358
+ 1. Fork it ( https://github.com/takafumir/rails_amp/fork )
359
+ 1. Create your feature branch (git checkout -b my-new-feature)
360
+ 1. Commit your changes (git commit -am 'Add some feature')
361
+ 1. Push to the branch (git push origin my-new-feature)
362
+ 1. Create a new Pull Request
363
+
364
+ ## License
365
+
366
+ The gem is available as open source under the terms of the [MIT License](https://github.com/takafumir/rails_amp/blob/master/MIT-LICENSE).
367
+
368
+ ## Author
369
+
370
+ [Takafumi Yamano](https://github.com/takafumir)
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'RailsAmp'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ require 'bundler/gem_tasks'
23
+
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'rails', '~> 4.1.0'
4
+ gemspec path: '../'
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+ gemspec path: '../'
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+
3
+ module RailsAmp
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ def inject_amp_mime_type_into_file
8
+ inject_into_file 'config/initializers/mime_types.rb',
9
+ after: %Q(# Mime::Type.register "text/richtext", :rtf\n) do <<-'RUBY'
10
+ Mime::Type.register_alias 'text/html', RailsAmp.default_format
11
+ RUBY
12
+ end
13
+ end
14
+
15
+ def create_config_file
16
+ copy_file 'rails_amp.yml', 'config/rails_amp.yml'
17
+ end
18
+
19
+ def create_application_layout
20
+ copy_file 'rails_amp_application.amp.erb', 'app/views/layouts/rails_amp_application.amp.erb'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ # ### Here are some config samples to use rails_amp.
2
+
3
+ # --------------------------------------------------
4
+ # To enable amp on specific controllers and actions.
5
+ # --------------------------------------------------
6
+ # ### Enable amp on users all actions.
7
+ # targets:
8
+ # users:
9
+ #
10
+ # ### Enable amp on users#index, users#show, posts#index, posts#show.
11
+ # ### controller: action1 action2 action3 ...
12
+ # targets:
13
+ # users: index show
14
+ # posts: index show
15
+ #
16
+ # ### Enable amp on all controllers and actions.
17
+ # targets:
18
+ # application: all
19
+ #
20
+ # ### Disable amp completely.
21
+ # targets:
22
+ #
23
+ targets:
24
+ users: index show
25
+
26
+ # --------------------------------------------------
27
+ # To set initial configurations.
28
+ # --------------------------------------------------
29
+ # ### Enable Google Analytics page tracking. Set your Google Analytics Account.
30
+ # analytics: UA-*****-*
31
+ #
32
+ # ### Change default amp format. The default value is amp.
33
+ # ### If you want to use 'mobile' as amp format, set 'mobile' to default_format.
34
+ # ### And you can access the amp page like /users/index.mobile
35
+ # default_format: mobile
36
+ #
37
+ # ### Set formats that used as amp. The default is html.
38
+ # ### These formats are used in the order, when the amp specialized view like 'users/index.amp.erb' is not found.
39
+ # lookup_formats: html xhtml
@@ -0,0 +1,34 @@
1
+ <!doctype html>
2
+ <html amp>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Rails AMP</title>
6
+ <link rel="canonical" href="<%= rails_amp_canonical_url %>" />
7
+ <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
8
+
9
+ <!-- Set page data type by JSON-LD and schema.org. -->
10
+ <!-- If you don't use page data type, remove this block. -->
11
+ <script type="application/ld+json">
12
+ {
13
+ "@context": "http://schema.org",
14
+ "@type": "*****",
15
+ "mainEntityOfPage": "*****",
16
+ "datePublished": "*****"
17
+ }
18
+ </script>
19
+
20
+ <!-- Write custom css sytle for amp html here. -->
21
+ <style amp-custom>
22
+ body {
23
+ }
24
+ amp-img {
25
+ }
26
+ </style>
27
+
28
+ <%= rails_amp_google_analytics_page_tracking %>
29
+ <%= rails_amp_html_header %>
30
+ </head>
31
+ <body>
32
+ <%= yield %>
33
+ </body>
34
+ </html>
@@ -0,0 +1,106 @@
1
+ module RailsAmp
2
+ class Config
3
+ # Return the current format, default is ''. The only configuration value that is not global.
4
+ def format
5
+ @format ||= ''
6
+ end
7
+
8
+ # Set the current format pseudo-globally, i.e. in the Thread.current hash.
9
+ def format=(format)
10
+ @format = format.to_s
11
+ end
12
+
13
+ # Return the config file path, default is "#{Rails.root}/config/rails_amp.yml".
14
+ def config_file
15
+ @@config_file ||= "#{Rails.root}/config/rails_amp.yml"
16
+ end
17
+
18
+ # Set the config file path.
19
+ def config_file=(config_file)
20
+ @@config_file = config_file
21
+ end
22
+
23
+ # Return the yaml loaded config, default is YAML.load_file(config_file).
24
+ def load_config
25
+ @@load_config ||= config_load_config
26
+ end
27
+
28
+ # Set the config by loading yaml.
29
+ def load_config=(load_config)
30
+ @@load_config = load_config
31
+ end
32
+
33
+ # Return the default amp format, default is :amp
34
+ def default_format
35
+ @@default_format ||= config_default_format
36
+ end
37
+
38
+ # Set the default amp format.
39
+ def default_format=(default_format)
40
+ @@default_format = default_format.to_sym
41
+ end
42
+
43
+ # Return the amp enabled controller actions.
44
+ def targets
45
+ @@targets ||= config_targets
46
+ end
47
+
48
+ # Set the amp enabled controller actions.
49
+ def targets=(targets)
50
+ @@targets = targets
51
+ end
52
+
53
+ # Return the analytics account, default is ''.
54
+ def analytics
55
+ @@analytics ||= config_analytics
56
+ end
57
+
58
+ # Set the analytics account.
59
+ def analytics=(analytics)
60
+ @@analytics = analytics
61
+ end
62
+
63
+ # Return the lookup_context formats for amp, default is [:html].
64
+ def lookup_formats
65
+ @@lookup_formats ||= config_lookup_formats
66
+ end
67
+
68
+ # Set the lookup_context formats for amp.
69
+ def lookup_formats=(lookup_formats)
70
+ @@lookup_formats = lookup_formats
71
+ end
72
+
73
+ private
74
+
75
+ def config_load_config
76
+ YAML.load_file(config_file)
77
+ end
78
+
79
+ def config_default_format
80
+ load_config['default_format'].try(:to_sym) || :amp
81
+ end
82
+
83
+ def config_targets
84
+ targets = load_config['targets']
85
+ return {} if targets.blank?
86
+
87
+ if targets.is_a?(Hash) && targets.has_key?('application')
88
+ return targets
89
+ end
90
+
91
+ if targets.is_a?(Hash)
92
+ return targets.map{ |k, v| [k, v.to_s.split(/\s+/)] }.to_h
93
+ end
94
+
95
+ {}
96
+ end
97
+
98
+ def config_analytics
99
+ load_config['analytics'] || ''
100
+ end
101
+
102
+ def config_lookup_formats
103
+ load_config['lookup_formats'].to_s.split(/\s+/).map(&:to_sym).presence || [:html]
104
+ end
105
+ end
106
+ end