js_from_routes 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +152 -0
  3. data/lib/js_from_routes.rb +7 -0
  4. data/lib/js_from_routes/generator.rb +142 -0
  5. data/lib/js_from_routes/railtie.rb +25 -0
  6. data/lib/js_from_routes/version.rb +6 -0
  7. data/spec/js_from_routes/js_from_routes_spec.rb +75 -0
  8. data/spec/spec_helper.rb +7 -0
  9. data/spec/support/sample_app/app/controllers/application_controller.rb +2 -0
  10. data/spec/support/sample_app/app/controllers/comments_controller.rb +2 -0
  11. data/spec/support/sample_app/app/controllers/user_preferences_controller.rb +2 -0
  12. data/spec/support/sample_app/app/controllers/video_clips_controller.rb +2 -0
  13. data/spec/support/sample_app/app/controllers/welcome_controller.rb +2 -0
  14. data/spec/support/sample_app/app/mailers/application_mailer.rb +4 -0
  15. data/spec/support/sample_app/config/application.rb +20 -0
  16. data/spec/support/sample_app/config/boot.rb +4 -0
  17. data/spec/support/sample_app/config/environment.rb +5 -0
  18. data/spec/support/sample_app/config/environments/development.rb +33 -0
  19. data/spec/support/sample_app/config/initializers/application_controller_renderer.rb +8 -0
  20. data/spec/support/sample_app/config/initializers/assets.rb +14 -0
  21. data/spec/support/sample_app/config/initializers/backtrace_silencers.rb +7 -0
  22. data/spec/support/sample_app/config/initializers/content_security_policy.rb +30 -0
  23. data/spec/support/sample_app/config/initializers/cookies_serializer.rb +5 -0
  24. data/spec/support/sample_app/config/initializers/filter_parameter_logging.rb +4 -0
  25. data/spec/support/sample_app/config/initializers/inflections.rb +16 -0
  26. data/spec/support/sample_app/config/initializers/mime_types.rb +4 -0
  27. data/spec/support/sample_app/config/initializers/wrap_parameters.rb +14 -0
  28. data/spec/support/sample_app/config/puma.rb +38 -0
  29. data/spec/support/sample_app/config/routes.rb +22 -0
  30. data/spec/support/sample_app/node_modules/node-sass/src/libsass/extconf.rb +6 -0
  31. metadata +141 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b404b3e7cc0394a4a79ecb225b36fbcf0f29d07391ee6df877cd068f1af438fb
4
+ data.tar.gz: 646668b779ea86c0aeee8327fba4355619ac2d72231e9053e4ec1569a3fc4293
5
+ SHA512:
6
+ metadata.gz: 8fd27cf2b1388f455c42a68b3ba892f9344e13cae2f46654e4ec0a9554c1d3e932366898ffdf1860027b0eec0a4be1112f7289d40f22a5426889ae4c16766d8c
7
+ data.tar.gz: ce4f56fd37aa81378d41633da4eb7b59486052115d4a9224e472d7f14330e62d39e14f5ef8d2ea8f7a2f8e03e9f6221419d6ee73a764145aac7a47b0030726b0
@@ -0,0 +1,152 @@
1
+ <h1 align="center">
2
+ JS From Rails Routes
3
+ <p align="center">
4
+ <a href="https://rubygems.org/gems/js_from_routes"><img alt="Gem Version" src="https://img.shields.io/gem/v/js_from_routes.svg?colorB=e9573f"/></a>
5
+ <a href="https://travis-ci.org/ElMassimo/js_from_routes"><img alt="Build Status" src="https://travis-ci.org/ElMassimo/js_from_routes.svg"/></a>
6
+ <a href="https://codeclimate.com/github/ElMassimo/js_from_routes"><img alt="Coverage Status" src="https://codeclimate.com/github/ElMassimo/request_store_rails/badges/coverage.svg"/></a>
7
+ <a href="https://codeclimate.com/github/ElMassimo/js_from_routes"><img alt="Code Quality" src="https://codeclimate.com/github/ElMassimo/js_from_routes/badges/gpa.svg"/></a>
8
+ <a href="http://inch-ci.org/github/ElMassimo/js_from_routes"><img alt="Inline docs" src="http://inch-ci.org/github/ElMassimo/js_from_routes.svg"/></a>
9
+ <a href="https://github.com/ElMassimo/js_from_routes/blob/master/LICENSE.txt"><img alt="License" src="https://img.shields.io/badge/license-MIT-428F7E.svg"/></a>
10
+ </p>
11
+ </h1>
12
+
13
+ _JS from Routes_ helps you by automatically generating path and API helpers from
14
+ Rails route definitions, allowing you to save development effort and focus on
15
+ the things that matter.
16
+
17
+ ## Why? 🤔
18
+
19
+ Path helpers in Rails are useful to ensure the constructed URLs match endpoints
20
+ defined in the app.
21
+
22
+ With this library, it's possible the enjoy the same benefits in JS:
23
+
24
+ - No need to manually specify the URL, preventing mistakes and saving development time.
25
+ - If an action is renamed or removed, the helper ceases to exist, which causes
26
+ an error that is easier to detect than a 404.
27
+ - We can embed the the HTTP verb in the helper. Changing the verb in the route causes the JS
28
+ code to be regenerated, no need to update the consumer!
29
+
30
+ ### Installation 💿
31
+
32
+ Add this line to your application's Gemfile:
33
+
34
+ ```ruby
35
+ gem 'js_from_routes'
36
+ ```
37
+
38
+ And then execute:
39
+
40
+ $ bundle
41
+
42
+ Or install it yourself as:
43
+
44
+ $ gem install js_from_routes
45
+
46
+ ### Usage 🚀
47
+
48
+ #### 1. Specify the Rails routes you want to export
49
+
50
+ Use the `export` attribute to determine which [routes](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/config/routes.rb#L6) should be taken into account when generating JS.
51
+
52
+ ```ruby
53
+ Rails.application.routes.draw do
54
+ resources :video_clips, export: true do
55
+ get :download, on: :member, export: :path_only
56
+ get :trending, on: :collection, export: false
57
+ end
58
+ end
59
+ ```
60
+
61
+ #### 2. Generate JS code from your routes
62
+
63
+ This is usually done automatically the next time you make a request to your
64
+ Rails server (such as when you refresh the page), which causes Rails reloader to
65
+ kick in, and the routes to be generated.
66
+
67
+ If you are not running a local development server, or prefer to do it manually,
68
+ you can use a rake task instead:
69
+
70
+ ```
71
+ bin/rake js_from_routes:generate
72
+ ```
73
+
74
+ #### 3. Use the generated code in your JS application
75
+
76
+ This can happen in many [different ways](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/Videos.vue#L10), but to illustrate using the example above:
77
+
78
+ ```js
79
+ import VideoClipsRequests from '@requests/VideoClipsRequests'
80
+
81
+ VideoClipsRequests.get({ id: 'oHg5SJYRHA0' }).then(displayVideo)
82
+
83
+ const path = VideoClipsRequests.downloadPath({ id })
84
+ ```
85
+
86
+ Check the [examples](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/Videos.vue) for ideas on how to [use it](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/Videos.vue), and how you can [configure](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/config/webpack/aliases.js#L11) Webpack to your convenience.
87
+
88
+ Read on to find out how to customize the generated code to suit your needs.
89
+
90
+ ### Advanced Configuration 📖
91
+
92
+ Since all projects are different, it's very unlikely that the default settings
93
+ fulfill all your requirements.
94
+
95
+ The following [settings](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L77-L80) are available:
96
+
97
+ ##### [`file_suffix`](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L77), default: `Requests.js`
98
+
99
+ This suffix is added by default to all generated files. You can modify it to
100
+ if you prefer a different convention.
101
+
102
+ ##### [`helper_mappings`](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L80)
103
+
104
+ By default it maps `index` to `list` and `show` to `get`, which helps to make
105
+ the JS code read more natural.
106
+
107
+ ##### [`output_folder`](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L78), default: `app/javascript/requests`
108
+
109
+ The directory where the generated files are created.
110
+
111
+ Tip: It's highly recommended to [add a webpack alias](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/config/webpack/aliases.js#L11), to simplify [imports](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/Videos.vue#2).
112
+
113
+ ##### [`template_path`](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L79)
114
+
115
+ A [default template](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/template.js.erb) is provided, but it makes assumptions about the [available](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/services/ApiService.js#L17) [code](https://github.com/ElMassimo/js_from_routes/blob/master/spec/support/sample_app/app/javascript/helpers/UrlHelper.js#L28).
116
+
117
+ You will probably want to use a custom template, such as:
118
+
119
+ ```ruby
120
+ # config/initializers/js_from_routes.rb
121
+ JsFromRoutes.config do |config|
122
+ config.template = Rails.root.join('app', 'views', 'custom_js_from_routes.js.erb')
123
+ end
124
+ ```
125
+
126
+ A `routes` variable will be available in the template, which will contain the
127
+ endpoints exported for a controller.
128
+
129
+ Each `route` exposes properties such as `verb` and `path`, please [check the
130
+ source code](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L34-L71) for details on the [API](https://github.com/ElMassimo/js_from_routes/blob/master/lib/js_from_routes/generator.rb#L34-L71).
131
+
132
+ ### How does it work? ⚙️
133
+
134
+ By adding a hook to Rails' reload process in development, it's possible to
135
+ automatically generate files from routes when a route is added, modified, or removed.
136
+
137
+ In order to optimize file generation, the generated JS files are split by
138
+ controller, and add a cache key based on the routes to avoid rewriting the file
139
+ if the route definition hasn't changed.
140
+
141
+ When the Webpack development server is running, it detects when a new file is
142
+ generated, automatically triggering a new build, which can now use the generated
143
+ request methods or path helpers 😃
144
+
145
+ ### Take this idea 💡
146
+
147
+ There are plenty of opportunities for automatic code generation, such as keeping
148
+ enums in sync between Ruby and JS.
149
+
150
+ Let me know if you come up with new or creative ways to use this technique 😃
151
+
152
+
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Splitting the generator file allows consumers to skip the Railtie if desired:
4
+ # - gem 'js_from_routes', require: false
5
+ # - require 'js_from_routes/generator'
6
+ require 'js_from_routes/generator'
7
+ require 'js_from_routes/railtie'
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+ require 'erubi'
5
+ require 'fileutils'
6
+
7
+ # Public: Automatically generates JS for Rails routes with { export: true }.
8
+ # Generates one file per controller, and one function per route.
9
+ module JsFromRoutes
10
+ # Internal: Helper class used as a presenter for the routes template.
11
+ class Routes
12
+ attr_reader :routes
13
+
14
+ def initialize(routes, config)
15
+ @config = config
16
+ @routes = routes
17
+ .uniq { |route| route.requirements.fetch(:action) }
18
+ .map { |route| Route.new(route, config.helper_mappings) }
19
+ end
20
+
21
+ # Public: Used to check whether the file should be generated again, changes
22
+ # based on the configuration, and route definition.
23
+ def cache_key
24
+ Digest::MD5.hexdigest(routes.map(&:inspect).join + [File.read(@config.template_path), @config.helper_mappings.inspect].join)
25
+ end
26
+
27
+ # Internal: By performing the evaluation here, we ensure only "routes" is
28
+ # exposed to the ERB template as a local variable.
29
+ def evaluate(compiled_template)
30
+ instance_eval(compiled_template)
31
+ end
32
+ end
33
+
34
+ # Internal: A presenter for an individual Rails action.
35
+ class Route
36
+ def initialize(route, mappings = {})
37
+ @route, @mappings = route, mappings
38
+ end
39
+
40
+ # Public: Whether it should export only the path.
41
+ def path_only?
42
+ @route.defaults[:export] == :path_only
43
+ end
44
+
45
+ # Public: Whether it should export only the path.
46
+ def request_method?
47
+ !path_only?
48
+ end
49
+
50
+ # Public: The HTTP verb for the action. Example: 'patch'
51
+ def verb
52
+ @route.verb.downcase
53
+ end
54
+
55
+ # Public: The path for the action. Example: '/users/:id/edit'
56
+ def path
57
+ @route.path.spec.to_s.chomp('(.:format)')
58
+ end
59
+
60
+ # Public: The name of the JS helper for the action. Example: 'destroyAll'
61
+ def helper
62
+ action = @route.requirements.fetch(:action).camelize(:lower)
63
+ name = @mappings.fetch(action, action)
64
+ path_only? ? "#{ name }Path" : name
65
+ end
66
+
67
+ # Internal: Useful as a cache key for the route, and for debugging purposes.
68
+ def inspect
69
+ "#{ verb } #{ helper } #{ path }"
70
+ end
71
+ end
72
+
73
+ class << self
74
+ # Public: Configuration of the code generator.
75
+ def config
76
+ @config ||= OpenStruct.new(
77
+ file_suffix: 'Requests.js',
78
+ output_folder: ::Rails.root&.join('app', 'javascript', 'requests'),
79
+ template_path: File.expand_path('template.js.erb', __dir__),
80
+ helper_mappings: { 'index' => 'list', 'show' => 'get' },
81
+ )
82
+ yield(@config) if block_given?
83
+ @config
84
+ end
85
+
86
+ # Public: Generates code for the specified routes with { export: true }.
87
+ def generate!(app_or_routes = Rails.application)
88
+ raise ArgumentError, 'A Rails app must be defined, or you must specify a custom `output_folder`' if config.output_folder.blank?
89
+ rails_routes = app_or_routes.is_a?(::Rails::Engine) ? app_or_routes.routes.routes : app_or_routes
90
+ @compiled_template = nil # Clear on every code reload in case the template changed.
91
+ exported_routes_by_controller(rails_routes).each do |controller, controller_routes|
92
+ routes = Routes.new(controller_routes, config)
93
+ write_if_changed(filename_for(controller), routes.cache_key) { render_template(routes) }
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ # Internal: Returns exported routes grouped by controller name.
100
+ def exported_routes_by_controller(routes)
101
+ routes.select { |route|
102
+ route.defaults.fetch(:export, false)
103
+ }.group_by { |route|
104
+ route.requirements.fetch(:controller)
105
+ }
106
+ end
107
+
108
+ # Internal: Name of the JS file with helpers for the the given controller.
109
+ def filename_for(controller)
110
+ config.output_folder.join("#{ controller.camelize }#{ config.file_suffix }".tr_s(':', '/'))
111
+ end
112
+
113
+ # Internal: Returns a String with the JS generated for a controller's routes.
114
+ def render_template(routes)
115
+ routes.evaluate(compiled_template)
116
+ end
117
+
118
+ # Internal: Returns the compiled ERB to generate JS from a set of routes.
119
+ def compiled_template
120
+ @compiled_template ||= begin
121
+ template = File.read(config.template_path)
122
+ Erubi::Engine.new(template, filename: config.template_path).src
123
+ end
124
+ end
125
+
126
+ # Internal: Writes if the file does not exist or the cache key has changed.
127
+ # The cache strategy consists of a comment on the first line of the file.
128
+ #
129
+ # Yields to receive the rendered file content when it needs to.
130
+ def write_if_changed(name, cache_key)
131
+ FileUtils.mkdir_p(name.dirname)
132
+ cache_key_comment = "// JsFromRoutes CacheKey #{ cache_key }\n"
133
+ File.open(name, 'a+') { |file|
134
+ if file.gets != cache_key_comment
135
+ file.truncate(0)
136
+ file.write(cache_key_comment)
137
+ file.write(yield)
138
+ end
139
+ }
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # NOTE: Not strictly required, but it helps to simplify the setup.
4
+ class JsFromRoutes::Railtie < Rails::Railtie
5
+ railtie_name :js_from_routes
6
+
7
+ if Rails.env.development?
8
+ # Allows to automatically trigger code generation after updating routes.
9
+ initializer 'js_from_routes.reloader' do |app|
10
+ app.config.to_prepare do
11
+ JsFromRoutes.generate!(app)
12
+ end
13
+ end
14
+ end
15
+
16
+ # Suitable when triggering code generation manually.
17
+ rake_tasks do |app|
18
+ namespace :js_from_routes do
19
+ desc 'Generates JavaScript files from Rails routes, one file per controller, and one function per route.'
20
+ task generate: :environment do
21
+ JsFromRoutes.generate!(app)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsFromRoutes
4
+ # Public: This library adheres to semantic versioning.
5
+ VERSION = '1.0.0'
6
+ end
@@ -0,0 +1,75 @@
1
+ require 'support/sample_app/config/application'
2
+ require 'support/sample_app/config/routes'
3
+
4
+
5
+ describe JsFromRoutes do
6
+ ORIGINAL_TEMPLATE_PATH = JsFromRoutes.config.template_path
7
+
8
+ let(:output_dir) { Pathname.new File.expand_path('../support/generated', __dir__) }
9
+ let(:sample_dir) { Rails.root.join('app', 'javascript', 'requests') }
10
+ let(:different_template_path) { File.expand_path('../support/different_template.js.erb', __dir__) }
11
+ let(:controllers_with_exported_routes) { %w[Comments UserPreferences VideoClips] }
12
+
13
+ def file_for(dir, name)
14
+ dir.join("#{ name }Requests.js")
15
+ end
16
+
17
+ def sample_file_for(name)
18
+ file_for(sample_dir, name)
19
+ end
20
+
21
+ def output_file_for(name)
22
+ file_for(output_dir, name)
23
+ end
24
+
25
+ before do
26
+ # Sanity checks
27
+ expect(sample_dir.exist?).to eq true
28
+ expect(Rails.application.routes.routes).to be_present
29
+
30
+ # Remove directory from a previous test run.
31
+ FileUtils.remove_dir(output_dir) rescue nil
32
+
33
+ # Change the configuration to use a different directory.
34
+ JsFromRoutes.config do |config|
35
+ config.output_folder = output_dir
36
+ config.template_path = ORIGINAL_TEMPLATE_PATH
37
+ end
38
+ end
39
+
40
+ # NOTE: We do a manual snapshot test for now, more tests coming in the future.
41
+ it 'should generate the files as expected' do
42
+ expect(JsFromRoutes).to receive(:render_template).exactly(3).times.and_call_original
43
+ JsFromRoutes.generate!
44
+
45
+ # It does not generate routes that don't have `export: true`.
46
+ expect(output_file_for('Welcome').exist?).to eq false
47
+
48
+ # It generates one file per controller with exported routes.
49
+ controllers_with_exported_routes.each do |file_name|
50
+ expect(output_file_for(file_name).read).to eq sample_file_for(file_name).read
51
+ end
52
+
53
+ # It detects changes to the template, and regenerates the files.
54
+ JsFromRoutes.config do |config|
55
+ config.template_path = different_template_path
56
+ end
57
+ expect(JsFromRoutes).to receive(:render_template).exactly(3).times.and_call_original
58
+ JsFromRoutes.generate!
59
+
60
+ # These files should no longer match the sample ones.
61
+ controllers_with_exported_routes.each do |file_name|
62
+ expect(output_file_for(file_name).read).not_to eq sample_file_for(file_name).read
63
+ end
64
+
65
+ # It should not rewrite the files if the cache key has not changed.
66
+ expect(JsFromRoutes).not_to receive(:render_template)
67
+ JsFromRoutes.generate!
68
+ end
69
+
70
+ it 'should have a rake task available' do
71
+ Rails.application.load_tasks
72
+ expect(JsFromRoutes).to receive(:render_template).exactly(3).times
73
+ expect { Rake::Task['js_from_routes:generate'].invoke }.not_to raise_error
74
+ end
75
+ end
@@ -0,0 +1,7 @@
1
+ require 'simplecov'
2
+ SimpleCov.start { add_filter '/spec/' }
3
+
4
+ require 'rails'
5
+ require 'js_from_routes'
6
+ require 'rspec/given'
7
+ require 'pry-byebug'
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class CommentsController < ApplicationController
2
+ end
@@ -0,0 +1,2 @@
1
+ class UserPreferencesController < ApplicationController
2
+ end
@@ -0,0 +1,2 @@
1
+ class VideoClipsController < ApplicationController
2
+ end
@@ -0,0 +1,2 @@
1
+ class WelcomeController < ApplicationController
2
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'boot'
2
+
3
+ require "action_controller/railtie"
4
+ require "sprockets/railtie"
5
+
6
+ # Require the gems listed in Gemfile, including any gems
7
+ # you've limited to :test, :development, or :production.
8
+ Bundler.require(*Rails.groups)
9
+
10
+ module SampleApp
11
+ class Application < Rails::Application
12
+ # Initialize configuration defaults for originally generated Rails version.
13
+ config.load_defaults 6.0
14
+
15
+ # Settings in config/environments/* take precedence over those specified here.
16
+ # Application configuration can go into files in config/initializers
17
+ # -- all .rb files in that directory are automatically loaded after loading
18
+ # the framework and any gems in your application.
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
2
+
3
+ require 'bundler/setup' # Set up gems listed in the Gemfile.
4
+ require 'bootsnap/setup' # Speed up boot time by caching expensive operations.
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative 'application'
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,33 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports.
13
+ config.consider_all_requests_local = true
14
+
15
+ # Store uploaded files on the local file system (see config/storage.yml for options).
16
+ # Print deprecation notices to the Rails logger.
17
+ config.active_support.deprecation = :log
18
+
19
+ # Debug mode disables concatenation and preprocessing of assets.
20
+ # This option may cause significant delays in view rendering with a large
21
+ # number of complex assets.
22
+ config.assets.debug = true
23
+
24
+ # Suppress logger output for asset requests.
25
+ config.assets.quiet = true
26
+
27
+ # Raises error for missing translations.
28
+ # config.action_view.raise_on_missing_translations = true
29
+
30
+ # Use an evented file watcher to asynchronously detect changes in source code,
31
+ # routes, locales, etc. This feature depends on the listen gem.
32
+ config.file_watcher = ActiveSupport::EventedFileUpdateChecker
33
+ end
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # ActiveSupport::Reloader.to_prepare do
4
+ # ApplicationController.renderer.defaults.merge!(
5
+ # http_host: 'example.org',
6
+ # https: false
7
+ # )
8
+ # end
@@ -0,0 +1,14 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Version of your assets, change this if you want to expire all your assets.
4
+ Rails.application.config.assets.version = '1.0'
5
+
6
+ # Add additional assets to the asset load path.
7
+ # Rails.application.config.assets.paths << Emoji.images_path
8
+ # Add Yarn node_modules folder to the asset load path.
9
+ Rails.application.config.assets.paths << Rails.root.join('node_modules')
10
+
11
+ # Precompile additional assets.
12
+ # application.js, application.css, and all non-JS/CSS in the app/assets
13
+ # folder are already added.
14
+ # Rails.application.config.assets.precompile += %w( admin.js admin.css )
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,30 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Define an application-wide content security policy
4
+ # For further information see the following documentation
5
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
6
+
7
+ # Rails.application.config.content_security_policy do |policy|
8
+ # policy.default_src :self, :https
9
+ # policy.font_src :self, :https, :data
10
+ # policy.img_src :self, :https, :data
11
+ # policy.object_src :none
12
+ # policy.script_src :self, :https
13
+ # policy.style_src :self, :https
14
+ # # If you are using webpack-dev-server then specify webpack-dev-server host
15
+ # policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
16
+
17
+ # # Specify URI for violation reports
18
+ # # policy.report_uri "/csp-violation-report-endpoint"
19
+ # end
20
+
21
+ # If you are using UJS then enable automatic nonce generation
22
+ # Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
23
+
24
+ # Set the nonce only to specific directives
25
+ # Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
26
+
27
+ # Report CSP violations to a specified URI
28
+ # For further information see the following documentation:
29
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
30
+ # Rails.application.config.content_security_policy_report_only = true
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Specify a serializer for the signed and encrypted cookie jars.
4
+ # Valid options are :json, :marshal, and :hybrid.
5
+ Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Configure sensitive parameters which will be filtered from the log file.
4
+ Rails.application.config.filter_parameters += [:password]
@@ -0,0 +1,16 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format. Inflections
4
+ # are locale specific, and you may define rules for as many different
5
+ # locales as you wish. All of these examples are active by default:
6
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
7
+ # inflect.plural /^(ox)$/i, '\1en'
8
+ # inflect.singular /^(ox)en/i, '\1'
9
+ # inflect.irregular 'person', 'people'
10
+ # inflect.uncountable %w( fish sheep )
11
+ # end
12
+
13
+ # These inflection rules are supported but not enabled by default:
14
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
15
+ # inflect.acronym 'RESTful'
16
+ # end
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
@@ -0,0 +1,14 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # This file contains settings for ActionController::ParamsWrapper which
4
+ # is enabled by default.
5
+
6
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters format: [:json]
9
+ end
10
+
11
+ # To enable root element in JSON for ActiveRecord objects.
12
+ # ActiveSupport.on_load(:active_record) do
13
+ # self.include_root_in_json = true
14
+ # end
@@ -0,0 +1,38 @@
1
+ # Puma can serve each request in a thread from an internal thread pool.
2
+ # The `threads` method setting takes two numbers: a minimum and maximum.
3
+ # Any libraries that use thread pools should be configured to match
4
+ # the maximum value specified for Puma. Default is set to 5 threads for minimum
5
+ # and maximum; this matches the default thread size of Active Record.
6
+ #
7
+ max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
8
+ min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
9
+ threads min_threads_count, max_threads_count
10
+
11
+ # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
12
+ #
13
+ port ENV.fetch("PORT") { 3000 }
14
+
15
+ # Specifies the `environment` that Puma will run in.
16
+ #
17
+ environment ENV.fetch("RAILS_ENV") { "development" }
18
+
19
+ # Specifies the `pidfile` that Puma will use.
20
+ pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
21
+
22
+ # Specifies the number of `workers` to boot in clustered mode.
23
+ # Workers are forked web server processes. If using threads and workers together
24
+ # the concurrency of the application would be max `threads` * `workers`.
25
+ # Workers do not work on JRuby or Windows (both of which do not support
26
+ # processes).
27
+ #
28
+ # workers ENV.fetch("WEB_CONCURRENCY") { 2 }
29
+
30
+ # Use the `preload_app!` method when specifying a `workers` number.
31
+ # This directive tells Puma to first boot the application and load code
32
+ # before forking the application. This takes advantage of Copy On Write
33
+ # process behavior so workers use less memory.
34
+ #
35
+ # preload_app!
36
+
37
+ # Allow puma to be restarted by `rails restart` command.
38
+ plugin :tmp_restart
@@ -0,0 +1,22 @@
1
+ Rails.application.routes.draw do
2
+ root to: 'welcome#home'
3
+
4
+ resources :welcome
5
+
6
+ resources :video_clips, only: [:new, :edit, :create, :update, :destroy], export: true do
7
+ get :download, on: :member, export: :path_only
8
+ patch :add_to_playlist, on: :member
9
+ patch :remove_from_playlist, on: :member
10
+ get :trending, on: :collection
11
+ get '/thumbnail/:thumbnail_id', as: :thumbnail, action: :thumbnail, on: :member
12
+
13
+ resources :comments, only: [:show, :index], shallow: true, export: true
14
+ end
15
+
16
+ resources :user_preferences, only: [], export: true do
17
+ patch :switch_to_classic_navbar, on: :collection
18
+ get :switch_to_beta_navbar, on: :collection, export: false
19
+ get '/switch_to_classic/:page', action: :switch_to_classic, on: :collection, export: :path_only
20
+ get '/switch_to_beta/:page', action: :switch_to_beta, on: :collection, as: :switch_to_beta_page, export: :path_only
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+ # .. more stuff
3
+ #$LIBPATH.push(Config::CONFIG['libdir'])
4
+ $CFLAGS << " #{ENV["CFLAGS"]}"
5
+ $LIBS << " #{ENV["LIBS"]}"
6
+ create_makefile("libsass")
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: js_from_routes
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Máximo Mussini
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: js_from_routes helps you by automatically generating path and API helpers
56
+ from Rails route definitions, allowing you to save development effort and focus
57
+ on the things that matter.
58
+ email:
59
+ - maximomussini@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files:
63
+ - README.md
64
+ files:
65
+ - README.md
66
+ - lib/js_from_routes.rb
67
+ - lib/js_from_routes/generator.rb
68
+ - lib/js_from_routes/railtie.rb
69
+ - lib/js_from_routes/version.rb
70
+ - spec/js_from_routes/js_from_routes_spec.rb
71
+ - spec/spec_helper.rb
72
+ - spec/support/sample_app/app/controllers/application_controller.rb
73
+ - spec/support/sample_app/app/controllers/comments_controller.rb
74
+ - spec/support/sample_app/app/controllers/user_preferences_controller.rb
75
+ - spec/support/sample_app/app/controllers/video_clips_controller.rb
76
+ - spec/support/sample_app/app/controllers/welcome_controller.rb
77
+ - spec/support/sample_app/app/mailers/application_mailer.rb
78
+ - spec/support/sample_app/config/application.rb
79
+ - spec/support/sample_app/config/boot.rb
80
+ - spec/support/sample_app/config/environment.rb
81
+ - spec/support/sample_app/config/environments/development.rb
82
+ - spec/support/sample_app/config/initializers/application_controller_renderer.rb
83
+ - spec/support/sample_app/config/initializers/assets.rb
84
+ - spec/support/sample_app/config/initializers/backtrace_silencers.rb
85
+ - spec/support/sample_app/config/initializers/content_security_policy.rb
86
+ - spec/support/sample_app/config/initializers/cookies_serializer.rb
87
+ - spec/support/sample_app/config/initializers/filter_parameter_logging.rb
88
+ - spec/support/sample_app/config/initializers/inflections.rb
89
+ - spec/support/sample_app/config/initializers/mime_types.rb
90
+ - spec/support/sample_app/config/initializers/wrap_parameters.rb
91
+ - spec/support/sample_app/config/puma.rb
92
+ - spec/support/sample_app/config/routes.rb
93
+ - spec/support/sample_app/node_modules/node-sass/src/libsass/extconf.rb
94
+ homepage: https://github.com/ElMassimo/js_from_routes
95
+ licenses:
96
+ - MIT
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubygems_version: 3.1.2
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Generate JS automatically from Rails routes.
117
+ test_files:
118
+ - spec/spec_helper.rb
119
+ - spec/js_from_routes/js_from_routes_spec.rb
120
+ - spec/support/sample_app/app/mailers/application_mailer.rb
121
+ - spec/support/sample_app/app/controllers/video_clips_controller.rb
122
+ - spec/support/sample_app/app/controllers/application_controller.rb
123
+ - spec/support/sample_app/app/controllers/comments_controller.rb
124
+ - spec/support/sample_app/app/controllers/welcome_controller.rb
125
+ - spec/support/sample_app/app/controllers/user_preferences_controller.rb
126
+ - spec/support/sample_app/config/routes.rb
127
+ - spec/support/sample_app/config/environments/development.rb
128
+ - spec/support/sample_app/config/environment.rb
129
+ - spec/support/sample_app/config/application.rb
130
+ - spec/support/sample_app/config/puma.rb
131
+ - spec/support/sample_app/config/boot.rb
132
+ - spec/support/sample_app/config/initializers/application_controller_renderer.rb
133
+ - spec/support/sample_app/config/initializers/backtrace_silencers.rb
134
+ - spec/support/sample_app/config/initializers/mime_types.rb
135
+ - spec/support/sample_app/config/initializers/filter_parameter_logging.rb
136
+ - spec/support/sample_app/config/initializers/wrap_parameters.rb
137
+ - spec/support/sample_app/config/initializers/assets.rb
138
+ - spec/support/sample_app/config/initializers/cookies_serializer.rb
139
+ - spec/support/sample_app/config/initializers/content_security_policy.rb
140
+ - spec/support/sample_app/config/initializers/inflections.rb
141
+ - spec/support/sample_app/node_modules/node-sass/src/libsass/extconf.rb