gorp 0.16.1 → 0.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Manifest CHANGED
@@ -1,9 +0,0 @@
1
- Manifest
2
- README
3
- Rakefile
4
- gorp.gemspec
5
- lib/gorp.rb
6
- lib/gorp/edit.rb
7
- lib/gorp/env.rb
8
- lib/gorp/test.rb
9
- lib/version.rb
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{gorp}
5
- s.version = "0.16.1"
5
+ s.version = "0.16.3"
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"]
@@ -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/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/test.rb", "lib/version.rb"]
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"]
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"]
@@ -0,0 +1,163 @@
1
+ require 'net/http'
2
+ require 'cgi'
3
+
4
+ def snap response, form=nil
5
+ if response.content_type == 'text/plain' or response.content_type =~ /xml/
6
+ $x.div :class => 'body' do
7
+ response.body.split("\n").each do |line|
8
+ $x.pre line.chomp, :class=>'stdout'
9
+ end
10
+ end
11
+ return
12
+ end
13
+
14
+ if response.body =~ /<body/
15
+ body = response.body
16
+ else
17
+ body = "<body>#{response.body}</body>"
18
+ end
19
+
20
+ begin
21
+ doc = xhtmlparse(body)
22
+ rescue
23
+ body.split("\n").each {|line| $x.pre line.chomp, :class=>'hilight'}
24
+ raise
25
+ end
26
+
27
+ title = doc.at('html/head/title').text rescue ''
28
+ body = doc.at('//body')
29
+ doc.search('//link[@rel="stylesheet"]').each do |sheet|
30
+ body.children.first.add_previous_sibling(sheet)
31
+ end
32
+
33
+ # ensure that textareas don't use the self-closing syntax
34
+ body.search('//textarea').each do |element|
35
+ element.content=''
36
+ end
37
+
38
+ if form
39
+ body.search('//input[@name]').each do |input|
40
+ input['value'] ||= form[input['name']].to_s
41
+ end
42
+ body.search('//textarea[@name]').each do |textarea|
43
+ textarea.content = form[textarea['name']].to_s if textarea.text.empty?
44
+ end
45
+ end
46
+
47
+ %w{ a[@href] form[@action] }.each do |xpath|
48
+ name = xpath[/@(\w+)/,1]
49
+ body.search("//#{xpath}").each do |element|
50
+ next if element[name] =~ /^http:\/\//
51
+ element[name] = URI.join("http://localhost:#{$PORT}/", element[name]).to_s
52
+ end
53
+ end
54
+
55
+ %w{ img[@src] }.each do |xpath|
56
+ name = xpath[/@(\w+)/,1]
57
+ body.search("//#{xpath}").each do |element|
58
+ if element[name][0] == ?/
59
+ element[name] = 'data' + element[name]
60
+ end
61
+ end
62
+ end
63
+
64
+ attrs = {:class => 'body', :title => title}
65
+ attrs[:class] = 'traceback' if response.code == '500'
66
+ attrs[:id] = body['id'] if body['id']
67
+ $x.div(attrs) do
68
+ body.children.each do |child|
69
+ $x << child.to_xml unless child.instance_of?(Comment)
70
+ end
71
+ end
72
+ $x.div '', :style => "clear: both"
73
+ end
74
+
75
+ def get path
76
+ post path, nil
77
+ end
78
+
79
+ def post path, form, options={}
80
+ log :get, path unless form
81
+ $x.pre "get #{path}", :class=>'stdin' unless options[:snapget] == false
82
+
83
+ if path.include? ':'
84
+ host, port, path = URI.parse(path).select(:host, :port, :path)
85
+ else
86
+ host, port = '127.0.0.1', $PORT
87
+ end
88
+
89
+ Net::HTTP.start(host, port) do |http|
90
+ get = Net::HTTP::Get.new(path)
91
+ get['Cookie'] = $COOKIE if $COOKIE
92
+ response = http.request(get)
93
+ snap response, form unless options[:snapget] == false
94
+ $COOKIE = response.response['set-cookie'] if response.response['set-cookie']
95
+
96
+ if form
97
+ body = xhtmlparse(response.body).at('//body')
98
+ body = xhtmlparse(response.body).root unless body
99
+ xforms = body.search('//form')
100
+
101
+ # find matching button by action
102
+ xform = xforms.find do |element|
103
+ next unless element.attribute('action').to_s.include?('?')
104
+ query = CGI.parse(URI.parse(element.attribute('action').to_s).query)
105
+ query.all? {|key,values| values.include?(form[key].to_s)}
106
+ end
107
+
108
+ # find matching button by input names
109
+ xform ||= xforms.find do |element|
110
+ form.all? do |name, value|
111
+ element.search('.//input | .//textarea | ..//select').any? do |input|
112
+ input.attribute('name').to_s==name.to_s
113
+ end
114
+ end
115
+ end
116
+
117
+ # match based on action itself
118
+ xform ||= xforms.find do |element|
119
+ form.all? do |name, value|
120
+ element.attribute('action').to_s.include?(path)
121
+ end
122
+ end
123
+
124
+ # look for a commit button
125
+ xform ||= xforms.find {|element| element.at('.//input[@name="commit"]')}
126
+
127
+ return unless xform
128
+
129
+ path = xform.attribute('action').to_s unless
130
+ xform.attribute('action').to_s.empty?
131
+ $x.pre "post #{path}", :class=>'stdin'
132
+
133
+ $x.ul do
134
+ form.each do |name, value|
135
+ $x.li "#{name} => #{value}"
136
+ end
137
+
138
+ xform.search('.//input[@type="hidden"]').each do |element|
139
+ # $x.li "#{element['name']} => #{element['value']}"
140
+ form[element['name']] ||= element['value']
141
+ end
142
+ end
143
+
144
+ log :post, path
145
+ post = Net::HTTP::Post.new(path)
146
+ post.form_data = form
147
+ post['Cookie'] = $COOKIE
148
+ response=http.request(post)
149
+ snap response
150
+ end
151
+
152
+ if response.code == '302'
153
+ $COOKIE=response.response['set-cookie'] if response.response['set-cookie']
154
+ path = response['Location']
155
+ $x.pre "get #{path}", :class=>'stdin'
156
+ get = Net::HTTP::Get.new(path)
157
+ get['Cookie'] = $COOKIE if $COOKIE
158
+ response = http.request(get)
159
+ snap response
160
+ $COOKIE=response.response['set-cookie'] if response.response['set-cookie']
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,126 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+ require 'builder'
4
+ require 'stringio'
5
+ require 'time'
6
+
7
+ # verify that port is available for testing
8
+ if (Net::HTTP.get_response('localhost','/',$PORT).code == '200' rescue false)
9
+ STDERR.puts "local server already running on port #{$PORT}"
10
+ exit
11
+ end
12
+
13
+ # select a version of Rails
14
+ if ARGV.first =~ /^_\d[.\d]*_$/
15
+ $rails = "rails #{ARGV.first}"
16
+ elsif File.directory?(ARGV.first.to_s)
17
+ $rails = ARGV.first
18
+ $rails = File.join($rails,'rails') if
19
+ File.directory?(File.join($rails,'rails'))
20
+ $rails = File.expand_path($rails)
21
+ else
22
+ $rails = 'rails'
23
+ end
24
+
25
+ # determine which version of rails is running
26
+ def which_rails rails
27
+ railties = File.join(rails, 'railties', 'bin', 'rails')
28
+ rails = railties if File.exists?(railties)
29
+ if File.exists?(rails)
30
+ firstline = open(rails) {|file| file.readlines.first}
31
+ rails = 'ruby ' + rails unless firstline =~ /^#!/
32
+ end
33
+ rails
34
+ end
35
+
36
+ # run rails as a command
37
+ def rails name, app=nil
38
+ Dir.chdir($WORK)
39
+ FileUtils.rm_rf name
40
+ log :rails, name
41
+
42
+ # determine how to invoke rails
43
+ rails = which_rails $rails
44
+
45
+ $x.pre "#{rails} #{name}", :class=>'stdin'
46
+ popen3 "#{rails} #{name}"
47
+
48
+ # canonicalize the reference to Ruby
49
+ Dir["#{name}/script/**/*"].each do |script|
50
+ next if File.directory? script
51
+ code = open(script) {|file| file.read}
52
+ code.sub! /^#!.*/, '#!/usr/bin/env ruby'
53
+ open(script,'w') {|file| file.write code}
54
+ end
55
+
56
+ cmd "mkdir #{name}" unless File.exist?(name)
57
+ Dir.chdir(name)
58
+ FileUtils.rm_rf 'public/.htaccess'
59
+
60
+ cmd 'rake rails:freeze:edge' if ARGV.include? 'edge'
61
+
62
+ if $rails != 'rails' and File.directory?($rails)
63
+ cmd "mkdir vendor" unless File.exist?('vendor')
64
+ cmd "ln -s #{$rails} vendor/rails"
65
+ end
66
+ end
67
+
68
+ # start/restart a rails server in a separate process
69
+ def restart_server
70
+ log :server, 'restart'
71
+ if $server
72
+ $x.h3 'Restart the server.'
73
+ Process.kill "INT", $server
74
+ Process.wait($server)
75
+ else
76
+ $x.h3 'Start the server.'
77
+ end
78
+
79
+ $server = fork
80
+ if $server
81
+ # wait for server to start
82
+ 60.times do
83
+ sleep 0.5
84
+ begin
85
+ status = Net::HTTP.get_response('localhost','/',$PORT).code
86
+ break if %(200 404).include? status
87
+ rescue Errno::ECONNREFUSED
88
+ end
89
+ end
90
+ else
91
+ #
92
+ # For unknown reason, the below produces:
93
+ # undefined method `chomp' for nil:NilClass (NoMethodError)
94
+ # from rails/actionpack/lib/action_dispatch/middleware/static.rb:13
95
+ # path = env['PATH_INFO'].chomp('/')
96
+ #
97
+ # STDOUT.reopen '/dev/null', 'a'
98
+ # exec "#{$ruby} script/server --port #{$PORT}"
99
+
100
+ # alternatives to the above, with backtrace
101
+ begin
102
+ if File.exist?('config.ru')
103
+ require 'rack'
104
+ server = Rack::Builder.new {eval(open('config.ru') {|file| file.read})}
105
+ Rack::Handler::WEBrick.run(server, :Port => $PORT)
106
+ else
107
+ ARGV.clear.unshift('--port', $PORT.to_s)
108
+
109
+ # start server, redirecting stdout to a string
110
+ $stdout = StringIO.open('','w')
111
+ require './config/boot'
112
+ if Rails::VERSION::MAJOR == 2
113
+ require 'commands/server'
114
+ else
115
+ require 'rails/commands/server'
116
+ Rails::Server.start
117
+ end
118
+ end
119
+ rescue
120
+ STDERR.puts $!
121
+ $!.backtrace.each {|method| STDERR.puts "\tfrom " + method}
122
+ ensure
123
+ Process.exit!
124
+ end
125
+ end
126
+ end
@@ -2,7 +2,7 @@ module Gorp
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 16
5
- TINY = 1
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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.16.1
4
+ version: 0.16.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
@@ -123,6 +123,8 @@ extra_rdoc_files:
123
123
  - lib/gorp.rb
124
124
  - lib/gorp/edit.rb
125
125
  - lib/gorp/env.rb
126
+ - lib/gorp/net.rb
127
+ - lib/gorp/rails.rb
126
128
  - lib/gorp/test.rb
127
129
  - lib/version.rb
128
130
  files:
@@ -133,6 +135,8 @@ files:
133
135
  - lib/gorp.rb
134
136
  - lib/gorp/edit.rb
135
137
  - lib/gorp/env.rb
138
+ - lib/gorp/net.rb
139
+ - lib/gorp/rails.rb
136
140
  - lib/gorp/test.rb
137
141
  - lib/version.rb
138
142
  has_rdoc: true