chuckle 1.0.1 → 1.0.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.
- data/bin/chuckle +52 -0
- data/chuckle.gemspec +2 -0
- data/lib/chuckle/client.rb +11 -3
- data/lib/chuckle/curl.rb +7 -2
- data/lib/chuckle/version.rb +1 -1
- data/test/helper.rb +6 -0
- data/test/test_network.rb +5 -0
- data/test/url_file.txt +2 -0
- metadata +24 -4
data/bin/chuckle
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# in lieu of -w, since we're using env to startup
|
4
|
+
$VERBOSE = true
|
5
|
+
|
6
|
+
require "chuckle"
|
7
|
+
require "trollop"
|
8
|
+
|
9
|
+
class Main
|
10
|
+
attr_accessor :options
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
self.options = options
|
14
|
+
list = IO.readlines(options[:file]).map(&:chomp)
|
15
|
+
list.each_with_index do |i, index|
|
16
|
+
puts "#{index+1}/#{list.length}. #{i}"
|
17
|
+
begin
|
18
|
+
chuckle.get(i)
|
19
|
+
rescue Chuckle::Error => e
|
20
|
+
puts " #{e.message}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def chuckle
|
28
|
+
@chuckle ||= Chuckle::Client.new(nretries: options[:nretries], timeout: options[:timeout])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
#
|
35
|
+
# parse command line
|
36
|
+
#
|
37
|
+
|
38
|
+
options = Trollop.options do
|
39
|
+
banner <<EOF
|
40
|
+
Usage: chuckle <url_file>
|
41
|
+
|
42
|
+
chuckle fetches urls as listed in url_file. It just populate the disk
|
43
|
+
cache.
|
44
|
+
EOF
|
45
|
+
|
46
|
+
opt :nretries, "Number of retries per URL", type: Integer
|
47
|
+
opt :timeout, "Timeout per retry", type: Integer
|
48
|
+
end
|
49
|
+
|
50
|
+
Trollop.die "need <url_file>" if ARGV.length != 1
|
51
|
+
options[:file] = ARGV.shift
|
52
|
+
Main.new(options)
|
data/chuckle.gemspec
CHANGED
data/lib/chuckle/client.rb
CHANGED
@@ -7,7 +7,8 @@ module Chuckle
|
|
7
7
|
attr_accessor :options, :cache
|
8
8
|
|
9
9
|
def initialize(options = {})
|
10
|
-
self.options = DEFAULT_OPTIONS.
|
10
|
+
self.options = DEFAULT_OPTIONS.dup
|
11
|
+
options.each { |k, v| self.options[k] = v if v }
|
11
12
|
self.cache = Cache.new(self)
|
12
13
|
sanity!
|
13
14
|
end
|
@@ -56,7 +57,14 @@ module Chuckle
|
|
56
57
|
def curl(request)
|
57
58
|
vputs request.uri
|
58
59
|
rate_limit!(request)
|
59
|
-
|
60
|
+
|
61
|
+
curl = Curl.new(request)
|
62
|
+
begin
|
63
|
+
curl.run
|
64
|
+
cache.set(request, curl)
|
65
|
+
ensure
|
66
|
+
curl.cleanup
|
67
|
+
end
|
60
68
|
end
|
61
69
|
|
62
70
|
def raise_errors(response)
|
@@ -71,7 +79,7 @@ module Chuckle
|
|
71
79
|
if !cache_errors?
|
72
80
|
cache.clear(response.request)
|
73
81
|
end
|
74
|
-
raise Error.new(
|
82
|
+
raise Error.new(error, response)
|
75
83
|
end
|
76
84
|
|
77
85
|
def vputs(s)
|
data/lib/chuckle/curl.rb
CHANGED
@@ -4,7 +4,6 @@ module Chuckle
|
|
4
4
|
class Curl
|
5
5
|
def initialize(request)
|
6
6
|
@request = request
|
7
|
-
run
|
8
7
|
end
|
9
8
|
|
10
9
|
# tmp path for response headers
|
@@ -24,7 +23,7 @@ module Chuckle
|
|
24
23
|
|
25
24
|
# capture exit code, bail on INT
|
26
25
|
exit_code = $?.to_i / 256
|
27
|
-
if
|
26
|
+
if $?.termsig == Signal.list["INT"]
|
28
27
|
Process.kill(:INT, $$)
|
29
28
|
end
|
30
29
|
|
@@ -37,6 +36,12 @@ module Chuckle
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
39
|
+
# make sure we don't accidentally leave any files hanging around
|
40
|
+
def cleanup
|
41
|
+
Util.rm_if_necessary(headers_path)
|
42
|
+
Util.rm_if_necessary(body_path)
|
43
|
+
end
|
44
|
+
|
40
45
|
def self.exit_code_to_headers(exit_code)
|
41
46
|
"exit_code #{exit_code}"
|
42
47
|
end
|
data/lib/chuckle/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -8,6 +8,7 @@ module Helper
|
|
8
8
|
CACHE_DIR = "/tmp/_chuckle_tests"
|
9
9
|
URL = "http://chuckle"
|
10
10
|
QUERY = { "b" => "12", "a" => "34", "x y" => "56" }
|
11
|
+
TMP = "/tmp/_chuckle_tmp.txt"
|
11
12
|
|
12
13
|
#
|
13
14
|
# fake responses
|
@@ -99,4 +100,9 @@ module Helper
|
|
99
100
|
end
|
100
101
|
Kernel.stub(:system, fake_system) { yield }
|
101
102
|
end
|
103
|
+
|
104
|
+
def assert_command(cmd)
|
105
|
+
system("#{cmd} > #{TMP} 2>&1")
|
106
|
+
assert($? == 0, File.read(TMP))
|
107
|
+
end
|
102
108
|
end
|
data/test/test_network.rb
CHANGED
@@ -53,4 +53,9 @@ class TestNetwork < Minitest::Test
|
|
53
53
|
client.get("http://httpbin.org/robots.txt")
|
54
54
|
assert !File.exists?(cookie_jar), "cookie jar should've expired"
|
55
55
|
end
|
56
|
+
|
57
|
+
def test_bin
|
58
|
+
Dir.chdir(File.expand_path("../", __FILE__))
|
59
|
+
assert_command("../bin/chuckle url_file.txt")
|
60
|
+
end
|
56
61
|
end
|
data/test/url_file.txt
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chuckle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: trollop
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: awesome_print
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +110,8 @@ dependencies:
|
|
94
110
|
description: An http client that caches on disk.
|
95
111
|
email:
|
96
112
|
- amd@gurge.com
|
97
|
-
executables:
|
113
|
+
executables:
|
114
|
+
- chuckle
|
98
115
|
extensions: []
|
99
116
|
extra_rdoc_files: []
|
100
117
|
files:
|
@@ -104,6 +121,7 @@ files:
|
|
104
121
|
- LICENSE
|
105
122
|
- README.md
|
106
123
|
- Rakefile
|
124
|
+
- bin/chuckle
|
107
125
|
- chuckle.gemspec
|
108
126
|
- lib/chuckle.rb
|
109
127
|
- lib/chuckle/cache.rb
|
@@ -120,6 +138,7 @@ files:
|
|
120
138
|
- test/test_cache.rb
|
121
139
|
- test/test_network.rb
|
122
140
|
- test/test_requests.rb
|
141
|
+
- test/url_file.txt
|
123
142
|
homepage: http://github.com/gurgeous/chuckle
|
124
143
|
licenses: []
|
125
144
|
post_install_message:
|
@@ -140,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
159
|
version: '0'
|
141
160
|
segments:
|
142
161
|
- 0
|
143
|
-
hash: -
|
162
|
+
hash: -116042020902971190
|
144
163
|
requirements: []
|
145
164
|
rubyforge_project: chuckle
|
146
165
|
rubygems_version: 1.8.24
|
@@ -152,3 +171,4 @@ test_files:
|
|
152
171
|
- test/test_cache.rb
|
153
172
|
- test/test_network.rb
|
154
173
|
- test/test_requests.rb
|
174
|
+
- test/url_file.txt
|