gorp 0.28.1 → 0.28.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.
- checksums.yaml +7 -0
- data/Rakefile +1 -0
- data/gorp.gemspec +11 -7
- data/lib/gorp.rb +1 -0
- data/lib/gorp/commands.rb +224 -95
- data/lib/gorp/edit.rb +12 -10
- data/lib/gorp/env.rb +99 -25
- data/lib/gorp/net.rb +69 -10
- data/lib/gorp/output.css +14 -6
- data/lib/gorp/output.rb +15 -15
- data/lib/gorp/rails.rb +91 -68
- data/lib/gorp/test.rb +48 -21
- data/lib/gorp/xml.rb +5 -0
- data/lib/version.rb +1 -1
- metadata +101 -101
data/lib/gorp/edit.rb
CHANGED
@@ -47,8 +47,8 @@ module Gorp
|
|
47
47
|
close = '//#END_HIGHLIGHT'
|
48
48
|
elsif self =~ /->$/
|
49
49
|
# CoffeeScript
|
50
|
-
start = '
|
51
|
-
close = '
|
50
|
+
start = '#START_HIGHLIGHT'
|
51
|
+
close = '#END_HIGHLIGHT'
|
52
52
|
else
|
53
53
|
# Other, most likely Ruby
|
54
54
|
start = '#START_HIGHLIGHT'
|
@@ -121,12 +121,12 @@ module Gorp
|
|
121
121
|
|
122
122
|
def clear_highlights
|
123
123
|
self.gsub! /^ *(\/\/#)\s*(START|END)_HIGHLIGHT\n/, ''
|
124
|
-
self.gsub!
|
124
|
+
self.gsub! /^ *(#|<!--|\/\*)\s*(START|END)_HIGHLIGHT\s*?(-->|\*\/)?\n/, ''
|
125
125
|
end
|
126
126
|
|
127
127
|
def clear_all_marks
|
128
128
|
self.gsub! /^ *(\/\/#)\s*(START|END)(_HIGHLIGHT|:\w+)\n/, ''
|
129
|
-
self.gsub!
|
129
|
+
self.gsub! /^ *(#|<!--|\/\*|\/\/#)\s*(START|END)(_HIGHLIGHT|:\w+)\s*?(-->|\*\/)?\n/, ''
|
130
130
|
end
|
131
131
|
|
132
132
|
def msub pattern, replacement, option=nil
|
@@ -161,6 +161,7 @@ module Gorp
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def edit filename, tag=nil, &block
|
164
|
+
filename = Dir[filename].first || filename if filename.include? '*'
|
164
165
|
$x.pre "edit #{filename.gsub('/',FILE_SEPARATOR)}", :class=>'stdin'
|
165
166
|
|
166
167
|
stale = File.mtime(filename) rescue Time.now-2
|
@@ -171,12 +172,13 @@ def edit filename, tag=nil, &block
|
|
171
172
|
data.extend Gorp::StringEditingFunctions
|
172
173
|
data.instance_exec(data, &block) if block_given?
|
173
174
|
|
174
|
-
#
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
175
|
+
# write the file, ensuring that the file timestamp changed
|
176
|
+
while true
|
177
|
+
open(filename,'w') {|file| file.write data}
|
178
|
+
$lastmod = File.mtime(filename)
|
179
|
+
break if $lastmod > stale and Time.now >= $lastmod
|
180
|
+
sleep 0.1
|
181
|
+
end
|
180
182
|
|
181
183
|
rescue Exception => e
|
182
184
|
$x.pre :class => 'traceback' do
|
data/lib/gorp/env.rb
CHANGED
@@ -30,9 +30,16 @@ $CODE = File.join($DATA,'code')
|
|
30
30
|
# work directory
|
31
31
|
if (work=ARGV.find {|arg| arg =~ /--work=(.*)/})
|
32
32
|
ARGV.delete(work)
|
33
|
-
|
33
|
+
work = $1
|
34
34
|
else
|
35
|
-
|
35
|
+
work = ENV['GORP_WORK'] || 'work'
|
36
|
+
end
|
37
|
+
|
38
|
+
if File.respond_to? :realpath
|
39
|
+
$WORK = File.realpath(work, $BASE)
|
40
|
+
else
|
41
|
+
require 'pathname'
|
42
|
+
$WORK = Pathname.new($BASE).join(work).realpath.to_s
|
36
43
|
end
|
37
44
|
|
38
45
|
# deduce environment based on provided Gemfile
|
@@ -51,6 +58,7 @@ if gemfile
|
|
51
58
|
end
|
52
59
|
|
53
60
|
Dir.chdir(File.dirname(gemfile)) do
|
61
|
+
exit unless File.exist? 'Gemfile.lock' or system 'bundle install'
|
54
62
|
require 'bundler/setup'
|
55
63
|
end
|
56
64
|
end
|
@@ -65,28 +73,6 @@ module Gorp
|
|
65
73
|
extend Commands
|
66
74
|
$x.pre Time.now.httpdate, :class=>'stdout'
|
67
75
|
|
68
|
-
cmd "echo $PATH"
|
69
|
-
cmd "node -v"
|
70
|
-
|
71
|
-
cmd "#{$ruby} -v"
|
72
|
-
cmd 'gem -v'
|
73
|
-
Dir.chdir(File.join($WORK, $rails_app.to_s)) do
|
74
|
-
if $bundle
|
75
|
-
cmd 'bundle show'
|
76
|
-
else
|
77
|
-
cmd 'gem list'
|
78
|
-
cmd 'echo $RUBYLIB | sed "s/:/\n/g"'
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
if File.exist? 'Gemfile'
|
83
|
-
rake 'about'
|
84
|
-
elsif File.exist? 'script/rails'
|
85
|
-
cmd 'ruby script/rails application -v'
|
86
|
-
else
|
87
|
-
cmd Gorp.which_rails($rails) + ' -v'
|
88
|
-
end
|
89
|
-
|
90
76
|
if $rails != 'rails'
|
91
77
|
Dir.chdir($rails) do
|
92
78
|
log :cmd, 'git log -1'
|
@@ -102,7 +88,95 @@ module Gorp
|
|
102
88
|
end
|
103
89
|
end
|
104
90
|
end
|
105
|
-
|
91
|
+
|
92
|
+
if File.exist? 'Gemfile'
|
93
|
+
if File.read("#$rails/RAILS_VERSION") =~ /^[34]/
|
94
|
+
cmd = 'rake about'
|
95
|
+
else
|
96
|
+
cmd = 'rails about'
|
97
|
+
end
|
98
|
+
|
99
|
+
log :cmd, cmd
|
100
|
+
$x.pre cmd, :class=>'stdin'
|
101
|
+
about = `#{cmd}`.sub(/^(Middleware\s+)(.*)/) {
|
102
|
+
term,dfn=$1,$2
|
103
|
+
term+dfn.gsub(', ', ",\n" + ' ' * term.length)
|
104
|
+
}
|
105
|
+
about.split("\n").each {|line| $x.pre line, :class => :stdout}
|
106
|
+
elsif File.exist? 'script/rails'
|
107
|
+
cmd 'ruby script/rails application -v'
|
108
|
+
else
|
109
|
+
cmd Gorp.which_rails($rails) + ' -v'
|
110
|
+
end
|
111
|
+
|
112
|
+
Dir.chdir(File.join($WORK, $rails_app.to_s)) do
|
113
|
+
if $bundle
|
114
|
+
cmd 'bundle show'
|
115
|
+
else
|
116
|
+
cmd 'gem list'
|
117
|
+
cmd 'echo $RUBYLIB | sed "s/:/\n/g"'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
cmd 'gem -v'
|
122
|
+
cmd "#{$ruby} -v"
|
123
|
+
|
124
|
+
if not `which rvm`.empty?
|
125
|
+
if ENV['rvm_version']
|
126
|
+
cmd "echo $rvm_version", :as => 'rvm -v'
|
127
|
+
else
|
128
|
+
cmd "rvm -v | grep '\\S'", :as => 'rvm -v'
|
129
|
+
end
|
130
|
+
elsif not `which rbenv`.empty?
|
131
|
+
cmd "rbenv --version"
|
132
|
+
end
|
133
|
+
|
134
|
+
if not `which nodejs`.empty?
|
135
|
+
cmd "nodejs -v"
|
136
|
+
elsif not `which node`.empty?
|
137
|
+
cmd "node -v"
|
138
|
+
end
|
139
|
+
|
140
|
+
if not `which mysql`.empty?
|
141
|
+
cmd "mysql --version"
|
142
|
+
end
|
143
|
+
|
144
|
+
log :cmd, 'echo $PATH'
|
145
|
+
$x.pre 'echo $PATH', :class=>'stdin'
|
146
|
+
ENV['PATH'].split(':').each {|path| $x.pre path, :class => :stdout}
|
147
|
+
|
148
|
+
if not `which lsb_release`.empty?
|
149
|
+
cmd "lsb_release -irc"
|
150
|
+
elsif File.exist? '/etc/debian_version'
|
151
|
+
cmd 'cat /etc/debian_version'
|
152
|
+
end
|
153
|
+
|
154
|
+
if not `which sw_vers`.empty?
|
155
|
+
cmd "sw_vers"
|
156
|
+
end
|
157
|
+
|
158
|
+
if not `which uname`.empty?
|
159
|
+
cmd "uname -srm"
|
160
|
+
end
|
161
|
+
|
162
|
+
config = Gorp::Config.get
|
163
|
+
if config and not config.empty?
|
164
|
+
$x.pre 'Gorp.config.get', :class=>'stdin'
|
165
|
+
$x.table do
|
166
|
+
config.sort.each do |name, value|
|
167
|
+
$x.tr do
|
168
|
+
$x.td name
|
169
|
+
$x.td value.inspect
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
rescue Exception => e
|
175
|
+
$x.pre :class => 'traceback' do
|
176
|
+
STDERR.puts e.inspect
|
177
|
+
$x.text! "#{e.inspect}\n"
|
178
|
+
e.backtrace.each {|line| $x.text! " #{line}\n"}
|
179
|
+
end
|
106
180
|
end
|
107
181
|
|
108
182
|
def self.log type, message
|
data/lib/gorp/net.rb
CHANGED
@@ -1,7 +1,32 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'cgi'
|
3
|
+
require 'http-cookie'
|
4
|
+
|
5
|
+
$COOKIEJAR = HTTP::CookieJar.new
|
6
|
+
$CookieDebug = Gorp::Config[:cookie_debug, true]
|
7
|
+
|
8
|
+
def update_cookies(uri, response)
|
9
|
+
fields = response.get_fields('Set-Cookie')
|
10
|
+
return unless fields
|
11
|
+
fields.each {|value| $COOKIEJAR.parse(value, uri)}
|
12
|
+
|
13
|
+
if $CookieDebug
|
14
|
+
$x.ul do
|
15
|
+
fields.each do |value|
|
16
|
+
$x.li do
|
17
|
+
$x.b {$x.em '[cookie]'}
|
18
|
+
$x.text! value.to_s
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
3
24
|
|
4
25
|
def snap response, form=nil
|
26
|
+
if response.code >= '400'
|
27
|
+
$x.p "HTTP Response Code: #{response.code}", :class => 'traceback'
|
28
|
+
end
|
29
|
+
|
5
30
|
if response.content_type == 'text/plain' or response.content_type =~ /xml/
|
6
31
|
$x.div :class => 'body' do
|
7
32
|
response.body.split("\n").each do |line|
|
@@ -72,8 +97,18 @@ def snap response, form=nil
|
|
72
97
|
attrs[:id] = body['id'] if body['id']
|
73
98
|
attrs[:class] += ' ' +body['class'] if body['class']
|
74
99
|
$x.div(attrs) do
|
100
|
+
html_voids = %w(area base br col command embed hr img input keygen link
|
101
|
+
meta param source)
|
102
|
+
|
75
103
|
body.children.each do |child|
|
76
|
-
|
104
|
+
next if child.instance_of?(Comment)
|
105
|
+
child.search("//*").each do |element|
|
106
|
+
next if html_voids.include? element.name
|
107
|
+
if element.children.empty? and element.text.empty?
|
108
|
+
element.add_child(Nokogiri::XML::Text.new('', element.document))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
$x << child.to_xml
|
77
112
|
end
|
78
113
|
end
|
79
114
|
$x.div '', :style => "clear: both"
|
@@ -84,6 +119,7 @@ def get path, options={}
|
|
84
119
|
end
|
85
120
|
|
86
121
|
def post path, form, options={}
|
122
|
+
$lastmod ||= Time.now
|
87
123
|
log :get, path unless form
|
88
124
|
$x.pre "get #{path}", :class=>'stdin' unless options[:snapget] == false
|
89
125
|
|
@@ -99,12 +135,13 @@ def post path, form, options={}
|
|
99
135
|
accept = 'application/json' if path =~ /\.json$/
|
100
136
|
accept = 'application/xml' if path =~ /\.xml$/
|
101
137
|
|
138
|
+
uri = URI.parse("http://#{host}:#{port}/#{path}")
|
102
139
|
get = Net::HTTP::Get.new(path, 'Accept' => accept)
|
103
140
|
get.basic_auth *options[:auth] if options[:auth]
|
104
|
-
get['Cookie'] = $
|
141
|
+
get['Cookie'] = HTTP::Cookie.cookie_value($COOKIEJAR.cookies(uri))
|
105
142
|
response = http.request(get)
|
106
143
|
snap response, form unless options[:snapget] == false
|
107
|
-
|
144
|
+
update_cookies uri, response
|
108
145
|
|
109
146
|
if form
|
110
147
|
body = xhtmlparse(response.body).at('//body') rescue nil
|
@@ -154,34 +191,56 @@ def post path, form, options={}
|
|
154
191
|
|
155
192
|
$x.ul do
|
156
193
|
form.each do |name, value|
|
157
|
-
$x.li "#{name} => #{value}"
|
194
|
+
$x.li "#{name} => #{value}" unless $CookieDebug
|
158
195
|
end
|
159
196
|
|
160
197
|
xform.search('.//input[@type="hidden"]').each do |element|
|
161
|
-
|
198
|
+
if $CookieDebug
|
199
|
+
$x.li "#{element['name']} => #{element['value']}"
|
200
|
+
end
|
162
201
|
form[element['name']] ||= element['value']
|
163
202
|
end
|
203
|
+
|
204
|
+
if $CookieDebug
|
205
|
+
uri = URI.parse("http://#{host}:#{port}/#{path}")
|
206
|
+
$COOKIEJAR.cookies(uri).each do |cookie|
|
207
|
+
$x.li do
|
208
|
+
$x.b {$x.em '[cookie]'}
|
209
|
+
$x.text! cookie.to_s
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
164
213
|
end
|
165
214
|
|
166
215
|
log :post, path
|
216
|
+
uri = URI.parse("http://#{host}:#{port}/#{path}")
|
167
217
|
post = Net::HTTP::Post.new(path)
|
168
|
-
post.
|
169
|
-
post['
|
218
|
+
post.set_form_data form
|
219
|
+
post['Content-Type'] = 'application/x-www-form-urlencoded'
|
220
|
+
post['Cookie'] = HTTP::Cookie.cookie_value($COOKIEJAR.cookies(uri))
|
170
221
|
response=http.request(post)
|
171
222
|
snap response
|
223
|
+
update_cookies uri, response
|
172
224
|
end
|
173
225
|
|
174
226
|
if response.code == '302'
|
175
|
-
$COOKIE=response.response['set-cookie'] if response.response['set-cookie']
|
176
227
|
path = response['Location']
|
228
|
+
uri = URI.parse("http://#{host}:#{port}/#{path}")
|
177
229
|
$x.pre "get #{path}", :class=>'stdin'
|
178
230
|
get = Net::HTTP::Get.new(path, 'Accept' => accept)
|
179
|
-
get['Cookie'] = $
|
231
|
+
get['Cookie'] = HTTP::Cookie.cookie_value($COOKIEJAR.cookies(uri))
|
180
232
|
response = http.request(get)
|
181
233
|
snap response
|
182
|
-
|
234
|
+
update_cookies uri, response
|
183
235
|
end
|
184
236
|
end
|
185
237
|
rescue Timeout::Error
|
186
238
|
Gorp::Commands.stop_server(false, 9)
|
239
|
+
ensure
|
240
|
+
while true
|
241
|
+
open('tmp/lastmod', 'w') {|file| file.write 'data'}
|
242
|
+
break if File.mtime('tmp/lastmod') > $lastmod
|
243
|
+
sleep 0.1
|
244
|
+
end
|
245
|
+
File.unlink('tmp/lastmod')
|
187
246
|
end
|
data/lib/gorp/output.css
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
body {background-color: #F5F5DC}
|
2
|
+
body.awdwr a {text-decoration: none}
|
3
|
+
body.awdwr ul {padding-left: 1em}
|
2
4
|
#banner {margin-top: 0}
|
3
5
|
pre {font-weight: bold; margin: 0; padding: 0}
|
4
|
-
pre.stdin {color: #800080; margin-top: 1em; padding: 0}
|
6
|
+
pre.stdin, pre.stdin a {color: #800080; margin-top: 1em; padding: 0}
|
7
|
+
pre.stdin a:hover {background-color: #F5F5DC; text-decoration: underline}
|
5
8
|
pre.irb {color: #800080; padding: 0}
|
6
9
|
pre.stdout {color: #000; padding: 0}
|
7
10
|
pre.logger {color: #088; padding: 0}
|
@@ -10,17 +13,22 @@ pre.stderr {color: #F00; padding: 0}
|
|
10
13
|
div.body {border-style: solid; border-color: #800080; padding: 0.5em}
|
11
14
|
.issue, .traceback {background:#FDD; border: 4px solid #F00;
|
12
15
|
font-weight: bold; margin-top: 1em; padding: 0.5em}
|
13
|
-
div.body, .issue, .traceback {
|
14
|
-
-webkit-border-radius: 0.7em; -moz-border-radius: 0.7em;}
|
16
|
+
div.body, .issue, .traceback {border-radius: 0.7em}
|
15
17
|
ul.toc {list-style: none}
|
16
18
|
ul a {text-decoration: none}
|
17
19
|
ul a:hover {text-decoration: underline; color: #000;
|
18
20
|
background-color: #F5F5DC}
|
19
21
|
a.toc h2 {background-color: #981A21; color:#FFF; padding: 6px}
|
20
22
|
ul a:visited {color: #000}
|
21
|
-
h2 {clear: both}
|
22
23
|
p.note {font-style: italic}
|
23
24
|
p.overview {border-width: 2px; border-color: #000;
|
24
25
|
border-style: solid; border-radius: 4em;
|
25
|
-
background-color: #CCF; margin: 1.5em 1.5em; padding: 1em 2em;
|
26
|
-
|
26
|
+
background-color: #CCF; margin: 1.5em 1.5em; padding: 1em 2em;}
|
27
|
+
.hidden {display: none}
|
28
|
+
.traceback #container {background-color: #FFF}
|
29
|
+
.traceback .line {background-color: #FFF}
|
30
|
+
.traceback .line.active {background-color: #FCC}
|
31
|
+
.traceback .source {background-color: #EEE}
|
32
|
+
.traceback pre {background-color: #FFF; display: block; margin: 0.5em 0}
|
33
|
+
.traceback pre.line_numbers {background-color: #EEE; text-align: right}
|
34
|
+
.traceback h1 {background-color: #F00; color: #FFF; padding: 1em; margin: 0}
|
data/lib/gorp/output.rb
CHANGED
@@ -9,7 +9,7 @@ at_exit do
|
|
9
9
|
|
10
10
|
$x.declare! :DOCTYPE, :html
|
11
11
|
$x.html :xmlns => 'http://www.w3.org/1999/xhtml' do
|
12
|
-
$x.
|
12
|
+
$x.head do
|
13
13
|
$x.title $title
|
14
14
|
$x.meta 'charset'=>'utf-8'
|
15
15
|
$x.style :type => "text/css" do
|
@@ -18,8 +18,8 @@ at_exit do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
22
|
-
$x.body do
|
21
|
+
|
22
|
+
$x.body class: 'awdwr' do
|
23
23
|
$x.h1 $title, :id=>'banner'
|
24
24
|
$x.h2 'Table of Contents'
|
25
25
|
$x.ul :class => 'toc'
|
@@ -42,34 +42,34 @@ at_exit do
|
|
42
42
|
restart_server
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# run steps
|
47
47
|
e = nil
|
48
48
|
begin
|
49
49
|
$sections.each do |section, title, steps|
|
50
|
-
|
51
|
-
|
50
|
+
omit = secinclude($omit, section)
|
51
|
+
omit ||= (!ranges.empty? and !secinclude(ranges, section))
|
52
52
|
|
53
|
-
|
53
|
+
if omit
|
54
54
|
$x.a(:class => 'omit', :id => "section-#{section}") do
|
55
55
|
$x.comment! title
|
56
56
|
end
|
57
57
|
else
|
58
|
-
|
59
|
-
|
58
|
+
section_head section, title
|
59
|
+
steps.call
|
60
60
|
end
|
61
61
|
end
|
62
62
|
rescue Exception => e
|
63
63
|
$x.pre :class => 'traceback' do
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
STDERR.puts e.inspect
|
65
|
+
$x.text! "#{e.inspect}\n"
|
66
|
+
e.backtrace.each {|line| $x.text! " #{line}\n"}
|
67
67
|
end
|
68
68
|
ensure
|
69
69
|
if e.class != SystemExit
|
70
70
|
# terminate server
|
71
71
|
Gorp::Commands.stop_server
|
72
|
-
|
72
|
+
|
73
73
|
# optionally save a snapshot
|
74
74
|
if ARGV.include?('save') or ARGV.include? '--save'
|
75
75
|
log :snap, 'save'
|
@@ -87,7 +87,7 @@ at_exit do
|
|
87
87
|
$x.ul :class => 'todos'
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# output results as HTML, after inserting style and toc information
|
92
92
|
$x.target![/<style.*?>()/,1] = "\n#{$style.target!.strip.gsub(/^/,' '*6)}\n"
|
93
93
|
$x.target!.sub! /<ul class="toc"\/>/,
|
@@ -102,7 +102,7 @@ at_exit do
|
|
102
102
|
# run tests
|
103
103
|
if $checker
|
104
104
|
Gorp.log :CHECK, "#{$output}.html"
|
105
|
-
Dir.chdir $
|
105
|
+
Dir.chdir $WORK
|
106
106
|
STDOUT.puts
|
107
107
|
if $checker.respond_to? :call
|
108
108
|
$checker.call
|