rails-dev-tweaks-arturo 0.6.2
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.
- data/MIT-LICENSE +14 -0
- data/README.md +134 -0
- data/Rakefile +1 -0
- data/lib/rails-dev-tweaks.rb +13 -0
- data/lib/rails_dev_tweaks/configuration.rb +87 -0
- data/lib/rails_dev_tweaks/granular_autoload/matchers/all_matcher.rb +7 -0
- data/lib/rails_dev_tweaks/granular_autoload/matchers/asset_matcher.rb +46 -0
- data/lib/rails_dev_tweaks/granular_autoload/matchers/forced_matcher.rb +7 -0
- data/lib/rails_dev_tweaks/granular_autoload/matchers/path_matcher.rb +11 -0
- data/lib/rails_dev_tweaks/granular_autoload/matchers/xhr_matcher.rb +7 -0
- data/lib/rails_dev_tweaks/granular_autoload/middleware.rb +48 -0
- data/lib/rails_dev_tweaks/railtie.rb +13 -0
- data/lib/rails_dev_tweaks/version.rb +3 -0
- metadata +91 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Copyright (c) 2011 Wavii, inc. http://wavii.com/
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
4
|
+
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
5
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
6
|
+
persons to whom the Software is furnished to do so, subject to the following conditions:
|
7
|
+
|
8
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
9
|
+
Software.
|
10
|
+
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
12
|
+
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
13
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
14
|
+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
rails-dev-tweaks
|
2
|
+
================
|
3
|
+
|
4
|
+
A collection of tweaks to improve your Rails (3.1+) development experience.
|
5
|
+
|
6
|
+
To install, simply add it to your gemfile:
|
7
|
+
|
8
|
+
gem 'rails-dev-tweaks', '~> 0.6.2'
|
9
|
+
|
10
|
+
And review the following section to make sure that `rails-dev-tweaks` is
|
11
|
+
configured the way you expect:
|
12
|
+
|
13
|
+
|
14
|
+
Intended Usage (and Caveats)
|
15
|
+
----------------------------
|
16
|
+
|
17
|
+
This gem is intended to provide a default configuration that covers most rails
|
18
|
+
apps:
|
19
|
+
|
20
|
+
* _All_ asset requests _will not_ reload your app's code. This is probably only
|
21
|
+
a problem if you are using custom sass functions, or otherwise referencing
|
22
|
+
your app from within assets.
|
23
|
+
|
24
|
+
* XHR requests **will reload** your app's code. (This was not the case in prior
|
25
|
+
versions of `rails-dev-tweaks`)
|
26
|
+
|
27
|
+
If any of these points don't work out for you, don't fret! You can override the
|
28
|
+
defaults with some simple configuration tweaks to your environment. Read on:
|
29
|
+
|
30
|
+
|
31
|
+
Granular Autoload
|
32
|
+
=================
|
33
|
+
|
34
|
+
You can specify autoload rules for your app via a configuration block in your
|
35
|
+
application or environment configuration. These rules are specified via
|
36
|
+
exclusion (`skip`) and inclusion (`keep`). Rules defined later override those
|
37
|
+
defined before.
|
38
|
+
|
39
|
+
config.dev_tweaks.autoload_rules do
|
40
|
+
# You can used named matchers (see below). This particular matcher
|
41
|
+
# effectively clears any default matchers
|
42
|
+
keep :all
|
43
|
+
|
44
|
+
# Exclude all requests that begin with /search
|
45
|
+
skip '/search'
|
46
|
+
# But include routes that include smerch
|
47
|
+
keep /smerch/
|
48
|
+
|
49
|
+
# Use a block if you want to inspect the request
|
50
|
+
skip {|request| request.post?}
|
51
|
+
end
|
52
|
+
|
53
|
+
The default autoload rules should cover most development patterns:
|
54
|
+
|
55
|
+
config.dev_tweaks.autoload_rules do
|
56
|
+
keep :all
|
57
|
+
|
58
|
+
skip '/favicon.ico'
|
59
|
+
skip :assets
|
60
|
+
skip :xhr
|
61
|
+
keep :forced
|
62
|
+
end
|
63
|
+
|
64
|
+
By default, every request that skips the autoload hooks will generate an
|
65
|
+
additional log line saying so in an effort to be transparent about what is going
|
66
|
+
on. If you prefer, you can disable that log message to keep things a bit more
|
67
|
+
tidy in your logs:
|
68
|
+
|
69
|
+
config.dev_tweaks.log_autoload_notice = false
|
70
|
+
|
71
|
+
|
72
|
+
Named Matchers
|
73
|
+
--------------
|
74
|
+
|
75
|
+
Named matchers are classes defined under
|
76
|
+
RailsDevTweaks::GranularAutoload::Matchers:: and simply define a call method
|
77
|
+
that is given a ActionDispatch::Request and returns true/false on whether that
|
78
|
+
request matches. Match names are converted into a module name via
|
79
|
+
"#{name.to\_s.classify}Matcher". E.g. :assets will specify
|
80
|
+
`RailsDevTweaks::GranularAutoload::Matchers::AssetMatcher`.
|
81
|
+
|
82
|
+
Any additional arguments given to a `skip` or `keep` call will be passed as
|
83
|
+
initializer arguments to the matcher.
|
84
|
+
|
85
|
+
|
86
|
+
### :all
|
87
|
+
|
88
|
+
Matches every request passed to it.
|
89
|
+
|
90
|
+
|
91
|
+
### :assets
|
92
|
+
|
93
|
+
Rails 3.1 integrated [Sprockets](http://getsprockets.org/) as its asset
|
94
|
+
packager. Unfortunately, since the asset packager is mounted using the
|
95
|
+
traditional Rails dispatching infrastructure, it's hidden behind the Rails
|
96
|
+
autoloader (unloader). This matcher will match any requests that are routed to
|
97
|
+
Sprockets (specifically any mounted Sprockets::Base instance).
|
98
|
+
|
99
|
+
|
100
|
+
### :forced
|
101
|
+
|
102
|
+
To aid in live-debugging when you need to, this matcher will match any request
|
103
|
+
that has `force_autoload` set as a parameter (GET or POST), or that has the
|
104
|
+
`Force-Autoload` header set to something.
|
105
|
+
|
106
|
+
If you are live-debugging jQuery ajax requests, this helpful snippet will turn
|
107
|
+
on forced autoloading for the remainder of the browser's session:
|
108
|
+
|
109
|
+
$.ajaxSetup({"beforeSend": function(xhr) {xhr.setRequestHeader("Force-Autoload", "true")} })
|
110
|
+
|
111
|
+
|
112
|
+
### :path
|
113
|
+
|
114
|
+
Matches the path of the request via a regular expression.
|
115
|
+
|
116
|
+
keep :path, /thing/ # Match any request with "thing" in the path.
|
117
|
+
|
118
|
+
Note that `keep '/stuff'` is just shorthand for `keep :path, /^\/stuff/`.
|
119
|
+
Similarly, `keep /thing/` is shorthand for `keep :path, /thing/`
|
120
|
+
|
121
|
+
|
122
|
+
### :xhr
|
123
|
+
|
124
|
+
Matches any XHR request (via request.xhr?). The assumption here is that you
|
125
|
+
generally don't live-debug your XHR requests, and are instead refreshing the
|
126
|
+
page that kicks them off before running against new response code.
|
127
|
+
|
128
|
+
|
129
|
+
License
|
130
|
+
=======
|
131
|
+
|
132
|
+
`rails-dev-tweaks` is MIT licensed by Wavii, Inc. http://wavii.com
|
133
|
+
|
134
|
+
See the accompanying file, `MIT-LICENSE`, for the full text.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/dependencies'
|
3
|
+
|
4
|
+
module RailsDevTweaks
|
5
|
+
LIB_PATH = File.expand_path('..', __FILE__)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Ironically, we use autoloading ourselves to enforce our file structure, and less typing.
|
9
|
+
ActiveSupport::Dependencies.autoload_paths << RailsDevTweaks::LIB_PATH
|
10
|
+
ActiveSupport::Dependencies.autoload_once_paths << RailsDevTweaks::LIB_PATH # But don't allow *auto-reloading*!
|
11
|
+
|
12
|
+
# Reference the railtie to force it to load
|
13
|
+
RailsDevTweaks::Railtie
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class RailsDevTweaks::Configuration
|
2
|
+
|
3
|
+
# By default, we log a notice on each request that has its to_prepare hooks skipped, you can
|
4
|
+
# disable that if you choose!
|
5
|
+
attr_accessor :log_autoload_notice
|
6
|
+
|
7
|
+
attr_reader :granular_autoload_config
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@log_autoload_notice = true
|
11
|
+
|
12
|
+
@granular_autoload_config = GranularAutoloadConfiguration.new
|
13
|
+
|
14
|
+
# And set our defaults
|
15
|
+
self.autoload_rules do
|
16
|
+
keep :all
|
17
|
+
|
18
|
+
skip '/favicon.ico'
|
19
|
+
skip :assets
|
20
|
+
keep :forced
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Takes a block that configures the granular autoloader's rules.
|
25
|
+
def autoload_rules(&block)
|
26
|
+
@granular_autoload_config.instance_eval(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
class GranularAutoloadConfiguration
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
# Each rule is a simple pair: [:skip, callable], [:keep, callable], etc.
|
33
|
+
@rules = []
|
34
|
+
end
|
35
|
+
|
36
|
+
def keep(*args, &block)
|
37
|
+
self.append_rule(:keep, *args, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
def skip(*args, &block)
|
41
|
+
self.append_rule(:skip, *args, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def append_rule(rule_type, *args, &block)
|
45
|
+
unless rule_type == :skip || rule_type == :keep
|
46
|
+
raise TypeError, "Rule must be :skip or :keep. Got: #{rule_type.inspect}"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Simple matcher blocks
|
50
|
+
if args.size == 0 && block.present?
|
51
|
+
@rules.unshift [rule_type, block]
|
52
|
+
return self
|
53
|
+
end
|
54
|
+
|
55
|
+
# String match shorthand
|
56
|
+
args[0] = /^#{args[0]}/ if args.size == 1 && args[0].kind_of?(String)
|
57
|
+
|
58
|
+
# Regex match shorthand
|
59
|
+
args = [:path, args[0]] if args.size == 1 && args[0].kind_of?(Regexp)
|
60
|
+
|
61
|
+
if args.size == 0 && block.blank?
|
62
|
+
raise TypeError, 'Cannot process autoload rule as specified. Expecting a named matcher (symbol), path prefix (string) or block'
|
63
|
+
end
|
64
|
+
|
65
|
+
# Named matcher
|
66
|
+
matcher_class = "RailsDevTweaks::GranularAutoload::Matchers::#{args[0].to_s.classify}Matcher".constantize
|
67
|
+
matcher = matcher_class.new(*args[1..-1])
|
68
|
+
raise TypeError, "Matchers must respond to :call. #{matcher.inspect} does not." unless matcher.respond_to? :call
|
69
|
+
|
70
|
+
@rules.unshift [rule_type, matcher]
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def should_reload?(request)
|
76
|
+
@rules.each do |rule_type, callable|
|
77
|
+
return rule_type == :keep if callable.call(request)
|
78
|
+
end
|
79
|
+
|
80
|
+
# We default to reloading to preserve behavior, but we should never get to this unless the configuration is
|
81
|
+
# all sorts of horked.
|
82
|
+
true
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class RailsDevTweaks::GranularAutoload::Matchers::AssetMatcher
|
2
|
+
|
3
|
+
def call(request)
|
4
|
+
route_engine = request.headers['action_dispatch.routes']
|
5
|
+
|
6
|
+
if route_engine.respond_to?(:router)
|
7
|
+
mounted_app = journey_find_app(route_engine.router, request)
|
8
|
+
else
|
9
|
+
mounted_app = rack_find_app(route_engine.set.dup, request)
|
10
|
+
end
|
11
|
+
|
12
|
+
# What do we have?
|
13
|
+
mounted_app.is_a? Sprockets::Base
|
14
|
+
end
|
15
|
+
|
16
|
+
def journey_find_app(router, request)
|
17
|
+
router.recognize(request) do |route, *args|
|
18
|
+
return route.app
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def rack_find_app(router, request)
|
23
|
+
main_mount = router.recognize(request)
|
24
|
+
|
25
|
+
# Unwind until we have an actual app
|
26
|
+
while main_mount != nil
|
27
|
+
if main_mount.is_a? Array
|
28
|
+
main_mount = main_mount.first
|
29
|
+
|
30
|
+
elsif main_mount.is_a? Rack::Mount::Route
|
31
|
+
main_mount = main_mount.app
|
32
|
+
|
33
|
+
elsif main_mount.is_a? Rack::Mount::Prefix
|
34
|
+
# Bah, no accessor here
|
35
|
+
main_mount = main_mount.instance_variable_get(:@app)
|
36
|
+
|
37
|
+
# Well, we got something
|
38
|
+
else
|
39
|
+
break
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
main_mount
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Here's an idea, let's not reload the entire dev environment for each asset request. Let's only do that on regular
|
2
|
+
# content requests.
|
3
|
+
class RailsDevTweaks::GranularAutoload::Middleware
|
4
|
+
|
5
|
+
# Don't cleanup before the very first request
|
6
|
+
class << self
|
7
|
+
attr_writer :processed_a_request
|
8
|
+
def processed_a_request?
|
9
|
+
@processed_a_request
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(app)
|
14
|
+
@app = app
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
request = ActionDispatch::Request.new(env.dup)
|
19
|
+
|
20
|
+
# reload, or no?
|
21
|
+
if Rails.application.config.dev_tweaks.granular_autoload_config.should_reload?(request)
|
22
|
+
# Confusingly, we flip the request prepare/cleanup life cycle around so that we're only cleaning up on those
|
23
|
+
# requests that want to be reloaded
|
24
|
+
|
25
|
+
# No-op if this is the first request. The initializers take care of that one.
|
26
|
+
if self.class.processed_a_request? && reload_dependencies?
|
27
|
+
ActionDispatch::Reloader.cleanup!
|
28
|
+
ActionDispatch::Reloader.prepare!
|
29
|
+
end
|
30
|
+
self.class.processed_a_request = true
|
31
|
+
|
32
|
+
elsif Rails.application.config.dev_tweaks.log_autoload_notice
|
33
|
+
Rails.logger.info 'RailsDevTweaks: Skipping ActionDispatch::Reloader hooks for this request.'
|
34
|
+
end
|
35
|
+
|
36
|
+
return @app.call(env)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def reload_dependencies?
|
42
|
+
application = Rails.application
|
43
|
+
|
44
|
+
# Rails 3.2 defines reload_dependencies? and it only reloads if reload_dependencies? returns true.
|
45
|
+
(!application.class.method_defined?(:reload_dependencies?) ||
|
46
|
+
application.send(:reload_dependencies?))
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class RailsDevTweaks::Railtie < Rails::Railtie
|
2
|
+
|
3
|
+
config.dev_tweaks = RailsDevTweaks::Configuration.new
|
4
|
+
|
5
|
+
config.before_initialize do |app|
|
6
|
+
# We can't inspect the stack because it's deferred... For now, just assume we have it when config.cache_clasess is
|
7
|
+
# falsy; which should always be the case in the current version of rails anyway.
|
8
|
+
unless app.config.cache_classes
|
9
|
+
app.config.middleware.swap ActionDispatch::Reloader, RailsDevTweaks::GranularAutoload::Middleware
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-dev-tweaks-arturo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Wavii, Inc.
|
9
|
+
- Arturo Pie
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-10-25 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: railties
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '3'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: actionpack
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '3'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3'
|
47
|
+
description: A collection of tweaks to improve your Rails (3.1+) development experience.
|
48
|
+
email:
|
49
|
+
- info@wavii.com
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- lib/rails-dev-tweaks.rb
|
55
|
+
- lib/rails_dev_tweaks/version.rb
|
56
|
+
- lib/rails_dev_tweaks/railtie.rb
|
57
|
+
- lib/rails_dev_tweaks/configuration.rb
|
58
|
+
- lib/rails_dev_tweaks/granular_autoload/middleware.rb
|
59
|
+
- lib/rails_dev_tweaks/granular_autoload/matchers/all_matcher.rb
|
60
|
+
- lib/rails_dev_tweaks/granular_autoload/matchers/xhr_matcher.rb
|
61
|
+
- lib/rails_dev_tweaks/granular_autoload/matchers/forced_matcher.rb
|
62
|
+
- lib/rails_dev_tweaks/granular_autoload/matchers/path_matcher.rb
|
63
|
+
- lib/rails_dev_tweaks/granular_autoload/matchers/asset_matcher.rb
|
64
|
+
- MIT-LICENSE
|
65
|
+
- Rakefile
|
66
|
+
- README.md
|
67
|
+
homepage: http://wavii.com/
|
68
|
+
licenses: []
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project: rails-dev-tweaks
|
87
|
+
rubygems_version: 1.8.24
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: A collection of tweaks to improve your Rails (3.1+) development experience.
|
91
|
+
test_files: []
|