eat 0.0.7 → 0.1.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.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@ pkg/*
2
2
  *.gem
3
3
  .bundle
4
4
  Gemfile.lock
5
+ rdoc/
data/CHANGELOG ADDED
@@ -0,0 +1,5 @@
1
+ 0.1.0
2
+ * no longer tries to open file with sudo if it gets a permission error
3
+ * remove Eat::Config.timeout global option
4
+ * add :timeout option example: eat(x, :timeout => y)
5
+ * add :limit option example: eat(x, :limit => y)
data/README.rdoc CHANGED
@@ -1,25 +1,33 @@
1
1
  =eat
2
2
 
3
- Instead of
3
+ Problems with the standard <tt>open-uri</tt> library
4
4
 
5
- require 'open-uri'
6
- open('http://169.254.169.254/latest/meta-data/security-groups').gets
7
- open('/home/seamus/foo.txt').gets
5
+ * sometimes it returns <tt>String</tt> and sometimes <tt>StringIO</tt> (check out <tt>OpenURI::Buffer::StringMax</tt>, usually 10,240 bytes)
6
+ * sometimes you have to call <tt>gets</tt> (for example <tt>open('http://yahoo.com').gets</tt>)
7
+ * it overrides <tt>#open</tt> everywhere, which may be confusing.
8
8
 
9
- Try
9
+ Try <tt>#eat</tt>, which ALWAYS returns a <tt>String</tt>:
10
10
 
11
11
  require 'eat'
12
- eat('http://169.254.169.254/latest/meta-data/security-groups')
13
- eat('/home/seamus/foo.txt')
12
+ eat('http://yahoo.com') #=> String
13
+ eat('/home/seamus/foo.txt') #=> String
14
+ eat('file:///home/seamus/foo.txt') #=> String
14
15
 
15
- ==Global configuration
16
+ ==Options
16
17
 
17
- ::Eat.config.remote_timeout = 10 #seconds
18
+ eat('http://yahoo.com', :timeout => 10) # timeout after 10 seconds
19
+ eat('http://yahoo.com', :limit => 1024) # only read the first 1024 chars
20
+
21
+ ==Warning: doesn't verify SSL certs
22
+
23
+ If you need to check SSL certificates, please don't use this gem. It always sets
24
+
25
+ http.verify_mode = ::OpenSSL::SSL::VERIFY_NONE
18
26
 
19
27
  ==Supported schemas
20
28
 
21
- * local filesystem (it will try to use <tt>sudo</tt> if it can't read the file)
22
- * http (the timeout is 2 seconds)
29
+ * local filesystem
30
+ * http
23
31
  * https (it won't check the SSL certificate... if you want security, don't use this!)
24
32
 
25
33
  Copyright 2011 Seamus Abshere
data/Rakefile CHANGED
@@ -8,3 +8,14 @@ Rake::TestTask.new(:test) do |test|
8
8
  test.pattern = 'test/**/test_*.rb'
9
9
  test.verbose = true
10
10
  end
11
+
12
+ require 'rake/rdoctask'
13
+ Rake::RDocTask.new do |rdoc|
14
+ rdoc.rdoc_dir = 'rdoc'
15
+ rdoc.title = 'eat'
16
+ rdoc.options << '--line-numbers' << '--inline-source'
17
+ rdoc.rdoc_files.include('README*')
18
+ rdoc.rdoc_files.include('lib/**/*.rb')
19
+ end
20
+
21
+ task :default => :test
data/lib/eat.rb CHANGED
@@ -1,42 +1,68 @@
1
1
  require 'uri'
2
2
  require 'singleton'
3
3
 
4
+ # http://weblog.jamisbuck.org/2007/2/7/infinity
5
+ unless defined?(::Infinity)
6
+ ::Infinity = 1.0/0
7
+ end
8
+
4
9
  module Eat
5
- def self.config
6
- ::Eat::Config.instance
7
- end
8
-
9
- class Config
10
- include ::Singleton
11
- attr_writer :remote_timeout
12
- def remote_timeout
13
- @remote_timeout || 2 #seconds
14
- end
15
- end
16
-
17
10
  module ObjectExtensions
18
- def eat(filesystem_path_or_uri)
19
- uri = ::URI.parse filesystem_path_or_uri.to_s
11
+ # <tt>url</tt> can be filesystem or http/https
12
+ #
13
+ # Options:
14
+ # * <tt>:timeout</tt> in seconds
15
+ # * <tt>:limit</tt> is characters (bytes in Ruby 1.8)
16
+ #
17
+ # Example:
18
+ # eat('http://brighterplanet.com') #=> '...'
19
+ # eat('http://brighterplanet.com', :timeout => 10) #=> '...'
20
+ # eat('http://brighterplanet.com', :limit => 1) #=> '.'
21
+ def eat(url, options = {})
22
+ timeout = options[:timeout] || options['timeout'] || 2
23
+ limit = options[:limit] || options['limit'] || ::Infinity
24
+ uri = ::URI.parse url.to_s
25
+
26
+ body = []
27
+ read_so_far = 0
28
+
20
29
  case uri.scheme
30
+
21
31
  when 'file', nil
22
- if ::File.readable? uri.path
23
- ::File.read uri.path
24
- else
25
- `sudo /bin/cat #{uri.path}`
32
+ chunk_size = limit < 1_048_576 ? limit : 1_048_576
33
+ ::File.open(uri.path, 'r') do |f|
34
+ while chunk = f.read(chunk_size)
35
+ break if read_so_far > limit
36
+ read_so_far += chunk_size
37
+ body << chunk
38
+ end
26
39
  end
40
+
27
41
  when 'http', 'https'
28
42
  require 'net/http'
29
43
  require 'net/https' if uri.scheme == 'https'
30
- (defined?(::SystemTimer) ? ::SystemTimer : ::Timeout).timeout(::Eat.config.remote_timeout) do
44
+ (defined?(::SystemTimer) ? ::SystemTimer : ::Timeout).timeout(timeout) do
31
45
  http = ::Net::HTTP.new uri.host, uri.port
32
46
  if uri.scheme == 'https'
33
47
  http.use_ssl = true
34
48
  # if you were trying to be real safe, you wouldn't use this library
35
49
  http.verify_mode = ::OpenSSL::SSL::VERIFY_NONE
36
50
  end
37
- http.start { |session| session.get uri.request_uri }
38
- end.body
51
+ http.start do |session|
52
+ catch :stop do
53
+ session.get(uri.request_uri, 'Accept-Encoding' => '') do |chunk|
54
+ throw :stop if read_so_far > limit
55
+ read_so_far += chunk.length
56
+ body << chunk
57
+ end
58
+ session.finish
59
+ end
60
+ end
61
+ end
62
+
39
63
  end
64
+
65
+ limit == ::Infinity ? body.join : body.join[0...limit]
40
66
  end
41
67
  end
42
68
  end
data/lib/eat/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eat
2
- VERSION = "0.0.7"
2
+ VERSION = "0.1.0"
3
3
  end
data/test/test_eat.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  require 'helper'
2
3
 
3
4
  require 'tempfile'
@@ -9,10 +10,6 @@ class Tempfile
9
10
  end
10
11
 
11
12
  class TestEat < Test::Unit::TestCase
12
- def setup
13
- ::Eat.config.remote_timeout = 10
14
- end
15
-
16
13
  def test_filesystem
17
14
  assert eat(__FILE__).include?('class TestEat < Test::Unit::TestCase')
18
15
  end
@@ -22,27 +19,15 @@ class TestEat < Test::Unit::TestCase
22
19
  end
23
20
 
24
21
  def test_uri
25
- assert eat(::URI.parse('http://brighterplanet.com/robots.txt')).include?('User-agent')
22
+ assert eat(::URI.parse('http://brighterplanet.com/robots.txt'), :timeout => 10).include?('User-agent')
26
23
  end
27
24
 
28
25
  def test_http
29
- assert eat('http://brighterplanet.com/robots.txt').include?('User-agent')
26
+ assert eat('http://brighterplanet.com/robots.txt', :timeout => 10).include?('User-agent')
30
27
  end
31
28
 
32
29
  def test_https
33
- assert eat('https://brighterplanet.com/robots.txt').include?('User-agent')
34
- end
35
-
36
- def test_sudo_filesystem
37
- f = File.open('test_sudo_filesystem.txt', 'w')
38
- f.write "hello world"
39
- f.close
40
- `sudo chown root #{f.path}`
41
- `sudo chmod go-rwx #{f.path}`
42
- assert !File.readable?(f.path)
43
- assert eat(f.path).include?('hello world')
44
- ensure
45
- `sudo rm -f #{f.path}`
30
+ assert eat('https://brighterplanet.com/robots.txt', :timeout => 10).include?('User-agent')
46
31
  end
47
32
 
48
33
  def test_openuri_uses_tempfile
@@ -54,7 +39,17 @@ class TestEat < Test::Unit::TestCase
54
39
 
55
40
  def test_eat_doesnt_use_tempfile
56
41
  assert_nothing_raised do
57
- eat 'http://do1ircpq72156.cloudfront.net/0.2.47/javascripts/prototype.rails-3.0.3.js'
42
+ eat 'http://do1ircpq72156.cloudfront.net/0.2.47/javascripts/prototype.rails-3.0.3.js', :timeout => 10
58
43
  end
59
44
  end
45
+
46
+ def test_limit_on_local_files
47
+ assert_equal '# -', eat(__FILE__, :limit => 3)
48
+ assert_equal '# -*-', eat(__FILE__, :limit => 5)
49
+ end
50
+
51
+ def test_limit_on_remote_files
52
+ assert_equal 'Use', eat(::URI.parse('http://brighterplanet.com/robots.txt'), :timeout => 10, :limit => 3)
53
+ assert_equal 'User-', eat(::URI.parse('http://brighterplanet.com/robots.txt'), :timeout => 10, :limit => 5)
54
+ end
60
55
  end
metadata CHANGED
@@ -1,48 +1,37 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: eat
3
- version: !ruby/object:Gem::Version
4
- hash: 17
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 7
10
- version: 0.0.7
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Seamus Abshere
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-04-13 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-06-27 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: test-unit
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153835220 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :development
34
- version_requirements: *id001
35
- description: Lets you open local and remote files by immediately returning their contents as a string.
36
- email:
23
+ prerelease: false
24
+ version_requirements: *2153835220
25
+ description: Lets you open local and remote files by immediately returning their contents
26
+ as a string.
27
+ email:
37
28
  - seamus@abshere.net
38
29
  executables: []
39
-
40
30
  extensions: []
41
-
42
31
  extra_rdoc_files: []
43
-
44
- files:
32
+ files:
45
33
  - .gitignore
34
+ - CHANGELOG
46
35
  - Gemfile
47
36
  - README.rdoc
48
37
  - Rakefile
@@ -51,40 +40,30 @@ files:
51
40
  - lib/eat/version.rb
52
41
  - test/helper.rb
53
42
  - test/test_eat.rb
54
- has_rdoc: true
55
43
  homepage: https://github.com/seamusabshere/eat
56
44
  licenses: []
57
-
58
45
  post_install_message:
59
46
  rdoc_options: []
60
-
61
- require_paths:
47
+ require_paths:
62
48
  - lib
63
- required_ruby_version: !ruby/object:Gem::Requirement
49
+ required_ruby_version: !ruby/object:Gem::Requirement
64
50
  none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- hash: 3
69
- segments:
70
- - 0
71
- version: "0"
72
- required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
56
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
81
61
  requirements: []
82
-
83
62
  rubyforge_project: eat
84
- rubygems_version: 1.6.2
63
+ rubygems_version: 1.8.5
85
64
  signing_key:
86
65
  specification_version: 3
87
66
  summary: A more trustworthy open-uri for use with RSS feeds, config scripts, etc.
88
- test_files:
67
+ test_files:
89
68
  - test/helper.rb
90
69
  - test/test_eat.rb