rhack 0.3.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem 'hoe'
3
4
  gem 'libxml-ruby'
4
5
  gem 'rmtools'
@@ -0,0 +1,23 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (3.2.7)
5
+ i18n (~> 0.6)
6
+ multi_json (~> 1.0)
7
+ hoe (3.0.6)
8
+ rake (~> 0.8)
9
+ i18n (0.6.0)
10
+ libxml-ruby (2.3.3)
11
+ multi_json (1.3.6)
12
+ rake (0.9.2.2)
13
+ rmtools (1.2.10)
14
+ activesupport (>= 2.3.8)
15
+ rake (>= 0.8.7)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ hoe
22
+ libxml-ruby
23
+ rmtools
@@ -0,0 +1,22 @@
1
+ == CHANGES
2
+
3
+ == Version 0.3
4
+
5
+ * Adjusted cookie processor in accordance with web-servers and entrust redirection process to ::Scout
6
+ * Added some shortcuts to ::Frame and Curl module
7
+ * Сonfig defaults are now taken from rails
8
+ * Removed crappy database usage from lib/words.rb
9
+ * curb_multi.c: Moved callbacks out of rb_rescue so that I could know wtf was happen there
10
+
11
+ == Version 0.2
12
+
13
+ * Nastily pulled down curb-0.8.1 extension sources and harshly patched by changes made long before, so that the core will be as modern as possible and with necessary features
14
+ * Fixed syntax for Ruby 1.9
15
+
16
+ == Version 0.1
17
+
18
+ * A long time ago in a galaxy far, far away...
19
+ * A library had been created based on Net::HTTP
20
+ * In a few months its base had been changed by curb-0.4.4 because of poorness and incovinience of Net::HTTP
21
+ * Had been made background-mode for Curl::Multi and multipart body setting for Curl::Easy so that Curl could be both sync and async
22
+ * Had been added a couple of wrappers for Curl::Easy and its results, proxy lists processor, scrapers for a few web-services, and plugin for libxml-ruby that lives at rmtools gem now
@@ -51,6 +51,7 @@ lib/init.rb
51
51
  test/test_rhack.rb
52
52
  test/test_scout.rb
53
53
  test/test_frame.rb
54
+ ./Gemfile.lock
54
55
  ./LICENSE
55
56
  ./Rakefile
56
57
  ./Manifest.txt
data/README.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  ## RHACK
2
2
 
3
- Rhack is Ruby Http ACcess Kit -- curl-based web-client for developing web-clients
4
- applications.
3
+ http://2ch.ru
4
+ Rhack is Ruby Http ACcess Kit -- curl-based web-client for developing web-clients applications.
5
5
 
6
6
  ## License
7
7
 
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ rescue LoadError
8
8
  end
9
9
 
10
10
  compile_manifest
11
- RHACK_VERSION = '0.3.0'
11
+ RHACK_VERSION = '0.3.3'
12
12
  begin
13
13
  require 'hoe'
14
14
  config = Hoe.spec "rhack" do |h|
@@ -25,8 +25,9 @@ begin
25
25
  #h.extra_deps << ['curb','> 0.4']
26
26
  end
27
27
  config.spec.extensions << 'ext/curb/extconf.rb'
28
- rescue LoadError
28
+ rescue LoadError => e
29
29
  STDERR.puts "cannot load the Hoe gem. Distribution is disabled"
30
+ raise e
30
31
  rescue Exception => e
31
32
  STDERR.puts "cannot load the Hoe gem, or Hoe fails. Distribution is disabled"
32
33
  STDERR.puts "error message is: #{e.message}"
@@ -1832,9 +1832,6 @@ static VALUE ruby_curl_easy_on_redirect_set(int argc, VALUE *argv, VALUE self) {
1832
1832
  static VALUE ruby_curl_easy_on_complete_set(int argc, VALUE *argv, VALUE self) {
1833
1833
  CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, complete_proc);
1834
1834
  }
1835
- static VALUE ruby_curl_easy_optional_callback_set(int argc, VALUE *argv, VALUE self) {
1836
- CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, callback);
1837
- }
1838
1835
 
1839
1836
  /*
1840
1837
  * call-seq:
@@ -3378,7 +3375,6 @@ void init_curb_easy() {
3378
3375
  rb_define_method(cCurlEasy, "on_missing", ruby_curl_easy_on_missing_set, -1);
3379
3376
  rb_define_method(cCurlEasy, "on_redirect", ruby_curl_easy_on_redirect_set, -1);
3380
3377
  rb_define_method(cCurlEasy, "on_complete", ruby_curl_easy_on_complete_set, -1);
3381
- rb_define_method(cCurlEasy, "callback", ruby_curl_easy_optional_callback_set, -1);
3382
3378
 
3383
3379
  rb_define_method(cCurlEasy, "http", ruby_curl_easy_perform_verb, 1);
3384
3380
  rb_define_method(cCurlEasy, "http_post", ruby_curl_easy_perform_post, -1);
@@ -85,18 +85,21 @@
85
85
  \
86
86
  return oldproc; \
87
87
 
88
- /* special setter for on_event handlers that take a block, same as above but stores int he opts hash */
88
+ /* special setter for on_event handlers that take a block, same as above but stores int he opts hash
89
+ set proc to nil if handler == Proc::NULL; just return current proc if handler is not given
90
+ */
89
91
  #define CURB_HANDLER_PROC_HSETTER(type, handler) \
90
92
  type *ptr; \
91
93
  VALUE oldproc, newproc; \
92
94
  \
93
95
  Data_Get_Struct(self, type, ptr); \
94
96
  \
95
- oldproc = rb_hash_aref(ptr->opts, rb_easy_hkey(#handler)); \
97
+ oldproc = rb_hash_aref(ptr->opts, rb_easy_hkey(#handler)); \
96
98
  rb_scan_args(argc, argv, "0&", &newproc); \
97
- \
98
- rb_hash_aset(ptr->opts, rb_easy_hkey(#handler), newproc); \
99
- \
99
+ if ( RTEST(rb_funcall(newproc, rb_intern("b"), 0)) ) \
100
+ rb_hash_aset(ptr->opts, rb_easy_hkey(#handler), newproc); \
101
+ else if (newproc != Qnil) \
102
+ rb_hash_aset(ptr->opts, rb_easy_hkey(#handler), Qnil); \
100
103
  return oldproc;
101
104
 
102
105
  /* setter for numerics that are kept in c ints */
@@ -370,8 +370,8 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
370
370
 
371
371
  if (result != 0) {
372
372
  if (!rb_easy_nil("failure_proc")) {
373
- rbce->callback_active = 1;
374
373
  //callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
374
+ rbce->callback_active = 1;
375
375
  //val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
376
376
  rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
377
377
  rbce->callback_active = 0;
@@ -380,47 +380,42 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
380
380
  else if (!rb_easy_nil("success_proc") &&
381
381
  ((response_code >= 200 && response_code < 300) || response_code == 0)) {
382
382
  /* NOTE: we allow response_code == 0, in the case of non http requests e.g. reading from disk */
383
- rbce->callback_active = 1;
384
383
  //callargs = rb_ary_new3(2, rb_easy_get("success_proc"), easy);
384
+ rbce->callback_active = 1;
385
385
  //val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil);
386
386
  rb_funcall( rb_easy_get("success_proc"), idCall, 1, easy );
387
387
  rbce->callback_active = 0;
388
388
  }
389
389
  else if (!rb_easy_nil("redirect_proc") &&
390
390
  (response_code >= 300 && response_code < 400)) {
391
+ //callargs = rb_ary_new3(3, rb_easy_get("redirect_proc"), easy, rb_curl_easy_error(result));
391
392
  rbce->callback_active = 1;
392
- callargs = rb_ary_new3(3, rb_easy_get("redirect_proc"), easy, rb_curl_easy_error(result));
393
+ //val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
394
+ rb_funcall( rb_easy_get("redirect_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
393
395
  rbce->callback_active = 0;
394
- val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
395
396
  }
396
397
  else if (!rb_easy_nil("missing_proc") &&
397
398
  (response_code >= 400 && response_code < 500)) {
399
+ //callargs = rb_ary_new3(3, rb_easy_get("missing_proc"), easy, rb_curl_easy_error(result));
398
400
  rbce->callback_active = 1;
399
- callargs = rb_ary_new3(3, rb_easy_get("missing_proc"), easy, rb_curl_easy_error(result));
400
- rbce->callback_active = 0;
401
401
  val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
402
- }/*
402
+ rb_funcall( rb_easy_get("missing_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
403
+ rbce->callback_active = 0;
404
+ }
403
405
  else if (!rb_easy_nil("failure_proc") &&
404
406
  (response_code >= 500 && response_code <= 999)) {
405
- callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
407
+ //callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
406
408
  rbce->callback_active = 1;
407
- val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
409
+ //val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
410
+ rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
408
411
  rbce->callback_active = 0;
409
- //rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
410
- }*/
412
+ }
411
413
 
412
- if (!rb_easy_nil("complete_proc") || !rb_easy_nil("callback")) {
414
+ if (!rb_easy_nil("complete_proc")) {
413
415
  rbce->callback_active = 1;
414
- if (!rb_easy_nil("complete_proc")) {
415
- //callargs = rb_ary_new3(2, rb_easy_get("complete_proc"), easy);
416
- //val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil);
417
- rb_funcall( rb_easy_get("complete_proc"), idCall, 1, easy );
418
- }
419
- if (!rb_easy_nil("callback")) {
420
- //callargs = rb_ary_new3(2, rb_easy_get("callback"), easy);
421
- //val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil);
422
- rb_funcall( rb_easy_get("callback"), idCall, 1, easy );
423
- }
416
+ //callargs = rb_ary_new3(2, rb_easy_get("complete_proc"), easy);
417
+ //val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil);
418
+ rb_funcall( rb_easy_get("complete_proc"), idCall, 1, easy );
424
419
  rbce->callback_active = 0;
425
420
  }
426
421
 
@@ -25,7 +25,9 @@ module HTTPAccessKit
25
25
 
26
26
  def initialize *args
27
27
  args << 10 unless args[-1].is Fixnum
28
- @opts = {:eval => Johnson::Enabled, :redir => true, :cp => true, :result => Page}.merge!(args[-2].is(Hash) ? args[-2] : {})
28
+ args[-2] = {} unless args[-2].is Hash
29
+ @opts = {:eval => Johnson::Enabled, :redir => true, :cp => true, :result => Page}.merge!(args[-2].kinda(Hash) ? args[-2] : {})
30
+ args[-2] = @opts
29
31
  if args[0].is String
30
32
  uri = args[0]
31
33
  'http://' >> uri if uri !~ /^\w+:\/\//
@@ -61,7 +63,7 @@ module HTTPAccessKit
61
63
  end
62
64
 
63
65
  # opts are :eval, :json, :hash, :wait, :proc_result, :save_result, :load_scripts,
64
- # :zip, :thread_safe, :result, :stream, :raw + any opts for Scouts in one hash
66
+ # :zip, :thread_safe, :result, :stream, :raw, :xhr + any opts for Scouts in one hash
65
67
  def get *args, &callback
66
68
  many, order, orders, with_opts = interpret_request *args
67
69
  L.log({:many => many, :order => order, :orders => orders, :with_opts => with_opts})
@@ -133,15 +135,16 @@ module HTTPAccessKit
133
135
  if !order.b and !orders.b
134
136
  raise ArgumentError, "failed to run blank request#{'s' if many}, params was
135
137
  (#{args.inspect[1..-2]})"
136
- else
137
- opts[:wait] = opts[:sync] if :sync.in opts
138
- opts[:wait] = true if !:wait.in(opts) and
139
- :proc_result.in(opts) ? !opts[:proc_result] : opts[:save_result]
140
- opts[:eval] = false if opts[:json] or opts[:hash] or opts[:raw]
141
- opts[:load_scripts] = self if opts[:load_scripts]
142
- opts[:stream] = true if opts[:raw]
143
- [many, order, orders, opts]
144
138
  end
139
+
140
+ opts[:wait] = opts[:sync] if :sync.in opts
141
+ opts[:wait] = true if !:wait.in(opts) and
142
+ :proc_result.in(opts) ? !opts[:proc_result] : opts[:save_result]
143
+ opts[:eval] = false if opts[:json] or opts[:hash] or opts[:raw]
144
+ opts[:load_scripts] = self if opts[:load_scripts]
145
+ opts[:stream] = true if opts[:raw]
146
+ (opts[:headers] ||= {})['X-Requested-With'] = 'XMLHttpRequest' if opts[:xhr]
147
+ [many, order, orders, opts]
145
148
  end
146
149
 
147
150
  def get_cached(*links)
@@ -684,6 +687,8 @@ module HTTPAccessKit
684
687
  alias :links :get_links
685
688
  alias :get_href :get_link
686
689
  alias :link :get_link
690
+ alias :srcs :get_srcs
691
+ alias :src :get_src
687
692
 
688
693
  def expand_link(link)
689
694
  case link
@@ -3,8 +3,10 @@ module HTTPAccessKit
3
3
  include RMTools
4
4
  extend RMTools
5
5
 
6
- CONFIG = if ENV["APP_ROOT"]
7
- YAML.load(read(File.join ENV["APP_ROOT"], 'config/rhack.yml') || '') || {}
6
+ Dir.chdir ENV['APP_ROOT'] if ENV['APP_ROOT']
7
+
8
+ CONFIG = if defined? Rails
9
+ YAML.load(read('config/rhack.yml') || '') || {}
8
10
  else
9
11
  YAML.load(read(%W(config/rhack.yml rhack.yml #{File.join(ENV['HOME'], 'rhack.yml')})) || '') || {}
10
12
  end
@@ -15,8 +17,8 @@ module HTTPAccessKit
15
17
 
16
18
  L = RMLogger.new(CONFIG.logger || {})
17
19
 
18
- db_config = if ENV["APP_ROOT"] and ENV["RAILS_ENV"] and File.file?(dbyml = File.join(ENV["APP_ROOT"], 'config/database.yml'))
19
- YAML.load(read(dbyml))[ENV["RAILS_ENV"]]
20
+ db_config = if defined? Rails
21
+ YAML.load(read('config/database.yml'))[ENV["RAILS_ENV"]]
20
22
  else
21
23
  CONFIG.db || File.join(ENV['HOME'], 'db.yml')
22
24
  end
@@ -10,11 +10,22 @@ module HTTPAccessKit
10
10
 
11
11
  def initialize(service, frame, *args)
12
12
  @service = service
13
- @f = frame || Frame(self.class::URI[service], *args)
13
+ # first argument should be a string so that frame won't be static
14
+ @f = frame || Frame(self.class::URI[service] || self.class::URI[:login], *args)
14
15
  end
15
16
 
16
17
  def go(*args, &block)
17
- __send__(@service, *args, &block) rescue(Curl.reload)
18
+ __send__(@service, *args, &block)
19
+ rescue
20
+ L < $!
21
+ Curl.reload
22
+ end
23
+
24
+ def scrape!(page)
25
+ __send__(:"scrape_#{@service}", page)
26
+ if url = next_url(page)
27
+ @f.get(url) {|next_page| scrape!(next_page)}
28
+ end
18
29
  end
19
30
 
20
31
  def inspect
@@ -337,8 +337,8 @@ module HTTPAccessKit
337
337
  # exc = ['0chan.ru', '2-ch.ru', 'www.nomer.org', 'nomer.org'].select_in('http://www.nomer.org') = ['www.nomer.org', 'nomer.org']
338
338
  exc = (@@retry.keys + @retry.keys).select_in @root
339
339
  return false if !exc.b
340
- # ['www.nomer.org', 'nomer.org'].every |www| 'TiemoutError'.in({'nomer.org' => 'TimeoutError'}[www])} ?
341
- !exc.find {|e| !err[0].self_name.in((@@retry[e] || []) + @retry[e])}
340
+ # ['www.nomer.org', 'nomer.org'].every |www| 'TimeoutError'.in({'nomer.org' => 'TimeoutError'}[www])} ?
341
+ exc.no? {|e| err[0].self_name.in((@@retry[e] || []) + @retry[e])}
342
342
  end
343
343
 
344
344
  def loaded?
@@ -356,25 +356,25 @@ module HTTPAccessKit
356
356
  raise e
357
357
  end
358
358
 
359
- def load(path=@path, headers={}, not_redir=1, relvl=10)
359
+ def load(path=@path, headers={}, not_redir=1, relvl=10, &callback)
360
360
  @http.path = path = fix(path)
361
361
  @http.headers = mkHeader(path).merge!(headers)
362
- if not_redir.b
363
- @http.follow_location = false
364
- else
365
- @http.follow_location = true
366
- @http.max_redirects = relvl
367
- end
368
362
  @http.timeout = @timeout
369
363
 
370
364
  @http.on_complete {|c|
371
365
  @error = nil
372
366
  @outdated = true
373
367
  ProcCookies c.res if @cookieProc
374
- yield c if block_given?
368
+ # We cannot just cancel on_complete in on_redirect block
369
+ # because loadGet will immediately reset on_complete back
370
+ if c.res.code.in(300..399) and !not_redir.b and (relvl -= 1) > -1 and loc = c.res.hash.location
371
+ loadGet(loc, headers: headers, relvl: relvl, redir: true, &callback)
372
+ elsif block_given?
373
+ yield c
374
+ end
375
375
  }
376
376
  @http.on_failure {|c, e|
377
- @http.on_complete {}
377
+ @http.on_complete &Proc::NULL
378
378
  @outdated = true
379
379
  @error = e
380
380
  if retry? e
@@ -397,7 +397,7 @@ module HTTPAccessKit
397
397
  @last_method = :post
398
398
  if block_given?
399
399
  @post_proc = callback
400
- elsif @http.callback != @post_proc
400
+ else#if @http.callback != @post_proc
401
401
  callback = @post_proc
402
402
  end
403
403
  load(uri, opts[:headers], !opts[:redir], opts[:relvl], &callback)
@@ -410,7 +410,7 @@ module HTTPAccessKit
410
410
  @last_method = :get
411
411
  if block_given?
412
412
  @get_proc = callback
413
- elsif @http.callback != @get_proc
413
+ else#if @http.callback != @get_proc
414
414
  callback = @get_proc
415
415
  end
416
416
  load(uri, opts[:headers], !opts[:redir], opts[:relvl], &callback)
@@ -422,7 +422,7 @@ module HTTPAccessKit
422
422
  @last_method = :head
423
423
  if block_given?
424
424
  @head_proc = callback
425
- elsif @http.callback != @head_proc
425
+ else#if @http.callback != @head_proc
426
426
  callback = @head_proc
427
427
  end
428
428
  emu = lambda {
@@ -1,20 +1,8 @@
1
1
  # encoding: utf-8
2
2
  if !defined? RuDict and !defined? String::RuDict
3
3
 
4
- if d = RHACK::CONFIG['rudict']
5
- if File.file? d and (d = YAML.load(read d)).is Hash
6
- String::RuDict = d
7
- end
8
- elsif RHACK::DB
9
- class RuDictionary < ActiveRecord::Base
10
- declare :rudictionary, :id => false do |t|
11
- t.string :word
12
- t.string :form0
13
- t.string :form1
14
- t.string :form2
15
- end
16
- String::RuDict = Hash[all.map{|w| [w.word, [w.form0, w.form1, w.form2]]}]
17
- end
4
+ if d = RHACK::CONFIG['rudict'] and File.file? d and (d = YAML.load(read d)).is Hash
5
+ String::RuDict = d
18
6
  end
19
7
 
20
8
  end
@@ -30,7 +18,7 @@ class String
30
18
  else self end
31
19
  else
32
20
  mod = int%10
33
- mod == 1 ? self : pluralize
21
+ int == 1 ? self : pluralize
34
22
  end}"
35
23
  end
36
24
 
metadata CHANGED
@@ -1,97 +1,108 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rhack
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.3
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Sergey Baev
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-08-02 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-08-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rmtools
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 23
29
- segments:
30
- - 1
31
- - 0
32
- - 0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
33
21
  version: 1.0.0
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: rake
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
40
33
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 49
45
- segments:
46
- - 0
47
- - 8
48
- - 7
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
49
37
  version: 0.8.7
50
38
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: libxml-ruby
54
39
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
56
41
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 21
61
- segments:
62
- - 1
63
- - 1
64
- - 3
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.8.7
46
+ - !ruby/object:Gem::Dependency
47
+ name: libxml-ruby
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
65
53
  version: 1.1.3
66
54
  type: :runtime
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: hoe
70
55
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.1.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: rdoc
64
+ requirement: !ruby/object:Gem::Requirement
72
65
  none: false
73
- requirements:
66
+ requirements:
74
67
  - - ~>
75
- - !ruby/object:Gem::Version
76
- hash: 27
77
- segments:
78
- - 2
79
- - 12
80
- version: "2.12"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.10'
81
70
  type: :development
82
- version_requirements: *id004
83
- description: Webscraping library based on curb gem extension and libxml-ruby (and optionally Johnson and ActiveRecord)
84
- email:
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.10'
78
+ - !ruby/object:Gem::Dependency
79
+ name: hoe
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '3.0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '3.0'
94
+ description: Webscraping library based on curb gem extension and libxml-ruby (and
95
+ optionally Johnson and ActiveRecord)
96
+ email:
85
97
  - tinbka@gmail.com
86
98
  executables: []
87
-
88
- extensions:
99
+ extensions:
89
100
  - ext/curb/extconf.rb
90
- extra_rdoc_files:
101
+ extra_rdoc_files:
91
102
  - ./Manifest.txt
92
103
  - ./README.txt
93
104
  - ./History.txt
94
- files:
105
+ files:
95
106
  - ext/curb/curb_errors.c
96
107
  - ext/curb/curb_errors.h
97
108
  - ext/curb/Makefile
@@ -145,6 +156,7 @@ files:
145
156
  - test/test_rhack.rb
146
157
  - test/test_scout.rb
147
158
  - test/test_frame.rb
159
+ - ./Gemfile.lock
148
160
  - ./LICENSE
149
161
  - ./Rakefile
150
162
  - ./Manifest.txt
@@ -153,41 +165,36 @@ files:
153
165
  - ./Gemfile
154
166
  - ./History.txt
155
167
  - .gemtest
156
- homepage: http://github.com/tinbka
168
+ homepage: http://2ch.ru
157
169
  licenses: []
158
-
159
170
  post_install_message:
160
- rdoc_options:
171
+ rdoc_options:
161
172
  - --main
162
173
  - README.txt
163
- require_paths:
174
+ require_paths:
164
175
  - lib
165
- required_ruby_version: !ruby/object:Gem::Requirement
176
+ required_ruby_version: !ruby/object:Gem::Requirement
166
177
  none: false
167
- requirements:
168
- - - ">="
169
- - !ruby/object:Gem::Version
170
- hash: 3
171
- segments:
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ segments:
172
183
  - 0
173
- version: "0"
174
- required_rubygems_version: !ruby/object:Gem::Requirement
184
+ hash: -702291569
185
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
186
  none: false
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- hash: 3
180
- segments:
181
- - 0
182
- version: "0"
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
183
191
  requirements: []
184
-
185
192
  rubyforge_project: rhack
186
- rubygems_version: 1.8.17
193
+ rubygems_version: 1.8.24
187
194
  signing_key:
188
195
  specification_version: 3
189
- summary: ""
190
- test_files:
196
+ summary: ''
197
+ test_files:
191
198
  - test/test_rhack.rb
192
199
  - test/test_scout.rb
193
200
  - test/test_frame.rb