open_code-rails 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +1 -1
- data/Gemfile.lock +8 -6
- data/README.md +28 -0
- data/lib/open_code/rails.rb +1 -0
- data/lib/open_code/rails/middleware.rb +75 -25
- data/lib/open_code/rails/railtie.rb +8 -39
- data/lib/open_code/rails/version.rb +1 -1
- data/lib/open_code/rails/vscode.svg +16 -0
- metadata +4 -5
- data/lib/open_code/rails/const_assets.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb839955c9420d3f2bab6eb25f4af2903a10fe80c28b62b69505e747e4f0a8a7
|
4
|
+
data.tar.gz: 4dbb790e46e02b5d754cba70e13962dde0f17c1a90b605595155b81de604729d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e7a5f2afd71f614da17a15b95aad0cc23f3a43a5969c016644271189ec2ffcaac56a2b7be56b28b71bd09e31332ec17d6ac79f0d8b2bb0d183c9cca4bbd37e5
|
7
|
+
data.tar.gz: ed8c3c07d2dacdbfac88ac8ee58b5d3ecb48c9bcd5f93d6c1a79d044c5875842c380db2f0d1e8d3edd3fbff5e3df364635eab2cc6c072f18af1f363ff71e097f
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
open_code-rails (0.
|
4
|
+
open_code-rails (0.2.0)
|
5
5
|
railties (>= 4.2)
|
6
6
|
|
7
7
|
GEM
|
@@ -54,6 +54,7 @@ GEM
|
|
54
54
|
pry-byebug (3.7.0)
|
55
55
|
byebug (~> 11.0)
|
56
56
|
pry (~> 0.10)
|
57
|
+
psych (3.1.0)
|
57
58
|
rack (2.0.6)
|
58
59
|
rack-test (1.1.0)
|
59
60
|
rack (>= 1.0, < 3)
|
@@ -83,26 +84,27 @@ GEM
|
|
83
84
|
diff-lcs (>= 1.2.0, < 2.0)
|
84
85
|
rspec-support (~> 3.8.0)
|
85
86
|
rspec-support (3.8.0)
|
86
|
-
rubocop (0.
|
87
|
+
rubocop (0.65.0)
|
87
88
|
jaro_winkler (~> 1.5.1)
|
88
89
|
parallel (~> 1.10)
|
89
90
|
parser (>= 2.5, != 2.5.1.1)
|
90
91
|
powerpack (~> 0.1)
|
92
|
+
psych (>= 3.1.0)
|
91
93
|
rainbow (>= 2.2.2, < 4.0)
|
92
94
|
ruby-progressbar (~> 1.7)
|
93
|
-
unicode-display_width (~> 1.
|
95
|
+
unicode-display_width (~> 1.4.0)
|
94
96
|
ruby-progressbar (1.10.0)
|
95
97
|
thor (0.20.3)
|
96
98
|
thread_safe (0.3.6)
|
97
99
|
tzinfo (1.2.5)
|
98
100
|
thread_safe (~> 0.1)
|
99
|
-
unicode-display_width (1.
|
101
|
+
unicode-display_width (1.4.1)
|
100
102
|
|
101
103
|
PLATFORMS
|
102
104
|
ruby
|
103
105
|
|
104
106
|
DEPENDENCIES
|
105
|
-
bundler (
|
107
|
+
bundler (>= 1.10)
|
106
108
|
open_code-rails!
|
107
109
|
pry-byebug
|
108
110
|
rake (~> 10.0)
|
@@ -110,4 +112,4 @@ DEPENDENCIES
|
|
110
112
|
rubocop
|
111
113
|
|
112
114
|
BUNDLED WITH
|
113
|
-
|
115
|
+
1.17.3
|
data/README.md
CHANGED
@@ -29,12 +29,16 @@ This gem simply inject some CSS and JS to HTML response while status is 500. You
|
|
29
29
|
|
30
30
|
## Configuration
|
31
31
|
|
32
|
+
### Basic - in config file
|
33
|
+
|
32
34
|
You should put settings in `config/environments/development.rb` because this gem should only work in dev server. It will prevent production server starting up.
|
33
35
|
|
34
36
|
1. `config.open_code.editor` - default: `'vscode'`
|
35
37
|
|
36
38
|
Currently only support `'vscode'` and `'vscodium'`. It will be used to link's scheme part, like `vscode://` or `vscodium://`. You can set it any string but probably won't work, unless your editor supports `<scheme>://file/<absolute file path>`.
|
37
39
|
|
40
|
+
Set to `false`, `'off'` or `'disabled'` to disable this gem
|
41
|
+
|
38
42
|
```ruby
|
39
43
|
# config/environments/development.rb
|
40
44
|
Rails.application.configure do
|
@@ -63,3 +67,27 @@ You should put settings in `config/environments/development.rb` because this gem
|
|
63
67
|
config.open_code.editor = '/Users/MyName/projects'
|
64
68
|
end
|
65
69
|
```
|
70
|
+
|
71
|
+
### Advanced - via Environment Variables
|
72
|
+
|
73
|
+
Some flexibility is probably required for cooperation. Different people may have various preferences of IDE/editors, also the folder could be placed differently. So here you go.
|
74
|
+
|
75
|
+
1. `FORCE_OPEN_CODE_EDITOR`
|
76
|
+
|
77
|
+
When is not blank, `config.open_code.editor` will be overridden.
|
78
|
+
|
79
|
+
Set to `false`, `off` or `disabled` to disable the gem
|
80
|
+
|
81
|
+
$ /usr/bin/env FORCE_OPEN_CODE_EDITOR=off rails s
|
82
|
+
|
83
|
+
2. `FORCE_OPEN_CODE_PLACE_HOLDER`
|
84
|
+
|
85
|
+
When is not blank, `config.open_code.place_holder` will be overridden.
|
86
|
+
|
87
|
+
$ /usr/bin/env FORCE_OPEN_CODE_PLACE_HOLDER='Open in VSCodium' rails s
|
88
|
+
|
89
|
+
3. `FORCE_OPEN_CODE_ROOT_DIR`
|
90
|
+
|
91
|
+
When is not blank, `config.open_code.root_dir` will be overridden.
|
92
|
+
|
93
|
+
$ /usr/bin/env FORCE_OPEN_CODE_ROOT_DIR='/my/project/path' rails s
|
data/lib/open_code/rails.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'active_support/all'
|
2
2
|
|
3
3
|
module OpenCode
|
4
4
|
module Rails
|
5
5
|
class Middleware
|
6
|
-
cattr_accessor :
|
7
|
-
cattr_accessor :place_holder
|
8
|
-
cattr_accessor :root_dir
|
9
|
-
cattr_accessor :scheme
|
6
|
+
cattr_accessor :html_code
|
10
7
|
|
11
8
|
def initialize(app)
|
12
9
|
@app = app
|
@@ -19,7 +16,37 @@ module OpenCode
|
|
19
16
|
status, headers, body = res
|
20
17
|
return res unless status == 500 && headers['Content-Type'].to_s.include?('html')
|
21
18
|
|
22
|
-
|
19
|
+
html = ''
|
20
|
+
body.each { |part| html << part }
|
21
|
+
body = html.sub('</body>', "#{html_code}</body>").encode('utf-8')
|
22
|
+
headers['Content-Length'] = body.size
|
23
|
+
[status, headers, [body]]
|
24
|
+
rescue => e
|
25
|
+
::Rails.logger.error do
|
26
|
+
<<-LOG.strip_heredoc
|
27
|
+
[OpenCode::Rails::Middleware] #{e.class}: #{e}
|
28
|
+
Sorry still something went wrong
|
29
|
+
from #{e.backtrace.join("\n ")}
|
30
|
+
LOG
|
31
|
+
end
|
32
|
+
res
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def loadable?(config)
|
38
|
+
return false if %w[false off disabled].include?(config.editor)
|
39
|
+
|
40
|
+
css = generate_css(config.place_holder.blank?)
|
41
|
+
js = generate_js(config.editor, config.place_holder, config.root_dir)
|
42
|
+
self.html_code = "<style>#{css}</style><script>#{js}</script>"
|
43
|
+
true
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def generate_js(scheme, place_holder, root_dir)
|
49
|
+
<<-JS.strip_heredoc
|
23
50
|
(function () {
|
24
51
|
setTimeout(function () {
|
25
52
|
var prefix = '#{scheme}://file/#{root_dir}';
|
@@ -27,11 +54,12 @@ module OpenCode
|
|
27
54
|
var items = document.querySelectorAll('#Application-Trace .trace-frames');
|
28
55
|
for (var i = 0; i < items.length; i += 1) {
|
29
56
|
var item = items[i];
|
30
|
-
var
|
31
|
-
var
|
32
|
-
var html = '<a href=
|
57
|
+
var uri = [prefix, item.innerText.split(':in')[0]].join('/');
|
58
|
+
var h = JSON.stringify(encodeURI(uri));
|
59
|
+
var html = '<a href=' + h + ' class="open-code-rails-link">#{place_holder}</a>';
|
33
60
|
|
34
|
-
var
|
61
|
+
var selFrameId = JSON.stringify(item.dataset.frameId);
|
62
|
+
var links = document.querySelectorAll('[data-frame-id=' + selFrameId + ']');
|
35
63
|
for (var j = 0; j < links.length; j += 1) {
|
36
64
|
var link = links[j];
|
37
65
|
tmp.innerHTML = html;
|
@@ -41,22 +69,44 @@ module OpenCode
|
|
41
69
|
}, 0);
|
42
70
|
})();
|
43
71
|
JS
|
72
|
+
end
|
44
73
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
74
|
+
def generate_css(use_icon)
|
75
|
+
css = <<-CSS.strip_heredoc
|
76
|
+
.open-code-rails-link {
|
77
|
+
box-sizing: border-box;
|
78
|
+
display: inline-block;
|
79
|
+
margin-left: 8px;
|
80
|
+
padding: 1px 6px;
|
81
|
+
vertical-align: middle;
|
82
|
+
border: 1px solid #FFCCCB;
|
83
|
+
color: #C52E23;
|
84
|
+
border-radius: 4px;
|
85
|
+
text-decoration: none;
|
86
|
+
}
|
87
|
+
.open-code-rails-link:hover {
|
88
|
+
border-color: #C52E23;
|
89
|
+
}
|
90
|
+
CSS
|
91
|
+
return css unless use_icon
|
92
|
+
|
93
|
+
require 'pathname'
|
94
|
+
require 'base64'
|
95
|
+
icon = Base64.strict_encode64(Pathname.new(__dir__).join('vscode.svg').read)
|
96
|
+
|
97
|
+
css << <<-CSS.strip_heredoc
|
98
|
+
.open-code-rails-link {
|
99
|
+
padding: 3px;
|
100
|
+
}
|
101
|
+
.open-code-rails-link::after {
|
102
|
+
display: block;
|
103
|
+
content: '';
|
104
|
+
width: 12px;
|
105
|
+
height: 12px;
|
106
|
+
background-image: url('data:image/svg+xml;base64,#{icon}');
|
107
|
+
}
|
108
|
+
CSS
|
109
|
+
css
|
60
110
|
end
|
61
111
|
end
|
62
112
|
end
|
@@ -11,49 +11,18 @@ module OpenCode
|
|
11
11
|
end
|
12
12
|
|
13
13
|
initializer "open_code.insert_middleware" do |app|
|
14
|
-
next
|
14
|
+
next unless ::Rails.env.development? && defined?(::Rails::Server)
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
css = <<-CSS.strip_heredoc
|
20
|
-
.-gem-open-me-link {
|
21
|
-
box-sizing: border-box;
|
22
|
-
display: inline-block;
|
23
|
-
margin-left: 8px;
|
24
|
-
padding: 1px 6px;
|
25
|
-
vertical-align: middle;
|
26
|
-
border: 1px solid #FFCCCB;
|
27
|
-
color: #C52E23;
|
28
|
-
border-radius: 4px;
|
29
|
-
text-decoration: none;
|
30
|
-
}
|
31
|
-
.-gem-open-me-link:hover {
|
32
|
-
border-color: #C52E23;
|
33
|
-
}
|
34
|
-
CSS
|
16
|
+
editor = (ENV['FORCE_OPEN_CODE_EDITOR'].presence || cfg.editor).to_s.downcase
|
17
|
+
place_holder = ENV['FORCE_OPEN_CODE_PLACE_HOLDER'].presence || cfg.place_holder
|
18
|
+
root_dir = ENV['FORCE_OPEN_CODE_ROOT_DIR'].presence || cfg.root_dir
|
35
19
|
|
36
20
|
cfg = config.open_code
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
padding: 3px;
|
42
|
-
}
|
43
|
-
.-gem-open-me-link::after {
|
44
|
-
display: block;
|
45
|
-
content: '';
|
46
|
-
width: 12px;
|
47
|
-
height: 12px;
|
48
|
-
background-image: url('data:image/svg+xml;base64,#{b64}');
|
49
|
-
}
|
50
|
-
CSS
|
51
|
-
end
|
21
|
+
cfg.editor = editor.presence || 'vscode'
|
22
|
+
cfg.place_holder = place_holder
|
23
|
+
cfg.root_dir = (root_dir.presence || ::Rails.root).to_s.tr('\\', '/').chomp('/')
|
24
|
+
next unless Middleware.loadable?(cfg)
|
52
25
|
|
53
|
-
Middleware.css = css.freeze
|
54
|
-
Middleware.place_holder = cfg.place_holder
|
55
|
-
Middleware.root_dir = (cfg.root_dir.presence || ::Rails.root).to_s.tr('\\', '/').chomp('/')
|
56
|
-
Middleware.scheme = cfg.editor.presence || 'vscode'
|
57
26
|
app.middleware.insert_before(ActionDispatch::DebugExceptions, Middleware)
|
58
27
|
end
|
59
28
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 261 260" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" version="1.1" id="svg4" sodipodi:docname="vscode.svg" inkscape:version="0.92.2 (unknown)">
|
3
|
+
<metadata id="metadata10">
|
4
|
+
<rdf:RDF>
|
5
|
+
<cc:Work rdf:about="">
|
6
|
+
<dc:format>image/svg+xml</dc:format>
|
7
|
+
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
8
|
+
<dc:title/>
|
9
|
+
</cc:Work>
|
10
|
+
</rdf:RDF>
|
11
|
+
</metadata>
|
12
|
+
<defs id="defs8"/>
|
13
|
+
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1360" inkscape:window-height="722" id="namedview6" showgrid="false" inkscape:zoom="0.64183539" inkscape:cx="112.48701" inkscape:cy="128.72041" inkscape:window-x="0" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg4"/>
|
14
|
+
<path d="M 195.47461 -0.005859375 L 195.47461 223.29688 L 0.49609375 194.33789 L 195.47461 259.99219 L 260.47461 232.95312 L 260.47461 31.064453 L 260.49609 31.054688 L 260.47461 31.011719 L 260.47461 27.035156 L 195.47461 -0.005859375 z " id="path951" style="fill:#C52E23;fill-opacity:1"/>
|
15
|
+
<path d="M 127.24219 38.037109 L 67.521484 97.070312 L 31.566406 69.992188 L 16.748047 74.941406 L 53.328125 111.10156 L 16.748047 147.25977 L 31.566406 152.21094 L 67.521484 125.13086 L 67.523438 125.13086 L 127.24023 184.16016 L 163.00781 168.96289 L 163.00781 53.234375 L 127.24219 38.037109 z M 127.24023 80.158203 L 127.24023 142.03711 L 86.154297 111.09766 L 127.24023 80.158203 z " id="path887" style="fill:#C52E23;fill-opacity:1"/>
|
16
|
+
</svg>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: open_code-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -112,10 +112,10 @@ files:
|
|
112
112
|
- README.md
|
113
113
|
- Rakefile
|
114
114
|
- lib/open_code/rails.rb
|
115
|
-
- lib/open_code/rails/const_assets.rb
|
116
115
|
- lib/open_code/rails/middleware.rb
|
117
116
|
- lib/open_code/rails/railtie.rb
|
118
117
|
- lib/open_code/rails/version.rb
|
118
|
+
- lib/open_code/rails/vscode.svg
|
119
119
|
- open_code-rails.gemspec
|
120
120
|
homepage: https://github.com/eGust/open_code-rails
|
121
121
|
licenses: []
|
@@ -135,8 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: '0'
|
137
137
|
requirements: []
|
138
|
-
|
139
|
-
rubygems_version: 2.7.6
|
138
|
+
rubygems_version: 3.0.3
|
140
139
|
signing_key:
|
141
140
|
specification_version: 4
|
142
141
|
summary: Open file in editor in Rails exception pages
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module OpenCode
|
2
|
-
module Rails
|
3
|
-
module ConstAssets
|
4
|
-
ICONS = {
|
5
|
-
vscode: <<-XML.strip_heredoc,
|
6
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
7
|
-
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 261 260" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" version="1.1" id="svg4" sodipodi:docname="vscode.svg" inkscape:version="0.92.2 (unknown)">
|
8
|
-
<metadata id="metadata10">
|
9
|
-
<rdf:RDF>
|
10
|
-
<cc:Work rdf:about="">
|
11
|
-
<dc:format>image/svg+xml</dc:format>
|
12
|
-
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
13
|
-
<dc:title/>
|
14
|
-
</cc:Work>
|
15
|
-
</rdf:RDF>
|
16
|
-
</metadata>
|
17
|
-
<defs id="defs8"/>
|
18
|
-
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1360" inkscape:window-height="722" id="namedview6" showgrid="false" inkscape:zoom="0.64183539" inkscape:cx="112.48701" inkscape:cy="128.72041" inkscape:window-x="0" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg4"/>
|
19
|
-
<path d="M 195.47461 -0.005859375 L 195.47461 223.29688 L 0.49609375 194.33789 L 195.47461 259.99219 L 260.47461 232.95312 L 260.47461 31.064453 L 260.49609 31.054688 L 260.47461 31.011719 L 260.47461 27.035156 L 195.47461 -0.005859375 z " id="path951" style="fill:#C52E23;fill-opacity:1"/>
|
20
|
-
<path d="M 127.24219 38.037109 L 67.521484 97.070312 L 31.566406 69.992188 L 16.748047 74.941406 L 53.328125 111.10156 L 16.748047 147.25977 L 31.566406 152.21094 L 67.521484 125.13086 L 67.523438 125.13086 L 127.24023 184.16016 L 163.00781 168.96289 L 163.00781 53.234375 L 127.24219 38.037109 z M 127.24023 80.158203 L 127.24023 142.03711 L 86.154297 111.09766 L 127.24023 80.158203 z " id="path887" style="fill:#C52E23;fill-opacity:1"/>
|
21
|
-
</svg>
|
22
|
-
XML
|
23
|
-
}
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|