gorp 0.17.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- data/gorp.gemspec +4 -4
- data/lib/gorp.rb +2 -241
- data/lib/gorp/commands.rb +164 -0
- data/lib/gorp/output.rb +163 -0
- data/lib/gorp/rails.env +37 -0
- data/lib/gorp/rails.rb +139 -96
- data/lib/gorp/test.rb +4 -4
- data/lib/gorp/xml.rb +96 -0
- data/lib/version.rb +1 -1
- metadata +10 -2
data/gorp.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{gorp}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.18.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Sam Ruby"]
|
9
|
-
s.date = %q{
|
9
|
+
s.date = %q{2010-01-01}
|
10
10
|
s.description = %q{ Enables the creation of scenarios that involve creating a rails project,
|
11
11
|
starting and stoppping of servers, generating projects, editing files,
|
12
12
|
issuing http requests, running of commands, etc. Output is captured as
|
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
|
|
16
16
|
assertions based on selections (typically CSS) against the generated HTML.
|
17
17
|
}
|
18
18
|
s.email = %q{rubys@intertwingly.net}
|
19
|
-
s.extra_rdoc_files = ["README", "lib/gorp.rb", "lib/gorp/edit.rb", "lib/gorp/env.rb", "lib/gorp/net.rb", "lib/gorp/rails.rb", "lib/gorp/test.rb", "lib/version.rb"]
|
20
|
-
s.files = ["Manifest", "README", "Rakefile", "gorp.gemspec", "lib/gorp.rb", "lib/gorp/edit.rb", "lib/gorp/env.rb", "lib/gorp/net.rb", "lib/gorp/rails.rb", "lib/gorp/test.rb", "lib/version.rb"]
|
19
|
+
s.extra_rdoc_files = ["README", "lib/gorp.rb", "lib/gorp/commands.rb", "lib/gorp/edit.rb", "lib/gorp/env.rb", "lib/gorp/net.rb", "lib/gorp/output.rb", "lib/gorp/rails.env", "lib/gorp/rails.rb", "lib/gorp/test.rb", "lib/gorp/xml.rb", "lib/version.rb"]
|
20
|
+
s.files = ["Manifest", "README", "Rakefile", "gorp.gemspec", "lib/gorp.rb", "lib/gorp/commands.rb", "lib/gorp/edit.rb", "lib/gorp/env.rb", "lib/gorp/net.rb", "lib/gorp/output.rb", "lib/gorp/rails.env", "lib/gorp/rails.rb", "lib/gorp/test.rb", "lib/gorp/xml.rb", "lib/version.rb"]
|
21
21
|
s.homepage = %q{http://github.com/rubys/gorp}
|
22
22
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Gorp", "--main", "README"]
|
23
23
|
s.require_paths = ["lib"]
|
data/lib/gorp.rb
CHANGED
@@ -4,15 +4,15 @@
|
|
4
4
|
# You have been warned.
|
5
5
|
|
6
6
|
require 'fileutils'
|
7
|
-
require 'open3'
|
8
7
|
require 'builder'
|
9
|
-
require 'time'
|
10
8
|
|
11
9
|
require 'gorp/env'
|
10
|
+
require 'gorp/commands'
|
12
11
|
require 'gorp/edit'
|
13
12
|
require 'gorp/output'
|
14
13
|
require 'gorp/net'
|
15
14
|
require 'gorp/rails'
|
15
|
+
require 'gorp/xml'
|
16
16
|
|
17
17
|
require 'rbconfig'
|
18
18
|
$ruby = File.join(Config::CONFIG["bindir"], Config::CONFIG["RUBY_INSTALL_NAME"])
|
@@ -44,245 +44,6 @@ RUNFILE = File.join($WORK, 'status.run')
|
|
44
44
|
open(RUNFILE,'w') {|running| running.puts(Process.pid)}
|
45
45
|
at_exit { FileUtils.rm_f RUNFILE }
|
46
46
|
|
47
|
-
def overview message
|
48
|
-
$x.p message.gsub(/(^|\n)\s+/, ' ').strip, :class=>'overview'
|
49
|
-
end
|
50
|
-
|
51
|
-
def desc message
|
52
|
-
$x.p message, :class=>'desc'
|
53
|
-
end
|
54
|
-
|
55
|
-
def log type, message
|
56
|
-
type = type.to_s.ljust(5).upcase
|
57
|
-
STDOUT.puts Time.now.strftime("[%Y-%m-%d %H:%M:%S] #{type} #{message}")
|
58
|
-
end
|
59
|
-
|
60
|
-
def head number, title
|
61
|
-
$section = "#{number} #{title}"
|
62
|
-
log '====>', $section
|
63
|
-
|
64
|
-
$x.a(:class => 'toc', :id => "section-#{number}") {$x.h2 $section}
|
65
|
-
$toc.li {$toc.a $section, :href => "#section-#{number}"}
|
66
|
-
end
|
67
|
-
|
68
|
-
def issue text, options={}
|
69
|
-
log :issue, text
|
70
|
-
|
71
|
-
$issue+=1
|
72
|
-
$x.p :class => 'issue', :id => "issue-#{$issue}" do
|
73
|
-
$x.text! text
|
74
|
-
if options[:ticket]
|
75
|
-
$x.text! ' ('
|
76
|
-
$x.a "ticket #{options[:ticket]}", :href=>
|
77
|
-
'https://rails.lighthouseapp.com/projects/8994/tickets/' +
|
78
|
-
options[:ticket].to_s
|
79
|
-
$x.text! ')'
|
80
|
-
end
|
81
|
-
end
|
82
|
-
$todos.li do
|
83
|
-
section = $section.split(' ').first
|
84
|
-
$todos.a "Section #{section}:", :href => "#section-#{$section}"
|
85
|
-
$todos.a "#{text}", :href => "#issue-#{$issue}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def db statement, hilight=[]
|
90
|
-
log :db, statement
|
91
|
-
$x.pre "sqlite3> #{statement}", :class=>'stdin'
|
92
|
-
cmd = "sqlite3 --line db/development.sqlite3 #{statement.inspect}"
|
93
|
-
popen3 cmd, hilight
|
94
|
-
end
|
95
|
-
|
96
|
-
def ruby args
|
97
|
-
cmd "ruby #{args}"
|
98
|
-
end
|
99
|
-
|
100
|
-
def console script
|
101
|
-
open('tmp/irbrc','w') {|file| file.write('IRB.conf[:PROMPT_MODE]=:SIMPLE')}
|
102
|
-
cmd "echo #{script.inspect} | IRBRC=tmp/irbrc ruby script/console"
|
103
|
-
FileUtils.rm_rf 'tmp/irbrc'
|
104
|
-
end
|
105
|
-
|
106
|
-
def cmd args, hilight=[]
|
107
|
-
log :cmd, args
|
108
|
-
$x.pre args, :class=>'stdin'
|
109
|
-
if args == 'rake db:migrate'
|
110
|
-
Dir.chdir 'db/migrate' do
|
111
|
-
date = '20100301000000'
|
112
|
-
Dir['[0-9]*'].sort_by {|file| file=~/201003/?file:'x'+file}.each do |file|
|
113
|
-
file =~ /^([0-9]*)_(.*)$/
|
114
|
-
FileUtils.mv file, "#{date}_#{$2}" unless $1 == date.next!
|
115
|
-
$x.pre "mv #{file} #{date}_#{$2}" unless $1 == date
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
args += ' -C' if args == 'ls -p'
|
120
|
-
popen3 args, hilight
|
121
|
-
end
|
122
|
-
|
123
|
-
def popen3 args, hilight=[]
|
124
|
-
Open3.popen3(args) do |pin, pout, perr|
|
125
|
-
terr = Thread.new do
|
126
|
-
$x.pre perr.readline.chomp, :class=>'stderr' until perr.eof?
|
127
|
-
end
|
128
|
-
pin.close
|
129
|
-
until pout.eof?
|
130
|
-
line = pout.readline
|
131
|
-
if hilight.any? {|pattern| line.include? pattern}
|
132
|
-
outclass='hilight'
|
133
|
-
elsif line =~ /\x1b\[\d/
|
134
|
-
line.gsub! /\x1b\[1m\x1b\[3\dm(.*?)\x1b\[0m/, '\1'
|
135
|
-
outclass = 'logger'
|
136
|
-
else
|
137
|
-
outclass='stdout'
|
138
|
-
end
|
139
|
-
|
140
|
-
if line.strip.size == 0
|
141
|
-
$x.pre ' ', :class=>outclass
|
142
|
-
else
|
143
|
-
$x.pre line.chomp, :class=>outclass
|
144
|
-
end
|
145
|
-
end
|
146
|
-
terr.join
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def irb file
|
151
|
-
$x.pre "irb #{file}", :class=>'stdin'
|
152
|
-
log :irb, file
|
153
|
-
cmd = "irb -f -rubygems -r ./config/boot --prompt-mode simple #{$CODE}/#{file}"
|
154
|
-
Open3.popen3(cmd) do |pin, pout, perr|
|
155
|
-
terr = Thread.new do
|
156
|
-
until perr.eof?
|
157
|
-
line = perr.readline.chomp
|
158
|
-
line.gsub! /\x1b\[4(;\d+)*m(.*?)\x1b\[0m/, '\2'
|
159
|
-
line.gsub! /\x1b\[0(;\d+)*m(.*?)\x1b\[0m/, '\2'
|
160
|
-
line.gsub! /\x1b\[0(;\d+)*m/, ''
|
161
|
-
$x.pre line, :class=>'stderr'
|
162
|
-
end
|
163
|
-
end
|
164
|
-
pin.close
|
165
|
-
prompt = nil
|
166
|
-
until pout.eof?
|
167
|
-
line = pout.readline
|
168
|
-
if line =~ /^([?>]>)\s*#\s*(START|END):/
|
169
|
-
prompt = $1
|
170
|
-
elsif line =~ /^([?>]>)\s+$/
|
171
|
-
$x.pre ' ', :class=>'irb'
|
172
|
-
prompt ||= $1
|
173
|
-
elsif line =~ /^([?>]>)(.*)\n/
|
174
|
-
prompt ||= $1
|
175
|
-
$x.pre prompt + $2, :class=>'irb'
|
176
|
-
prompt = nil
|
177
|
-
elsif line =~ /^\w+(::\w+)*: /
|
178
|
-
$x.pre line.chomp, :class=>'stderr'
|
179
|
-
elsif line =~ /^\s+from [\/.:].*:\d+:in `\w.*'\s*$/
|
180
|
-
$x.pre line.chomp, :class=>'stderr'
|
181
|
-
else
|
182
|
-
$x.pre line.chomp, :class=>'stdout'
|
183
|
-
end
|
184
|
-
end
|
185
|
-
terr.join
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
# pluggable XML parser support
|
190
|
-
begin
|
191
|
-
raise LoadError if ARGV.include? 'rexml'
|
192
|
-
require 'nokogiri'
|
193
|
-
def xhtmlparse(text)
|
194
|
-
Nokogiri::HTML(text)
|
195
|
-
end
|
196
|
-
Comment=Nokogiri::XML::Comment
|
197
|
-
rescue LoadError
|
198
|
-
require 'rexml/document'
|
199
|
-
|
200
|
-
HTML_VOIDS = %w(area base br col command embed hr img input keygen link meta
|
201
|
-
param source)
|
202
|
-
|
203
|
-
def xhtmlparse(text)
|
204
|
-
begin
|
205
|
-
require 'htmlentities'
|
206
|
-
text.gsub! '&', '&'
|
207
|
-
text.gsub! '<', '&lt;'
|
208
|
-
text.gsub! '>', '&gt;'
|
209
|
-
text.gsub! ''', '&apos;'
|
210
|
-
text.gsub! '"', '&quot;'
|
211
|
-
text.force_encoding('utf-8') if text.respond_to? :force_encoding
|
212
|
-
text = HTMLEntities.new.decode(text)
|
213
|
-
rescue LoadError
|
214
|
-
end
|
215
|
-
doc = REXML::Document.new(text)
|
216
|
-
doc.get_elements('//*[not(* or text())]').each do |e|
|
217
|
-
e.text='' unless HTML_VOIDS.include? e.name
|
218
|
-
end
|
219
|
-
doc
|
220
|
-
end
|
221
|
-
|
222
|
-
class REXML::Element
|
223
|
-
def has_attribute? name
|
224
|
-
self.attributes.has_key? name
|
225
|
-
end
|
226
|
-
|
227
|
-
def at xpath
|
228
|
-
self.elements[xpath]
|
229
|
-
end
|
230
|
-
|
231
|
-
def search xpath
|
232
|
-
self.elements.to_a(xpath)
|
233
|
-
end
|
234
|
-
|
235
|
-
def content=(string)
|
236
|
-
self.text=string
|
237
|
-
end
|
238
|
-
|
239
|
-
def [](index)
|
240
|
-
if index.instance_of? String
|
241
|
-
self.attributes[index]
|
242
|
-
else
|
243
|
-
super(index)
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
def []=(index, value)
|
248
|
-
if index.instance_of? String
|
249
|
-
self.attributes[index] = value
|
250
|
-
else
|
251
|
-
super(index, value)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
module REXML::Node
|
257
|
-
def before(node)
|
258
|
-
self.parent.insert_before(self, node)
|
259
|
-
end
|
260
|
-
|
261
|
-
def add_previous_sibling(node)
|
262
|
-
self.parent.insert_before(self, node)
|
263
|
-
end
|
264
|
-
|
265
|
-
def to_xml
|
266
|
-
self.to_s
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
# monkey patch for Ruby 1.8.6
|
271
|
-
doc = REXML::Document.new '<doc xmlns="ns"><item name="foo"/></doc>'
|
272
|
-
if not doc.root.elements["item[@name='foo']"]
|
273
|
-
class REXML::Element
|
274
|
-
def attribute( name, namespace=nil )
|
275
|
-
prefix = nil
|
276
|
-
prefix = namespaces.index(namespace) if namespace
|
277
|
-
prefix = nil if prefix == 'xmlns'
|
278
|
-
attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" )
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
Comment = REXML::Comment
|
284
|
-
end
|
285
|
-
|
286
47
|
def secsplit section
|
287
48
|
section.to_s.split('.').map {|n| n.to_i}
|
288
49
|
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'open3'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module Gorp
|
6
|
+
module Commands
|
7
|
+
def overview message
|
8
|
+
$x.p message.gsub(/(^|\n)\s+/, ' ').strip, :class=>'overview'
|
9
|
+
end
|
10
|
+
|
11
|
+
def desc message
|
12
|
+
$x.p message, :class=>'desc'
|
13
|
+
end
|
14
|
+
|
15
|
+
def log type, message
|
16
|
+
type = type.to_s.ljust(5).upcase
|
17
|
+
STDOUT.puts Time.now.strftime("[%Y-%m-%d %H:%M:%S] #{type} #{message}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def head number, title
|
21
|
+
$section = "#{number} #{title}"
|
22
|
+
log '====>', $section
|
23
|
+
|
24
|
+
$x.a(:class => 'toc', :id => "section-#{number}") {$x.h2 $section}
|
25
|
+
$toc.li {$toc.a $section, :href => "#section-#{number}"}
|
26
|
+
end
|
27
|
+
|
28
|
+
def issue text, options={}
|
29
|
+
log :issue, text
|
30
|
+
|
31
|
+
$issue+=1
|
32
|
+
$x.p :class => 'issue', :id => "issue-#{$issue}" do
|
33
|
+
$x.text! text
|
34
|
+
if options[:ticket]
|
35
|
+
$x.text! ' ('
|
36
|
+
$x.a "ticket #{options[:ticket]}", :href=>
|
37
|
+
'https://rails.lighthouseapp.com/projects/8994/tickets/' +
|
38
|
+
options[:ticket].to_s
|
39
|
+
$x.text! ')'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
$todos.li do
|
43
|
+
section = $section.split(' ').first
|
44
|
+
$todos.a "Section #{section}:", :href => "#section-#{$section}"
|
45
|
+
$todos.a "#{text}", :href => "#issue-#{$issue}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def db statement, hilight=[]
|
50
|
+
log :db, statement
|
51
|
+
$x.pre "sqlite3> #{statement}", :class=>'stdin'
|
52
|
+
cmd = "sqlite3 --line db/development.sqlite3 #{statement.inspect}"
|
53
|
+
popen3 cmd, hilight
|
54
|
+
end
|
55
|
+
|
56
|
+
def ruby args
|
57
|
+
cmd "ruby #{args}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def rake args
|
61
|
+
cmd "rake #{args}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def console script
|
65
|
+
open('tmp/irbrc','w') {|fh| fh.write('IRB.conf[:PROMPT_MODE]=:SIMPLE')}
|
66
|
+
cmd "echo #{script.inspect} | IRBRC=tmp/irbrc ruby script/console"
|
67
|
+
FileUtils.rm_rf 'tmp/irbrc'
|
68
|
+
end
|
69
|
+
|
70
|
+
def cmd args, hilight=[]
|
71
|
+
x = $x
|
72
|
+
log :cmd, args
|
73
|
+
$x = Builder::XmlMarkup.new(:indent => 2) if block_given?
|
74
|
+
$x.pre args, :class=>'stdin'
|
75
|
+
if args == 'rake db:migrate'
|
76
|
+
Dir.chdir 'db/migrate' do
|
77
|
+
date = '20100301000000'
|
78
|
+
Dir['[0-9]*'].sort_by {|fn| fn=~/201003/ ? fn : 'x'+fn}.each do |file|
|
79
|
+
file =~ /^([0-9]*)_(.*)$/
|
80
|
+
FileUtils.mv file, "#{date}_#{$2}" unless $1 == date.next!
|
81
|
+
$x.pre "mv #{file} #{date}_#{$2}" unless $1 == date
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
args += ' -C' if args == 'ls -p'
|
86
|
+
popen3 args, hilight
|
87
|
+
if block_given?
|
88
|
+
p $x.target!
|
89
|
+
@raw = $x.target!
|
90
|
+
@selected = HTML::Document.new(@raw).root.children
|
91
|
+
yield
|
92
|
+
end
|
93
|
+
ensure
|
94
|
+
$x = x
|
95
|
+
end
|
96
|
+
|
97
|
+
def popen3 args, hilight=[]
|
98
|
+
Open3.popen3(args) do |pin, pout, perr|
|
99
|
+
terr = Thread.new do
|
100
|
+
$x.pre perr.readline.chomp, :class=>'stderr' until perr.eof?
|
101
|
+
end
|
102
|
+
pin.close
|
103
|
+
until pout.eof?
|
104
|
+
line = pout.readline
|
105
|
+
if hilight.any? {|pattern| line.include? pattern}
|
106
|
+
outclass='hilight'
|
107
|
+
elsif line =~ /\x1b\[\d/
|
108
|
+
line.gsub! /\x1b\[1m\x1b\[3\dm(.*?)\x1b\[0m/, '\1'
|
109
|
+
outclass = 'logger'
|
110
|
+
else
|
111
|
+
outclass='stdout'
|
112
|
+
end
|
113
|
+
|
114
|
+
if line.strip.size == 0
|
115
|
+
$x.pre ' ', :class=>outclass
|
116
|
+
else
|
117
|
+
$x.pre line.chomp, :class=>outclass
|
118
|
+
end
|
119
|
+
end
|
120
|
+
terr.join
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def irb file
|
125
|
+
$x.pre "irb #{file}", :class=>'stdin'
|
126
|
+
log :irb, file
|
127
|
+
cmd = "irb -f -rubygems -r ./config/boot --prompt-mode simple " +
|
128
|
+
"#{$CODE}/#{file}"
|
129
|
+
Open3.popen3(cmd) do |pin, pout, perr|
|
130
|
+
terr = Thread.new do
|
131
|
+
until perr.eof?
|
132
|
+
line = perr.readline.chomp
|
133
|
+
line.gsub! /\x1b\[4(;\d+)*m(.*?)\x1b\[0m/, '\2'
|
134
|
+
line.gsub! /\x1b\[0(;\d+)*m(.*?)\x1b\[0m/, '\2'
|
135
|
+
line.gsub! /\x1b\[0(;\d+)*m/, ''
|
136
|
+
$x.pre line, :class=>'stderr'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
pin.close
|
140
|
+
prompt = nil
|
141
|
+
until pout.eof?
|
142
|
+
line = pout.readline
|
143
|
+
if line =~ /^([?>]>)\s*#\s*(START|END):/
|
144
|
+
prompt = $1
|
145
|
+
elsif line =~ /^([?>]>)\s+$/
|
146
|
+
$x.pre ' ', :class=>'irb'
|
147
|
+
prompt ||= $1
|
148
|
+
elsif line =~ /^([?>]>)(.*)\n/
|
149
|
+
prompt ||= $1
|
150
|
+
$x.pre prompt + $2, :class=>'irb'
|
151
|
+
prompt = nil
|
152
|
+
elsif line =~ /^\w+(::\w+)*: /
|
153
|
+
$x.pre line.chomp, :class=>'stderr'
|
154
|
+
elsif line =~ /^\s+from [\/.:].*:\d+:in `\w.*'\s*$/
|
155
|
+
$x.pre line.chomp, :class=>'stderr'
|
156
|
+
else
|
157
|
+
$x.pre line.chomp, :class=>'stdout'
|
158
|
+
end
|
159
|
+
end
|
160
|
+
terr.join
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
data/lib/gorp/output.rb
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
at_exit do
|
5
|
+
next unless $output
|
6
|
+
|
7
|
+
$x.declare! :DOCTYPE, :html
|
8
|
+
$x.html :xmlns => 'http://www.w3.org/1999/xhtml' do
|
9
|
+
$x.header do
|
10
|
+
$x.title $title
|
11
|
+
$x.meta 'http-equiv'=>'text/html; charset=UTF-8'
|
12
|
+
$x.style :type => "text/css" do
|
13
|
+
$x.text! <<-'EOF'.unindent(2)
|
14
|
+
body {background-color: #F5F5DC}
|
15
|
+
#banner {margin-top: 0}
|
16
|
+
pre {font-weight: bold; margin: 0; padding: 0}
|
17
|
+
pre.stdin {color: #800080; margin-top: 1em; padding: 0}
|
18
|
+
pre.irb {color: #800080; padding: 0}
|
19
|
+
pre.stdout {color: #000; padding: 0}
|
20
|
+
pre.logger {color: #088; padding: 0}
|
21
|
+
pre.hilight {color: #000; background-color: #FF0; padding: 0}
|
22
|
+
pre.stderr {color: #F00; padding: 0}
|
23
|
+
div.body {border-style: solid; border-color: #800080; padding: 0.5em}
|
24
|
+
.issue, .traceback {background:#FDD; border: 4px solid #F00;
|
25
|
+
font-weight: bold; margin-top: 1em; padding: 0.5em}
|
26
|
+
div.body, .issue, .traceback {
|
27
|
+
-webkit-border-radius: 0.7em; -moz-border-radius: 0.7em;}
|
28
|
+
ul.toc {list-style: none}
|
29
|
+
ul a {text-decoration: none}
|
30
|
+
ul a:hover {text-decoration: underline; color: #000;
|
31
|
+
background-color: #F5F5DC}
|
32
|
+
a.toc h2 {background-color: #981A21; color:#FFF; padding: 6px}
|
33
|
+
ul a:visited {color: #000}
|
34
|
+
h2 {clear: both}
|
35
|
+
p.desc {font-style: italic}
|
36
|
+
p.overview {border-width: 2px; border-color: #000;
|
37
|
+
border-style: solid; border-radius: 4em;
|
38
|
+
background-color: #CCF; margin: 1.5em 1.5em; padding: 1em 2em;
|
39
|
+
-webkit-border-radius: 4em; -moz-border-radius: 4em;}
|
40
|
+
EOF
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
$x.body do
|
45
|
+
$x.h1 $title, :id=>'banner'
|
46
|
+
$x.h2 'Table of Contents'
|
47
|
+
$x.ul :class => 'toc'
|
48
|
+
|
49
|
+
# determine which range(s) of steps are to be executed
|
50
|
+
ranges = ARGV.grep(/^ \d+(.\d+)? ( (-|\.\.) \d+(.\d+)? )? /x).map do |arg|
|
51
|
+
bounds = arg.split(/-|\.\./)
|
52
|
+
Range.new(secsplit(bounds.first), secsplit(bounds.last))
|
53
|
+
end
|
54
|
+
|
55
|
+
# optionally save a snapshot
|
56
|
+
if ARGV.include? 'restore'
|
57
|
+
log :snap, 'restore'
|
58
|
+
Dir.chdir $BASE
|
59
|
+
FileUtils.rm_rf $WORK
|
60
|
+
FileUtils.cp_r "snapshot", $WORK, :preserve => true
|
61
|
+
Dir.chdir $WORK
|
62
|
+
if $autorestart and File.directory? $autorestart
|
63
|
+
Dir.chdir $autorestart
|
64
|
+
restart_server
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# run steps
|
69
|
+
e = nil
|
70
|
+
begin
|
71
|
+
$sections.each do |section, title, steps|
|
72
|
+
omit = secinclude($omit, section)
|
73
|
+
omit ||= (!ranges.empty? and !secinclude(ranges, section))
|
74
|
+
|
75
|
+
if omit
|
76
|
+
$x.a(:class => 'omit', :id => "section-#{section}") do
|
77
|
+
$x.comment! title
|
78
|
+
end
|
79
|
+
else
|
80
|
+
head section, title
|
81
|
+
steps.call
|
82
|
+
end
|
83
|
+
end
|
84
|
+
rescue Exception => e
|
85
|
+
$x.pre :class => 'traceback' do
|
86
|
+
STDERR.puts e.inspect
|
87
|
+
$x.text! "#{e.inspect}\n"
|
88
|
+
e.backtrace.each {|line| $x.text! " #{line}\n"}
|
89
|
+
end
|
90
|
+
ensure
|
91
|
+
if e.class != SystemExit
|
92
|
+
$cleanup.call if $cleanup
|
93
|
+
|
94
|
+
# terminate server
|
95
|
+
Process.kill "INT", $server if $server
|
96
|
+
Process.wait($server) if $server
|
97
|
+
|
98
|
+
# optionally save a snapshot
|
99
|
+
if ARGV.include? 'save'
|
100
|
+
log :snap, 'save'
|
101
|
+
Dir.chdir $BASE
|
102
|
+
FileUtils.rm_rf "snapshot"
|
103
|
+
FileUtils.cp_r $WORK, "snapshot", :preserve => true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
$x.a(:class => 'toc', :id => 'env') {$x.h2 'Environment'}
|
109
|
+
$x.pre Time.now.httpdate, :class=>'stdout'
|
110
|
+
|
111
|
+
cmd "#{$ruby} -v"
|
112
|
+
cmd 'gem -v'
|
113
|
+
cmd 'gem list'
|
114
|
+
cmd 'echo $RUBYLIB | sed "s/:/\n/g"'
|
115
|
+
|
116
|
+
cmd Gorp.which_rails($rails) + ' -v'
|
117
|
+
|
118
|
+
if $rails != 'rails'
|
119
|
+
Dir.chdir($rails) do
|
120
|
+
log :cmd, 'git log -1'
|
121
|
+
$x.pre 'git log -1', :class=>'stdin'
|
122
|
+
`git log -1`.strip.split(/\n/).each do |line|
|
123
|
+
line.sub! /commit (\w{40})/,
|
124
|
+
'commit <a href="http://github.com/rails/rails/commit/\1">\1</a>'
|
125
|
+
if $1
|
126
|
+
$x.pre(:class=>'stdout') {$x << line.chomp}
|
127
|
+
else
|
128
|
+
$x.pre line.chomp, :class=>'stdout'
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
$x.a(:class => 'toc', :id => 'todos') {$x.h2 'Todos'}
|
135
|
+
$x.ul :class => 'todos'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# output results as HTML, after inserting style and toc information
|
140
|
+
$x.target![/<style.*?>()/,1] = "\n#{$style.target!.strip.gsub(/^/,' '*6)}\n"
|
141
|
+
$x.target!.sub! /<ul class="toc"\/>/,
|
142
|
+
"<ul class=\"toc\">\n#{$toc.target!.gsub(/^/,' '*6)} </ul>"
|
143
|
+
$x.target!.sub! /<ul class="todos"\/>/,
|
144
|
+
"<ul class=\"todos\">\n#{$todos.target!.gsub(/^/,' '*6)} </ul>"
|
145
|
+
$x.target!.gsub! '<strong/>', '<strong></strong>'
|
146
|
+
$x.target!.gsub! /(<textarea[^>]+)\/>/, '\1></textarea>'
|
147
|
+
log :WRITE, "#{$output}.html"
|
148
|
+
open("#{$WORK}/#{$output}.html",'w') { |file| file.write $x.target! }
|
149
|
+
|
150
|
+
# run tests
|
151
|
+
if $checker
|
152
|
+
log :CHECK, "#{$output}.html"
|
153
|
+
Dir.chdir $BASE
|
154
|
+
STDOUT.puts
|
155
|
+
if $checker.respond_to? :call
|
156
|
+
$checker.call
|
157
|
+
elsif $checker =~ /^[-\w]+$/
|
158
|
+
require File.join($BASE,$checker)
|
159
|
+
else
|
160
|
+
require $checker
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
data/lib/gorp/rails.env
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# The following is code that was a part of Rails 2.3.*, but was removed in 3.0:
|
2
|
+
#
|
3
|
+
# http://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L217
|
4
|
+
#
|
5
|
+
# What it does is ensure that requires of things like 'active_script' are
|
6
|
+
# satisfied by the vendored rails, and not by whatever gems you have
|
7
|
+
# installed.
|
8
|
+
|
9
|
+
vendor = File.expand_path(File.dirname(File.dirname(__FILE__)))
|
10
|
+
vendor_rails = File.join(vendor, 'rails')
|
11
|
+
|
12
|
+
if File.exist? vendor_rails
|
13
|
+
require 'rubygems'
|
14
|
+
|
15
|
+
Dir.chdir(vendor_rails) do
|
16
|
+
rails_version = open('railties/lib/rails/version.rb') do |file|
|
17
|
+
eval(file.read.gsub(/\s*(module|end).*\n/, '').downcase)
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir[File.join('*', 'lib')].each do |lib|
|
21
|
+
stub = lib.split(File::Separator).first
|
22
|
+
stub.sub 'railties', 'rails'
|
23
|
+
|
24
|
+
next if Gem.loaded_specs.key?(stub)
|
25
|
+
|
26
|
+
spec = Gem::Specification.new do |s|
|
27
|
+
s.name = stub
|
28
|
+
s.version = rails_version
|
29
|
+
s.loaded_from = File.join(vendor_rails, lib)
|
30
|
+
end
|
31
|
+
|
32
|
+
$LOAD_PATH.unshift spec.loaded_from
|
33
|
+
Gem.loaded_specs[stub] = spec
|
34
|
+
Gem.source_index.add_spec spec
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/gorp/rails.rb
CHANGED
@@ -22,118 +22,161 @@ else
|
|
22
22
|
$rails = 'rails'
|
23
23
|
end
|
24
24
|
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
# verify version of rails
|
26
|
+
if $rails =~ /^rails( |$)/
|
27
|
+
`#{$rails} -v 2>/dev/null`
|
28
|
+
else
|
29
|
+
`ruby #{$rails}/railties/bin/rails -v 2>/dev/null`
|
30
|
+
end
|
31
|
+
|
32
|
+
if $?.success?
|
33
|
+
# place a link in the $WORK directory
|
34
|
+
FileUtils.rm_f File.join($WORK, 'rails')
|
35
|
+
unless $rails =~ /^rails( |$)/
|
36
|
+
FileUtils.ln_s $rails, File.join($WORK, 'rails')
|
32
37
|
end
|
33
|
-
|
38
|
+
else
|
39
|
+
puts "Install rails or specify path to git clone of rails as the " +
|
40
|
+
"first argument."
|
41
|
+
Process.exit!
|
34
42
|
end
|
35
43
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
$x.pre "#{rails} #{name}#{opt}", :class=>'stdin'
|
47
|
-
popen3 "#{rails} #{name}#{opt}"
|
48
|
-
|
49
|
-
# canonicalize the reference to Ruby
|
50
|
-
Dir["#{name}/script/**/*"].each do |script|
|
51
|
-
next if File.directory? script
|
52
|
-
code = open(script) {|file| file.read}
|
53
|
-
code.sub! /^#!.*/, '#!/usr/bin/env ruby'
|
54
|
-
open(script,'w') {|file| file.write code}
|
44
|
+
module Gorp
|
45
|
+
# determine which version of rails is running
|
46
|
+
def self.which_rails rails
|
47
|
+
railties = File.join(rails, 'railties', 'bin', 'rails')
|
48
|
+
rails = railties if File.exists?(railties)
|
49
|
+
if File.exists?(rails)
|
50
|
+
firstline = open(rails) {|file| file.readlines.first}
|
51
|
+
rails = 'ruby ' + rails unless firstline =~ /^#!/
|
52
|
+
end
|
53
|
+
rails
|
55
54
|
end
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
module Commands
|
57
|
+
# run rails as a command
|
58
|
+
def rails name, app=nil
|
59
|
+
Dir.chdir($WORK)
|
60
|
+
FileUtils.rm_rf name
|
61
|
+
log :rails, name
|
60
62
|
|
61
|
-
|
63
|
+
# determine how to invoke rails
|
64
|
+
rails = Gorp.which_rails $rails
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
opt = (ARGV.include?('bundle') ? ' --dev' : '')
|
67
|
+
$x.pre "#{rails} #{name}#{opt}", :class=>'stdin'
|
68
|
+
popen3 "#{rails} #{name}#{opt}"
|
69
|
+
|
70
|
+
# canonicalize the reference to Ruby
|
71
|
+
Dir["#{name}/script/**/*"].each do |script|
|
72
|
+
next if File.directory? script
|
73
|
+
code = open(script) {|file| file.read}
|
74
|
+
code.sub! /^#!.*/, '#!/usr/bin/env ruby'
|
75
|
+
open(script,'w') {|file| file.write code}
|
71
76
|
end
|
72
|
-
else
|
73
|
-
system 'mkdir -p vendor'
|
74
|
-
system "ln -s #{$rails} vendor/rails"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
77
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
78
|
+
cmd "mkdir #{name}" unless File.exist?(name)
|
79
|
+
Dir.chdir(name)
|
80
|
+
FileUtils.rm_rf 'public/.htaccess'
|
81
|
+
|
82
|
+
cmd 'rake rails:freeze:edge' if ARGV.include? 'edge'
|
83
|
+
|
84
|
+
if $rails != 'rails' and File.directory?($rails)
|
85
|
+
if File.exist? 'Gemfile'
|
86
|
+
if ARGV.include? 'bundle'
|
87
|
+
if ENV['RUBYLIB']
|
88
|
+
gem=open('Gemfile') {|file| file.read}
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
90
|
+
gem.sub! /gem "rails", :path => "(.*)"/ do
|
91
|
+
rails = "directory \"#{$1}\", :glob => '{*/,}*.gemspec'\n"
|
92
|
+
|
93
|
+
version = open("#{$1}/railties/lib/rails/version.rb") do |file|
|
94
|
+
eval(file.read.gsub(/\s*(module|end).*\n/, '').downcase)
|
95
|
+
end
|
96
|
+
|
97
|
+
ENV['RUBYLIB'].split(File::PATH_SEPARATOR).each do |lib|
|
98
|
+
rails << "directory #{lib.sub(/\/lib$/,'').inspect}\n"
|
99
|
+
end
|
100
|
+
rails + "gem \"rails\", #{version.inspect}"
|
101
|
+
end
|
102
|
+
|
103
|
+
open('Gemfile','w') {|file| file.write gem}
|
104
|
+
end
|
105
|
+
|
106
|
+
cmd 'gem bundle'
|
107
|
+
else
|
108
|
+
system 'mkdir -p vendor/gems'
|
109
|
+
system "ln -s #{$rails} vendor/rails"
|
110
|
+
system "cp #{__FILE__.sub(/\.rb$/,'.env')} " +
|
111
|
+
"vendor/gems/environment.rb"
|
112
|
+
end
|
113
|
+
else
|
114
|
+
system 'mkdir -p vendor'
|
115
|
+
system "ln -s #{$rails} vendor/rails"
|
116
|
+
end
|
99
117
|
end
|
100
118
|
end
|
101
|
-
else
|
102
|
-
#
|
103
|
-
# For unknown reason, when run as CGI, the below produces:
|
104
|
-
# undefined method `chomp' for nil:NilClass (NoMethodError)
|
105
|
-
# from rails/actionpack/lib/action_dispatch/middleware/static.rb:13
|
106
|
-
# path = env['PATH_INFO'].chomp('/')
|
107
|
-
#
|
108
|
-
unless ENV['GATEWAY_INTERFACE'].to_s =~ /CGI/
|
109
|
-
STDOUT.reopen '/dev/null', 'a'
|
110
|
-
exec "#{$ruby} script/server --port #{$PORT}"
|
111
|
-
end
|
112
119
|
|
113
|
-
#
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
120
|
+
# start/restart a rails server in a separate process
|
121
|
+
def restart_server
|
122
|
+
log :server, 'restart'
|
123
|
+
if $server
|
124
|
+
$x.h3 'Restart the server.'
|
125
|
+
Process.kill "INT", $server
|
126
|
+
Process.wait($server)
|
119
127
|
else
|
120
|
-
|
128
|
+
$x.h3 'Start the server.'
|
129
|
+
end
|
121
130
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
+
$server = fork
|
132
|
+
if $server
|
133
|
+
# wait for server to start
|
134
|
+
60.times do
|
135
|
+
sleep 0.5
|
136
|
+
begin
|
137
|
+
status = Net::HTTP.get_response('localhost','/',$PORT).code
|
138
|
+
break if %(200 404).include? status
|
139
|
+
rescue Errno::ECONNREFUSED
|
140
|
+
end
|
141
|
+
end
|
142
|
+
else
|
143
|
+
#
|
144
|
+
# For unknown reason, when run as CGI, the below produces:
|
145
|
+
# undefined method `chomp' for nil:NilClass (NoMethodError)
|
146
|
+
# from rails/actionpack/lib/action_dispatch/middleware/static.rb:13
|
147
|
+
# path = env['PATH_INFO'].chomp('/')
|
148
|
+
#
|
149
|
+
unless ENV['GATEWAY_INTERFACE'].to_s =~ /CGI/
|
150
|
+
STDOUT.reopen '/dev/null', 'a'
|
151
|
+
exec "#{$ruby} script/server --port #{$PORT}"
|
152
|
+
end
|
153
|
+
|
154
|
+
# alternatives to the above, with backtrace
|
155
|
+
begin
|
156
|
+
if File.exist?('config.ru')
|
157
|
+
require 'rack'
|
158
|
+
server = Rack::Builder.new {eval(open('config.ru') {|fh| fh.read})}
|
159
|
+
Rack::Handler::WEBrick.run(server, :Port => $PORT)
|
160
|
+
else
|
161
|
+
ARGV.clear.unshift('--port', $PORT.to_s)
|
162
|
+
|
163
|
+
# start server, redirecting stdout to a string
|
164
|
+
$stdout = StringIO.open('','w')
|
165
|
+
require './config/boot'
|
166
|
+
if Rails::VERSION::MAJOR == 2
|
167
|
+
require 'commands/server'
|
168
|
+
else
|
169
|
+
require 'rails/commands/server'
|
170
|
+
Rails::Server.start
|
171
|
+
end
|
172
|
+
end
|
173
|
+
rescue
|
174
|
+
STDERR.puts $!
|
175
|
+
$!.backtrace.each {|method| STDERR.puts "\tfrom " + method}
|
176
|
+
ensure
|
177
|
+
Process.exit!
|
178
|
+
end
|
131
179
|
end
|
132
|
-
rescue
|
133
|
-
STDERR.puts $!
|
134
|
-
$!.backtrace.each {|method| STDERR.puts "\tfrom " + method}
|
135
|
-
ensure
|
136
|
-
Process.exit!
|
137
180
|
end
|
138
181
|
end
|
139
182
|
end
|
data/lib/gorp/test.rb
CHANGED
@@ -2,18 +2,18 @@ require 'test/unit'
|
|
2
2
|
require 'builder'
|
3
3
|
require 'gorp/env'
|
4
4
|
|
5
|
-
$:.unshift "#{$WORK}/
|
5
|
+
$:.unshift "#{$WORK}/rails/activesupport/lib"
|
6
6
|
require 'active_support'
|
7
7
|
require 'active_support/version'
|
8
8
|
require 'active_support/test_case'
|
9
9
|
$:.shift
|
10
10
|
|
11
|
-
module
|
11
|
+
module Gorp
|
12
12
|
end
|
13
13
|
|
14
|
-
class
|
14
|
+
class Gorp::TestCase < ActiveSupport::TestCase
|
15
15
|
# just enough infrastructure to get 'assert_select' to work
|
16
|
-
$:.unshift "#{$WORK}/
|
16
|
+
$:.unshift "#{$WORK}/rails/actionpack/lib"
|
17
17
|
require 'action_controller'
|
18
18
|
begin
|
19
19
|
# Rails (2.3.3 ish)
|
data/lib/gorp/xml.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# pluggable XML parser support
|
2
|
+
begin
|
3
|
+
raise LoadError if ARGV.include? 'rexml'
|
4
|
+
require 'nokogiri'
|
5
|
+
def xhtmlparse(text)
|
6
|
+
Nokogiri::HTML(text)
|
7
|
+
end
|
8
|
+
Comment=Nokogiri::XML::Comment
|
9
|
+
rescue LoadError
|
10
|
+
require 'rexml/document'
|
11
|
+
|
12
|
+
HTML_VOIDS = %w(area base br col command embed hr img input keygen link meta
|
13
|
+
param source)
|
14
|
+
|
15
|
+
def xhtmlparse(text)
|
16
|
+
begin
|
17
|
+
require 'htmlentities'
|
18
|
+
text.gsub! '&', '&amp;'
|
19
|
+
text.gsub! '<', '&lt;'
|
20
|
+
text.gsub! '>', '&gt;'
|
21
|
+
text.gsub! ''', '&apos;'
|
22
|
+
text.gsub! '"', '&quot;'
|
23
|
+
text.force_encoding('utf-8') if text.respond_to? :force_encoding
|
24
|
+
text = HTMLEntities.new.decode(text)
|
25
|
+
rescue LoadError
|
26
|
+
end
|
27
|
+
doc = REXML::Document.new(text)
|
28
|
+
doc.get_elements('//*[not(* or text())]').each do |e|
|
29
|
+
e.text='' unless HTML_VOIDS.include? e.name
|
30
|
+
end
|
31
|
+
doc
|
32
|
+
end
|
33
|
+
|
34
|
+
class REXML::Element
|
35
|
+
def has_attribute? name
|
36
|
+
self.attributes.has_key? name
|
37
|
+
end
|
38
|
+
|
39
|
+
def at xpath
|
40
|
+
self.elements[xpath]
|
41
|
+
end
|
42
|
+
|
43
|
+
def search xpath
|
44
|
+
self.elements.to_a(xpath)
|
45
|
+
end
|
46
|
+
|
47
|
+
def content=(string)
|
48
|
+
self.text=string
|
49
|
+
end
|
50
|
+
|
51
|
+
def [](index)
|
52
|
+
if index.instance_of? String
|
53
|
+
self.attributes[index]
|
54
|
+
else
|
55
|
+
super(index)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def []=(index, value)
|
60
|
+
if index.instance_of? String
|
61
|
+
self.attributes[index] = value
|
62
|
+
else
|
63
|
+
super(index, value)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module REXML::Node
|
69
|
+
def before(node)
|
70
|
+
self.parent.insert_before(self, node)
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_previous_sibling(node)
|
74
|
+
self.parent.insert_before(self, node)
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_xml
|
78
|
+
self.to_s
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# monkey patch for Ruby 1.8.6
|
83
|
+
doc = REXML::Document.new '<doc xmlns="ns"><item name="foo"/></doc>'
|
84
|
+
if not doc.root.elements["item[@name='foo']"]
|
85
|
+
class REXML::Element
|
86
|
+
def attribute( name, namespace=nil )
|
87
|
+
prefix = nil
|
88
|
+
prefix = namespaces.index(namespace) if namespace
|
89
|
+
prefix = nil if prefix == 'xmlns'
|
90
|
+
attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" )
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
Comment = REXML::Comment
|
96
|
+
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gorp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-01 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -131,11 +131,15 @@ extensions: []
|
|
131
131
|
extra_rdoc_files:
|
132
132
|
- README
|
133
133
|
- lib/gorp.rb
|
134
|
+
- lib/gorp/commands.rb
|
134
135
|
- lib/gorp/edit.rb
|
135
136
|
- lib/gorp/env.rb
|
136
137
|
- lib/gorp/net.rb
|
138
|
+
- lib/gorp/output.rb
|
139
|
+
- lib/gorp/rails.env
|
137
140
|
- lib/gorp/rails.rb
|
138
141
|
- lib/gorp/test.rb
|
142
|
+
- lib/gorp/xml.rb
|
139
143
|
- lib/version.rb
|
140
144
|
files:
|
141
145
|
- Manifest
|
@@ -143,11 +147,15 @@ files:
|
|
143
147
|
- Rakefile
|
144
148
|
- gorp.gemspec
|
145
149
|
- lib/gorp.rb
|
150
|
+
- lib/gorp/commands.rb
|
146
151
|
- lib/gorp/edit.rb
|
147
152
|
- lib/gorp/env.rb
|
148
153
|
- lib/gorp/net.rb
|
154
|
+
- lib/gorp/output.rb
|
155
|
+
- lib/gorp/rails.env
|
149
156
|
- lib/gorp/rails.rb
|
150
157
|
- lib/gorp/test.rb
|
158
|
+
- lib/gorp/xml.rb
|
151
159
|
- lib/version.rb
|
152
160
|
has_rdoc: true
|
153
161
|
homepage: http://github.com/rubys/gorp
|