rails-footnotes 4.1.8 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +25 -0
- data/.gitignore +2 -3
- data/Gemfile +7 -0
- data/Gemfile.lock +187 -0
- data/README.rdoc +8 -54
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/lib/generators/templates/rails_footnotes.rb +4 -5
- data/lib/rails-footnotes.rb +3 -7
- data/lib/rails-footnotes/extension.rb +8 -16
- data/lib/rails-footnotes/filter.rb +4 -3
- data/lib/rails-footnotes/notes/assigns_note.rb +2 -2
- data/lib/rails-footnotes/notes/files_note.rb +3 -2
- data/lib/rails-footnotes/notes/queries_note.rb +8 -9
- data/lib/rails-footnotes/notes/view_note.rb +2 -1
- data/lib/rails-footnotes/version.rb +1 -1
- data/lib/rails6-footnotes.rb +1 -0
- data/rails-footnotes.gemspec +5 -11
- data/spec/app/assets/config/manifest.js +2 -0
- data/spec/app/views/files/index.html.erb +1 -0
- data/spec/controllers/files_note_controller_spec.rb +3 -3
- data/spec/controllers/footnotes_controller_spec.rb +4 -4
- data/spec/controllers/log_note_controller_spec.rb +1 -1
- data/spec/env_note_spec.rb +4 -4
- data/spec/footnotes_spec.rb +4 -3
- data/spec/notes/assigns_note_spec.rb +2 -2
- data/spec/notes/files_note_spec.rb +7 -1
- data/spec/notes/view_note_spec.rb +7 -1
- data/spec/spec_helper.rb +1 -0
- metadata +21 -57
- data/.travis.yml +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c46e88fcf583fff51677ec9c3d049017bc3154f17c38aa9c872f14b5ab5184db
|
4
|
+
data.tar.gz: 16f25b1769f5bd07bbc68c5e598d9a247669fa8249bc08ebcadd0f62427ad085
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 207f2170eed40c410ab90f923ecddc199abe7fdcf341f1e047d9ceda03be2f6135ac049c821249645929123a719cd78812bcfffda8b4aa25340788851f264ec6
|
7
|
+
data.tar.gz: faec60331eb700897e1013e1e3df6b158ba57f3682ab61e479612da878666dd2c34a5f47f76b9fc4162e9bbfeb85f7b7cf28b282ff9ddfa847c81592477cb326
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
ruby-version: ['3.0']
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby-version }}
|
23
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
24
|
+
- name: Run tests
|
25
|
+
run: bin/rspec
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rails-footnotes (5.0.0)
|
5
|
+
rails (~> 6.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
actioncable (6.1.4)
|
11
|
+
actionpack (= 6.1.4)
|
12
|
+
activesupport (= 6.1.4)
|
13
|
+
nio4r (~> 2.0)
|
14
|
+
websocket-driver (>= 0.6.1)
|
15
|
+
actionmailbox (6.1.4)
|
16
|
+
actionpack (= 6.1.4)
|
17
|
+
activejob (= 6.1.4)
|
18
|
+
activerecord (= 6.1.4)
|
19
|
+
activestorage (= 6.1.4)
|
20
|
+
activesupport (= 6.1.4)
|
21
|
+
mail (>= 2.7.1)
|
22
|
+
actionmailer (6.1.4)
|
23
|
+
actionpack (= 6.1.4)
|
24
|
+
actionview (= 6.1.4)
|
25
|
+
activejob (= 6.1.4)
|
26
|
+
activesupport (= 6.1.4)
|
27
|
+
mail (~> 2.5, >= 2.5.4)
|
28
|
+
rails-dom-testing (~> 2.0)
|
29
|
+
actionpack (6.1.4)
|
30
|
+
actionview (= 6.1.4)
|
31
|
+
activesupport (= 6.1.4)
|
32
|
+
rack (~> 2.0, >= 2.0.9)
|
33
|
+
rack-test (>= 0.6.3)
|
34
|
+
rails-dom-testing (~> 2.0)
|
35
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
36
|
+
actiontext (6.1.4)
|
37
|
+
actionpack (= 6.1.4)
|
38
|
+
activerecord (= 6.1.4)
|
39
|
+
activestorage (= 6.1.4)
|
40
|
+
activesupport (= 6.1.4)
|
41
|
+
nokogiri (>= 1.8.5)
|
42
|
+
actionview (6.1.4)
|
43
|
+
activesupport (= 6.1.4)
|
44
|
+
builder (~> 3.1)
|
45
|
+
erubi (~> 1.4)
|
46
|
+
rails-dom-testing (~> 2.0)
|
47
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
48
|
+
activejob (6.1.4)
|
49
|
+
activesupport (= 6.1.4)
|
50
|
+
globalid (>= 0.3.6)
|
51
|
+
activemodel (6.1.4)
|
52
|
+
activesupport (= 6.1.4)
|
53
|
+
activerecord (6.1.4)
|
54
|
+
activemodel (= 6.1.4)
|
55
|
+
activesupport (= 6.1.4)
|
56
|
+
activestorage (6.1.4)
|
57
|
+
actionpack (= 6.1.4)
|
58
|
+
activejob (= 6.1.4)
|
59
|
+
activerecord (= 6.1.4)
|
60
|
+
activesupport (= 6.1.4)
|
61
|
+
marcel (~> 1.0.0)
|
62
|
+
mini_mime (>= 1.1.0)
|
63
|
+
activesupport (6.1.4)
|
64
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
65
|
+
i18n (>= 1.6, < 2)
|
66
|
+
minitest (>= 5.1)
|
67
|
+
tzinfo (~> 2.0)
|
68
|
+
zeitwerk (~> 2.3)
|
69
|
+
addressable (2.8.0)
|
70
|
+
public_suffix (>= 2.0.2, < 5.0)
|
71
|
+
builder (3.2.4)
|
72
|
+
capybara (3.35.3)
|
73
|
+
addressable
|
74
|
+
mini_mime (>= 0.1.3)
|
75
|
+
nokogiri (~> 1.8)
|
76
|
+
rack (>= 1.6.0)
|
77
|
+
rack-test (>= 0.6.3)
|
78
|
+
regexp_parser (>= 1.5, < 3.0)
|
79
|
+
xpath (~> 3.2)
|
80
|
+
coderay (1.1.3)
|
81
|
+
concurrent-ruby (1.1.9)
|
82
|
+
crass (1.0.6)
|
83
|
+
diff-lcs (1.4.4)
|
84
|
+
erubi (1.10.0)
|
85
|
+
globalid (0.5.2)
|
86
|
+
activesupport (>= 5.0)
|
87
|
+
i18n (1.8.10)
|
88
|
+
concurrent-ruby (~> 1.0)
|
89
|
+
loofah (2.12.0)
|
90
|
+
crass (~> 1.0.2)
|
91
|
+
nokogiri (>= 1.5.9)
|
92
|
+
mail (2.7.1)
|
93
|
+
mini_mime (>= 0.1.1)
|
94
|
+
marcel (1.0.1)
|
95
|
+
method_source (1.0.0)
|
96
|
+
mini_mime (1.1.0)
|
97
|
+
minitest (5.14.4)
|
98
|
+
nio4r (2.5.8)
|
99
|
+
nokogiri (1.12.3-arm64-darwin)
|
100
|
+
racc (~> 1.4)
|
101
|
+
nokogiri (1.12.3-x86_64-linux)
|
102
|
+
racc (~> 1.4)
|
103
|
+
pry (0.14.1)
|
104
|
+
coderay (~> 1.1)
|
105
|
+
method_source (~> 1.0)
|
106
|
+
public_suffix (4.0.6)
|
107
|
+
racc (1.5.2)
|
108
|
+
rack (2.2.3)
|
109
|
+
rack-test (1.1.0)
|
110
|
+
rack (>= 1.0, < 3)
|
111
|
+
rails (6.1.4)
|
112
|
+
actioncable (= 6.1.4)
|
113
|
+
actionmailbox (= 6.1.4)
|
114
|
+
actionmailer (= 6.1.4)
|
115
|
+
actionpack (= 6.1.4)
|
116
|
+
actiontext (= 6.1.4)
|
117
|
+
actionview (= 6.1.4)
|
118
|
+
activejob (= 6.1.4)
|
119
|
+
activemodel (= 6.1.4)
|
120
|
+
activerecord (= 6.1.4)
|
121
|
+
activestorage (= 6.1.4)
|
122
|
+
activesupport (= 6.1.4)
|
123
|
+
bundler (>= 1.15.0)
|
124
|
+
railties (= 6.1.4)
|
125
|
+
sprockets-rails (>= 2.0.0)
|
126
|
+
rails-dom-testing (2.0.3)
|
127
|
+
activesupport (>= 4.2.0)
|
128
|
+
nokogiri (>= 1.6)
|
129
|
+
rails-html-sanitizer (1.4.1)
|
130
|
+
loofah (~> 2.3)
|
131
|
+
railties (6.1.4)
|
132
|
+
actionpack (= 6.1.4)
|
133
|
+
activesupport (= 6.1.4)
|
134
|
+
method_source
|
135
|
+
rake (>= 0.13)
|
136
|
+
thor (~> 1.0)
|
137
|
+
rake (13.0.6)
|
138
|
+
regexp_parser (2.1.1)
|
139
|
+
rspec-core (3.10.1)
|
140
|
+
rspec-support (~> 3.10.0)
|
141
|
+
rspec-expectations (3.10.1)
|
142
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
143
|
+
rspec-support (~> 3.10.0)
|
144
|
+
rspec-mocks (3.10.2)
|
145
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
146
|
+
rspec-support (~> 3.10.0)
|
147
|
+
rspec-rails (5.0.2)
|
148
|
+
actionpack (>= 5.2)
|
149
|
+
activesupport (>= 5.2)
|
150
|
+
railties (>= 5.2)
|
151
|
+
rspec-core (~> 3.10)
|
152
|
+
rspec-expectations (~> 3.10)
|
153
|
+
rspec-mocks (~> 3.10)
|
154
|
+
rspec-support (~> 3.10)
|
155
|
+
rspec-support (3.10.2)
|
156
|
+
sprockets (4.0.2)
|
157
|
+
concurrent-ruby (~> 1.0)
|
158
|
+
rack (> 1, < 3)
|
159
|
+
sprockets-rails (3.2.2)
|
160
|
+
actionpack (>= 4.0)
|
161
|
+
activesupport (>= 4.0)
|
162
|
+
sprockets (>= 3.0.0)
|
163
|
+
thor (1.1.0)
|
164
|
+
tzinfo (2.0.4)
|
165
|
+
concurrent-ruby (~> 1.0)
|
166
|
+
websocket-driver (0.7.5)
|
167
|
+
websocket-extensions (>= 0.1.0)
|
168
|
+
websocket-extensions (0.1.5)
|
169
|
+
xpath (3.2.0)
|
170
|
+
nokogiri (~> 1.8)
|
171
|
+
zeitwerk (2.4.2)
|
172
|
+
|
173
|
+
PLATFORMS
|
174
|
+
arm64-darwin-20
|
175
|
+
x86_64-linux
|
176
|
+
|
177
|
+
DEPENDENCIES
|
178
|
+
capybara (~> 3.35)
|
179
|
+
nokogiri (~> 1.12)
|
180
|
+
pry (~> 0.14.1)
|
181
|
+
rails-footnotes!
|
182
|
+
rake (~> 13.0)
|
183
|
+
rspec-rails (~> 5.0)
|
184
|
+
sprockets-rails (~> 3.2)
|
185
|
+
|
186
|
+
BUNDLED WITH
|
187
|
+
2.2.23
|
data/README.rdoc
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
= Rails Footnotes
|
2
|
-
|
3
|
-
{<img src="https://travis-ci.org/josevalim/rails-footnotes.png" />}[https://travis-ci.org/josevalim/rails-footnotes]
|
1
|
+
= Rails 6 Footnotes
|
4
2
|
|
5
3
|
Rails footnotes displays footnotes in your application for easy debugging, such as sessions,
|
6
4
|
request parameters, cookies, filter chain, routes, queries, etc.
|
@@ -10,17 +8,11 @@ your backtrace lines.
|
|
10
8
|
|
11
9
|
== Installation
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
https://github.com/josevalim/rails-footnotes/tree/rails2
|
16
|
-
|
17
|
-
Installing Rails Footnotes is very easy.
|
11
|
+
Add to your `Gemfile`:
|
18
12
|
|
19
|
-
|
13
|
+
gem "rails-footnotes", "~> 5.0"
|
20
14
|
|
21
|
-
|
22
|
-
|
23
|
-
After you install RailsFootnotes and add it to your Gemfile, you need to run the generator:
|
15
|
+
Run `bundle install`, then the generator:
|
24
16
|
|
25
17
|
rails generate rails_footnotes:install
|
26
18
|
|
@@ -37,7 +29,7 @@ This will create an initializer with default config and some examples.
|
|
37
29
|
|
38
30
|
=== Editor links
|
39
31
|
|
40
|
-
Textmate, MacVim and Sublime Text
|
32
|
+
Textmate, MacVim and Sublime Text 3 are compatible.
|
41
33
|
|
42
34
|
*MacVim*
|
43
35
|
|
@@ -52,17 +44,11 @@ the second %d is replaced by the column number.
|
|
52
44
|
Take note that the order in which the file name (%s), line number (%d) and column number (%d) appears is important.
|
53
45
|
We assume that they appear in that order. "foo://line=%d&file=%s" (%d precedes %s) would throw out an error.
|
54
46
|
|
55
|
-
*Sublime* *Text* *
|
56
|
-
|
57
|
-
1. Keep the Textmate prefix, <tt>f.prefix = 'txmt://open?url=file://%s&line=%d&column=%d'</tt>
|
47
|
+
*Sublime* *Text* *3*
|
58
48
|
|
59
|
-
|
49
|
+
Install {subl}[https://github.com/dhoulb/subl], then use:
|
60
50
|
|
61
|
-
|
62
|
-
|
63
|
-
4. Install {RCDefault}[http://www.rubicode.com/Software/RCDefaultApp]. It's OSX 10.2, but it works.
|
64
|
-
|
65
|
-
5. Go to RCDefaultApp (OS System Preferences > DefaultApps). Go to URL section, select "tmxt" extension, and set default applicaiton to "SublHandler".
|
51
|
+
f.prefix = 'subl://open?url=file://%s&line=%d&column=%d'
|
66
52
|
|
67
53
|
*Use* *with* *Vagrant* (*and* *other* *virtual* *machines*)
|
68
54
|
|
@@ -156,39 +142,7 @@ If you'd like the footnote, to be at a different place (perhaps for aesthetical
|
|
156
142
|
<div id="footnotes_holder"></div>
|
157
143
|
at an appropriate place, your notes will now appear inside div#footnotes_holder
|
158
144
|
|
159
|
-
== Collaborators
|
160
|
-
|
161
|
-
* Leon Li - http://github.com/scorpio
|
162
|
-
* Keenan Brock - http://github.com/kbrock
|
163
|
-
* Ivan Storck - http://github.com/ivanoats
|
164
|
-
* Kris Chamber - http://github.com/kristopher
|
165
|
-
* Roman V. Babenko - http://github.com/romanvbabenko
|
166
|
-
* Adrien Siami - http://github.com/intrepidd
|
167
|
-
|
168
145
|
== Bugs and Feedback
|
169
146
|
|
170
147
|
If you discover any bugs, please open an issue.
|
171
148
|
If you just want to give some positive feedback or drop a line, that's fine too!
|
172
|
-
|
173
|
-
=== Version 4.x
|
174
|
-
|
175
|
-
Starting from version 4.0, Adren Siami is the maintainer of this plugin.
|
176
|
-
|
177
|
-
=== Version 3.x
|
178
|
-
|
179
|
-
This plugin was maintained until version 4.0 by Roman V. Babenko
|
180
|
-
|
181
|
-
Copyright (c) 2010-2014 Roman V. Babenko (romanvbabenko@gmail.com)
|
182
|
-
http://romanvbabenko.com
|
183
|
-
|
184
|
-
This plugin was maintained until version 3.6 by José Valim
|
185
|
-
|
186
|
-
Copyright (c) 2009 José Valim (jose@plataformatec.com.br)
|
187
|
-
http://blog.plataformatec.com.br
|
188
|
-
|
189
|
-
=== Version 2.0
|
190
|
-
|
191
|
-
This plugin was created and maintained until version 2.0 by Duane Johnson:
|
192
|
-
|
193
|
-
Copyright (c) 2006 InquiryLabs, Inc.
|
194
|
-
http://blog.inquirylabs.com
|
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
@@ -1,11 +1,10 @@
|
|
1
|
-
|
1
|
+
Footnotes.setup do |f|
|
2
2
|
# Whether or not to enable footnotes
|
3
3
|
f.enabled = Rails.env.development?
|
4
|
-
# You can also use a lambda / proc to conditionally toggle footnotes
|
5
|
-
# Example :
|
4
|
+
# You can also use a lambda / proc to conditionally toggle footnotes, like
|
6
5
|
# f.enabled = -> { User.current.admin? }
|
7
6
|
# Beware of thread-safety though, Footnotes.enabled is NOT thread safe
|
8
|
-
# and should not be modified
|
7
|
+
# and should not be modified outside this initializer.
|
9
8
|
|
10
9
|
# Only toggle some notes :
|
11
10
|
# f.notes = [:session, :cookies, :params, :filters, :routes, :env, :queries, :log]
|
@@ -24,4 +23,4 @@ defined?(Footnotes) && Footnotes.setup do |f|
|
|
24
23
|
|
25
24
|
# Allow to open multiple notes :
|
26
25
|
# f.multiple_notes = true
|
27
|
-
end
|
26
|
+
end if defined?(Footnotes) && Footnotes.respond_to?(:setup)
|
data/lib/rails-footnotes.rb
CHANGED
@@ -5,7 +5,6 @@ require 'rails-footnotes/each_with_rescue'
|
|
5
5
|
require 'rails-footnotes/filter'
|
6
6
|
require 'rails-footnotes/notes/all'
|
7
7
|
require 'rails-footnotes/extension'
|
8
|
-
require 'active_support/deprecation'
|
9
8
|
|
10
9
|
module Footnotes
|
11
10
|
mattr_accessor :before_hooks
|
@@ -37,11 +36,6 @@ module Footnotes
|
|
37
36
|
delegate :font_size=, :to => Filter
|
38
37
|
end
|
39
38
|
|
40
|
-
def self.run!
|
41
|
-
ActiveSupport::Deprecation.warn "run! is deprecated and will be removed from future releases, use Footnotes.setup or Footnotes.enabled instead.", caller
|
42
|
-
Footnotes.enabled = true
|
43
|
-
end
|
44
|
-
|
45
39
|
def self.before(&block)
|
46
40
|
@@before_hooks << block
|
47
41
|
end
|
@@ -67,6 +61,8 @@ module Footnotes
|
|
67
61
|
end
|
68
62
|
end
|
69
63
|
|
70
|
-
|
64
|
+
ActiveSupport.on_load(:action_controller) do
|
65
|
+
ActionController::Base.send(:include, Footnotes::RailsFootnotesExtension)
|
66
|
+
end
|
71
67
|
|
72
68
|
load Rails.root.join('.rails_footnotes') if Rails.root && Rails.root.join('.rails_footnotes').exist?
|
@@ -2,31 +2,23 @@ require 'active_support/concern'
|
|
2
2
|
|
3
3
|
module Footnotes
|
4
4
|
module RailsFootnotesExtension
|
5
|
-
|
6
5
|
extend ActiveSupport::Concern
|
7
6
|
|
8
7
|
included do
|
9
|
-
|
10
|
-
|
11
|
-
after_action :rails_footnotes_after_filter
|
12
|
-
else
|
13
|
-
prepend_before_filter :rails_footnotes_before_filter
|
14
|
-
after_filter :rails_footnotes_after_filter
|
15
|
-
end
|
8
|
+
prepend_before_action :rails_footnotes_before_filter
|
9
|
+
after_action :rails_footnotes_after_filter
|
16
10
|
end
|
17
11
|
|
18
12
|
def rails_footnotes_before_filter
|
19
|
-
if Footnotes.enabled?(self)
|
20
|
-
Footnotes::Filter.start!(self)
|
21
|
-
end
|
13
|
+
Footnotes::Filter.start!(self) if Footnotes.enabled?(self)
|
22
14
|
end
|
23
15
|
|
24
16
|
def rails_footnotes_after_filter
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
return unless Footnotes.enabled?(self)
|
18
|
+
|
19
|
+
filter = Footnotes::Filter.new(self)
|
20
|
+
filter.add_footnotes!
|
21
|
+
filter.close!(self)
|
30
22
|
end
|
31
23
|
end
|
32
24
|
end
|
@@ -47,7 +47,7 @@ module Footnotes
|
|
47
47
|
if args.empty?
|
48
48
|
@@prefix
|
49
49
|
else
|
50
|
-
args.map! { |arg|
|
50
|
+
args.map! { |arg| arg.to_s.split("/").map{|s| ERB::Util.url_encode(s) }.join("/") }
|
51
51
|
|
52
52
|
if @@prefix.respond_to? :call
|
53
53
|
@@prefix.call *args
|
@@ -116,7 +116,8 @@ module Footnotes
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def valid_format?
|
119
|
-
|
119
|
+
format = @controller.response.content_type
|
120
|
+
format.nil? || format.include?("text/html")
|
120
121
|
end
|
121
122
|
|
122
123
|
def valid_content_type?
|
@@ -169,7 +170,7 @@ module Footnotes
|
|
169
170
|
#footnotes_debug table td {padding: 5px; border-bottom: 1px solid #ccc;}
|
170
171
|
#footnotes_debug table td strong {color: #9b1b1b;}
|
171
172
|
#footnotes_debug table th {padding: 5px; border-bottom: 1px solid #ccc;}
|
172
|
-
#footnotes_debug table tr:nth-child(2n) td {background: #
|
173
|
+
#footnotes_debug table tr:nth-child(2n) td {background: #f5f5f5;}
|
173
174
|
#footnotes_debug table tr:nth-child(2n + 1) td {background: #fff;}
|
174
175
|
#footnotes_debug tbody {text-align: left;}
|
175
176
|
#footnotes_debug .name_values td {vertical-align: top;}
|
@@ -16,9 +16,9 @@ module Footnotes
|
|
16
16
|
:@view_runtime,
|
17
17
|
:@marked_for_same_origin_verification
|
18
18
|
]
|
19
|
-
cattr_accessor :ignored_assigns, :
|
19
|
+
cattr_accessor :ignored_assigns, :instance_writer => false
|
20
20
|
@@ignored_assigns_pattern = /^@_/
|
21
|
-
cattr_accessor :ignored_assigns_pattern, :
|
21
|
+
cattr_accessor :ignored_assigns_pattern, :instance_writer => false
|
22
22
|
|
23
23
|
def initialize(controller)
|
24
24
|
@controller = controller
|
@@ -24,14 +24,15 @@ module Footnotes
|
|
24
24
|
|
25
25
|
protected
|
26
26
|
def scan_text(text)
|
27
|
-
|
27
|
+
raise NotImplementedError, "implement this in your subclass"
|
28
28
|
end
|
29
29
|
|
30
30
|
def parse_files!
|
31
|
-
asset_paths = Rails.application.config.assets.paths
|
31
|
+
asset_paths = Rails.application.config.try(:assets).try(:paths) || []
|
32
32
|
linked_files = []
|
33
33
|
|
34
34
|
@files.collect do |file|
|
35
|
+
file.gsub!(/-[a-f0-9]{64}\./, '.')
|
35
36
|
base_name = File.basename(file)
|
36
37
|
asset_paths.each do |asset_path|
|
37
38
|
results = Dir[File.expand_path(base_name, asset_path) + '*']
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Footnotes
|
2
2
|
module Notes
|
3
3
|
class QueriesNote < AbstractNote
|
4
|
-
cattr_accessor :alert_db_time, :alert_sql_number, :orm, :ignored_regexps, :
|
4
|
+
cattr_accessor :alert_db_time, :alert_sql_number, :orm, :ignored_regexps, :instance_writer => false
|
5
5
|
@@alert_db_time = 16.0
|
6
6
|
@@alert_sql_number = 8
|
7
7
|
@@query_subscriber = nil
|
@@ -23,8 +23,8 @@ module Footnotes
|
|
23
23
|
def title
|
24
24
|
queries = self.events.count
|
25
25
|
total_time = self.events.map(&:duration).sum
|
26
|
-
query_color =
|
27
|
-
db_color =
|
26
|
+
query_color = alert_color(self.events.count, alert_sql_number)
|
27
|
+
db_color = alert_color(total_time, alert_db_time)
|
28
28
|
|
29
29
|
<<-TITLE
|
30
30
|
<span style="background-color:#{query_color}">Queries (#{queries})</span>
|
@@ -57,17 +57,16 @@ module Footnotes
|
|
57
57
|
|
58
58
|
protected
|
59
59
|
def print_name_and_time(name, time)
|
60
|
-
"<span style='background-color:#{
|
60
|
+
"<span style='background-color:#{alert_color(time, alert_ratio)}'>#{escape(name || 'SQL')} (#{'%.3fms' % time})</span>"
|
61
61
|
end
|
62
62
|
|
63
63
|
def print_query(query)
|
64
64
|
escape(query.to_s.gsub(/(\s)+/, ' ').gsub('`', ''))
|
65
65
|
end
|
66
66
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
"#ff#{c*4}"
|
67
|
+
def alert_color(value, threshold)
|
68
|
+
return 'transparent' if value < threshold
|
69
|
+
'#ffff00'
|
71
70
|
end
|
72
71
|
|
73
72
|
def alert_ratio
|
@@ -103,7 +102,7 @@ module Footnotes
|
|
103
102
|
attr_accessor :events, :ignore_regexps
|
104
103
|
|
105
104
|
def initialize(orm)
|
106
|
-
super()
|
105
|
+
super()
|
107
106
|
@events = []
|
108
107
|
orm.each {|adapter| ActiveSupport::LogSubscriber.attach_to adapter, self}
|
109
108
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "./rails-footnotes"
|
data/rails-footnotes.gemspec
CHANGED
@@ -6,22 +6,16 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "rails-footnotes"
|
7
7
|
s.version = Footnotes::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Roman V. Babenko", "José Valim", "Keenan Brock", "Duane Johnson", "Adrien Siami"]
|
10
|
-
s.email = ["
|
11
|
-
s.homepage = "http://github.com/
|
9
|
+
s.authors = ["Roman V. Babenko", "José Valim", "Keenan Brock", "Duane Johnson", "Adrien Siami", "André Arko"]
|
10
|
+
s.email = ["andre@arko.net"]
|
11
|
+
s.homepage = "http://github.com/indirect/rails-footnotes"
|
12
12
|
s.summary = %q{Every Rails page has footnotes that gives information about your application and links back to your editor.}
|
13
13
|
s.description = %q{Every Rails page has footnotes that gives information about your application and links back to your editor.}
|
14
14
|
|
15
|
-
s.
|
16
|
-
|
17
|
-
s.add_dependency "rails", ">= 3.2"
|
18
|
-
|
19
|
-
s.add_development_dependency "rspec-rails", '~> 3.3.2'
|
20
|
-
s.add_development_dependency "sprockets-rails", '~> 2.0'
|
21
|
-
s.add_development_dependency "capybara"
|
15
|
+
s.add_dependency "rails", "~> 6.0"
|
16
|
+
s.required_ruby_version = "~> 3.0"
|
22
17
|
|
23
18
|
s.files = `git ls-files`.split("\n")
|
24
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
26
20
|
s.require_paths = ["lib"]
|
27
21
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
FILES INDEX
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
class FilesController < ApplicationController
|
4
|
-
|
5
|
-
def index
|
6
|
-
end
|
4
|
+
def index
|
7
5
|
end
|
6
|
+
end
|
8
7
|
|
9
8
|
describe FilesController, type: :controller do
|
10
9
|
render_views
|
@@ -19,6 +18,7 @@ describe FilesController, type: :controller do
|
|
19
18
|
|
20
19
|
it 'includes stylesheets assets in the response' do
|
21
20
|
get :index
|
21
|
+
expect(response.body).to include("FILES INDEX")
|
22
22
|
js_debug = first('fieldset#javascripts_debug_info div', visible: false)
|
23
23
|
expect(js_debug).to have_selector('li a', visible: false, count: 1)
|
24
24
|
expect(js_debug).to have_selector('li a', text: /foobar\.js/, visible: false)
|
@@ -3,15 +3,15 @@ require 'spec_helper'
|
|
3
3
|
class FootnotesController < ActionController::Base
|
4
4
|
|
5
5
|
def foo
|
6
|
-
render :
|
6
|
+
render inline: HTML_DOCUMENT, content_type: 'text/html'
|
7
7
|
end
|
8
8
|
|
9
9
|
def foo_holder
|
10
|
-
render :
|
10
|
+
render inline: '<html><body><div id="footnotes_holder"></div></body></html>'
|
11
11
|
end
|
12
12
|
|
13
13
|
def foo_js
|
14
|
-
render :
|
14
|
+
render inline: '<script></script>', content_type: 'text/javascript'
|
15
15
|
end
|
16
16
|
|
17
17
|
def foo_download
|
@@ -75,7 +75,7 @@ describe FootnotesController, type: :controller do
|
|
75
75
|
describe 'when request is xhr' do
|
76
76
|
include_context 'has_no_footnotes'
|
77
77
|
before do
|
78
|
-
|
78
|
+
get :foo, xhr: true
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -10,7 +10,7 @@ describe 'log note', type: :controller do
|
|
10
10
|
def index
|
11
11
|
Rails.logger.error 'foo'
|
12
12
|
Rails.logger.warn 'bar'
|
13
|
-
render :
|
13
|
+
render inline: '<html><head></head><body></body></html>', content_type: 'text/html'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/spec/env_note_spec.rb
CHANGED
@@ -9,11 +9,11 @@ end
|
|
9
9
|
describe Footnotes::Notes::EnvNote do
|
10
10
|
let(:controller) {
|
11
11
|
FootnotesEnvController.new.tap { |c|
|
12
|
-
c.template
|
13
|
-
c.request
|
14
|
-
c.response
|
12
|
+
c.template = Object.new
|
13
|
+
c.request = ActionDispatch::TestRequest.create
|
14
|
+
c.response = ActionDispatch::TestResponse.new
|
15
15
|
c.response_body = %Q(<html><body></body></html>)
|
16
|
-
c.params
|
16
|
+
c.params = {}
|
17
17
|
}
|
18
18
|
}
|
19
19
|
|
data/spec/footnotes_spec.rb
CHANGED
@@ -30,8 +30,8 @@ describe "Footnotes" do
|
|
30
30
|
before do
|
31
31
|
@controller = FootnotesController.new
|
32
32
|
@controller.template = Object.new
|
33
|
-
@controller.request =
|
34
|
-
@controller.response =
|
33
|
+
@controller.request = ActionDispatch::TestRequest.create
|
34
|
+
@controller.response = ActionDispatch::TestResponse.new
|
35
35
|
@controller.response_body = HTML_DOCUMENT.dup
|
36
36
|
@controller.params = {}
|
37
37
|
|
@@ -48,6 +48,7 @@ describe "Footnotes" do
|
|
48
48
|
context "response_body is file" do
|
49
49
|
before do
|
50
50
|
@file = Tempfile.new("test")
|
51
|
+
def @file.body; read; end
|
51
52
|
@file.write "foobarbaz"
|
52
53
|
@file.rewind
|
53
54
|
end
|
@@ -89,7 +90,7 @@ describe "Footnotes" do
|
|
89
90
|
end
|
90
91
|
|
91
92
|
specify "footnotes_included_when_content_type_is_html" do
|
92
|
-
@controller.response.content_type = 'text/html'
|
93
|
+
@controller.response.content_type = 'text/html; charset=utf-8'
|
93
94
|
footnotes_perform!
|
94
95
|
expect(@controller.response.body).not_to eql HTML_DOCUMENT
|
95
96
|
end
|
@@ -25,7 +25,7 @@ describe Footnotes::Notes::AssignsNote do
|
|
25
25
|
specify {expect(note.send(:to_table)).to eql [
|
26
26
|
["Name", "Value"],
|
27
27
|
["<strong>@action_has_layout</strong><br /><em>TrueClass</em>", "true"],
|
28
|
-
["<strong>@status</strong><br /><em>
|
28
|
+
["<strong>@status</strong><br /><em>Integer</em>", "200"]
|
29
29
|
]}
|
30
30
|
|
31
31
|
describe "Ignored Assigns" do
|
@@ -43,7 +43,7 @@ describe Footnotes::Notes::AssignsNote do
|
|
43
43
|
[
|
44
44
|
["Name", "Value"],
|
45
45
|
["<strong>@action_has_layout</strong><br /><em>TrueClass</em>", "true"],
|
46
|
-
["<strong>@status</strong><br /><em>
|
46
|
+
["<strong>@status</strong><br /><em>Integer</em>", "200"]
|
47
47
|
], {:summary=>"Debug information for Assigns (2)"})
|
48
48
|
note.content
|
49
49
|
end
|
@@ -2,10 +2,16 @@ require 'spec_helper'
|
|
2
2
|
require 'action_controller'
|
3
3
|
require "rails-footnotes/notes/files_note"
|
4
4
|
|
5
|
+
class ConcreteFilesNote < Footnotes::Notes::FilesNote
|
6
|
+
def scan_text(text)
|
7
|
+
[]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
describe Footnotes::Notes::FilesNote do
|
6
12
|
|
7
13
|
let(:note) do
|
8
|
-
|
14
|
+
ConcreteFilesNote.new(double('controller', :response => double('', :body => '')))
|
9
15
|
end
|
10
16
|
|
11
17
|
subject { note }
|
@@ -2,11 +2,17 @@ require "spec_helper"
|
|
2
2
|
require "rails-footnotes/notes/view_note"
|
3
3
|
|
4
4
|
describe Footnotes::Notes::ViewNote do
|
5
|
-
|
6
5
|
it "should not be valid if view file not exist" do
|
7
6
|
note = Footnotes::Notes::ViewNote.new(double)
|
8
7
|
allow(note).to receive(:filename).and_return(nil)
|
9
8
|
|
10
9
|
expect(note).not_to be_valid
|
11
10
|
end
|
11
|
+
|
12
|
+
it "should not explode if template is nil" do
|
13
|
+
Footnotes::Notes::ViewNote.template = nil
|
14
|
+
|
15
|
+
note = Footnotes::Notes::ViewNote.new(double)
|
16
|
+
expect(note).to_not be_valid
|
17
|
+
end
|
12
18
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-footnotes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman V. Babenko
|
@@ -9,83 +9,45 @@ authors:
|
|
9
9
|
- Keenan Brock
|
10
10
|
- Duane Johnson
|
11
11
|
- Adrien Siami
|
12
|
-
|
12
|
+
- André Arko
|
13
|
+
autorequire:
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
|
-
date:
|
16
|
+
date: 2021-08-23 00:00:00.000000000 Z
|
16
17
|
dependencies:
|
17
18
|
- !ruby/object:Gem::Dependency
|
18
19
|
name: rails
|
19
|
-
requirement: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: '3.2'
|
24
|
-
type: :runtime
|
25
|
-
prerelease: false
|
26
|
-
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
requirements:
|
28
|
-
- - ">="
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '3.2'
|
31
|
-
- !ruby/object:Gem::Dependency
|
32
|
-
name: rspec-rails
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
-
requirements:
|
35
|
-
- - "~>"
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 3.3.2
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
requirements:
|
42
|
-
- - "~>"
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: 3.3.2
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: sprockets-rails
|
47
20
|
requirement: !ruby/object:Gem::Requirement
|
48
21
|
requirements:
|
49
22
|
- - "~>"
|
50
23
|
- !ruby/object:Gem::Version
|
51
|
-
version: '
|
52
|
-
type: :
|
24
|
+
version: '6.0'
|
25
|
+
type: :runtime
|
53
26
|
prerelease: false
|
54
27
|
version_requirements: !ruby/object:Gem::Requirement
|
55
28
|
requirements:
|
56
29
|
- - "~>"
|
57
30
|
- !ruby/object:Gem::Version
|
58
|
-
version: '
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: capybara
|
61
|
-
requirement: !ruby/object:Gem::Requirement
|
62
|
-
requirements:
|
63
|
-
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: '0'
|
66
|
-
type: :development
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: !ruby/object:Gem::Requirement
|
69
|
-
requirements:
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '0'
|
31
|
+
version: '6.0'
|
73
32
|
description: Every Rails page has footnotes that gives information about your application
|
74
33
|
and links back to your editor.
|
75
34
|
email:
|
76
|
-
-
|
35
|
+
- andre@arko.net
|
77
36
|
executables: []
|
78
37
|
extensions: []
|
79
38
|
extra_rdoc_files: []
|
80
39
|
files:
|
40
|
+
- ".github/workflows/ci.yml"
|
81
41
|
- ".gitignore"
|
82
42
|
- ".rspec.example"
|
83
|
-
- ".travis.yml"
|
84
43
|
- CHANGELOG
|
85
44
|
- Gemfile
|
45
|
+
- Gemfile.lock
|
86
46
|
- MIT-LICENSE
|
87
47
|
- README.rdoc
|
88
48
|
- Rakefile
|
49
|
+
- bin/rake
|
50
|
+
- bin/rspec
|
89
51
|
- gemfiles/Gemfile.rails-3.2.22
|
90
52
|
- gemfiles/Gemfile.rails-4.0.x
|
91
53
|
- gemfiles/Gemfile.rails-4.1.x
|
@@ -117,8 +79,10 @@ files:
|
|
117
79
|
- lib/rails-footnotes/notes/stylesheets_note.rb
|
118
80
|
- lib/rails-footnotes/notes/view_note.rb
|
119
81
|
- lib/rails-footnotes/version.rb
|
82
|
+
- lib/rails6-footnotes.rb
|
120
83
|
- rails-footnotes.gemspec
|
121
84
|
- spec/abstract_note_spec.rb
|
85
|
+
- spec/app/assets/config/manifest.js
|
122
86
|
- spec/app/assets/javascripts/foobar.js
|
123
87
|
- spec/app/assets/stylesheets/foobar.css
|
124
88
|
- spec/app/views/files/index.html.erb
|
@@ -139,32 +103,32 @@ files:
|
|
139
103
|
- spec/notes/stylesheets_note_spec.rb
|
140
104
|
- spec/notes/view_note_spec.rb
|
141
105
|
- spec/spec_helper.rb
|
142
|
-
homepage: http://github.com/
|
106
|
+
homepage: http://github.com/indirect/rails-footnotes
|
143
107
|
licenses: []
|
144
108
|
metadata: {}
|
145
|
-
post_install_message:
|
109
|
+
post_install_message:
|
146
110
|
rdoc_options: []
|
147
111
|
require_paths:
|
148
112
|
- lib
|
149
113
|
required_ruby_version: !ruby/object:Gem::Requirement
|
150
114
|
requirements:
|
151
|
-
- - "
|
115
|
+
- - "~>"
|
152
116
|
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
117
|
+
version: '3.0'
|
154
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
119
|
requirements:
|
156
120
|
- - ">="
|
157
121
|
- !ruby/object:Gem::Version
|
158
122
|
version: '0'
|
159
123
|
requirements: []
|
160
|
-
|
161
|
-
|
162
|
-
signing_key:
|
124
|
+
rubygems_version: 3.2.23
|
125
|
+
signing_key:
|
163
126
|
specification_version: 4
|
164
127
|
summary: Every Rails page has footnotes that gives information about your application
|
165
128
|
and links back to your editor.
|
166
129
|
test_files:
|
167
130
|
- spec/abstract_note_spec.rb
|
131
|
+
- spec/app/assets/config/manifest.js
|
168
132
|
- spec/app/assets/javascripts/foobar.js
|
169
133
|
- spec/app/assets/stylesheets/foobar.css
|
170
134
|
- spec/app/views/files/index.html.erb
|
data/.travis.yml
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
cache: bundler
|
2
|
-
sudo: false
|
3
|
-
script: "bundle exec rake"
|
4
|
-
rvm:
|
5
|
-
- 1.9.3
|
6
|
-
- 2.0.0
|
7
|
-
- 2.1.7
|
8
|
-
- 2.2.3
|
9
|
-
gemfile:
|
10
|
-
- gemfiles/Gemfile.rails-3.2.22
|
11
|
-
- gemfiles/Gemfile.rails-4.0.x
|
12
|
-
- gemfiles/Gemfile.rails-4.1.x
|
13
|
-
- gemfiles/Gemfile.rails-4.2.x
|
14
|
-
- gemfiles/Gemfile.rails-edge
|
15
|
-
matrix:
|
16
|
-
allow_failures:
|
17
|
-
- gemfile: gemfiles/Gemfile.rails-edge
|
18
|
-
- gemfile: gemfiles/Gemfile.rails-3.2.22
|
19
|
-
exclude:
|
20
|
-
- rvm: 1.9.3
|
21
|
-
gemfile: gemfiles/Gemfile.rails-edge
|
22
|
-
- rvm: 2.0.0
|
23
|
-
gemfile: gemfiles/Gemfile.rails-edge
|
24
|
-
- rvm: 2.1.7
|
25
|
-
gemfile: gemfiles/Gemfile.rails-edge
|