schedule-scraper 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +4,7 @@ require 'csv'
4
4
  require 'uri'
5
5
  require 'nokogiri'
6
6
  require "schedule-scraper/version"
7
+ require "schedule-scraper/config"
7
8
  require "schedule-scraper/event"
8
9
  require "schedule-scraper/schedule"
9
10
  require "schedule-scraper/pointstreak/event"
@@ -12,25 +13,28 @@ require "schedule-scraper/ezleagues/event"
12
13
  require "schedule-scraper/ezleagues/schedule"
13
14
 
14
15
  module ScheduleScraper
15
- def self.fetch(type, url)
16
+ def self.fetch(type_or_url, url = nil)
17
+ type = url ? type_or_url : type_from_url(type_or_url)
18
+ url = url || type_or_url
19
+
16
20
  raise UnsupportedSchedule unless supported_schedules.include?(type.to_sym)
17
21
  raise InvalidURL unless valid_url?(url)
18
22
 
19
23
  type_class(type).fetch(url)
20
24
  end
21
25
 
22
- def self.type_class(type)
23
- case type
24
- when :pointstreak then Pointstreak::Schedule
25
- when :ezleagues then EZLeagues::Schedule
26
+ def self.type_from_url(url)
27
+ Config.types.each do |key, klass|
28
+ return key if /#{key}/ =~ url
26
29
  end
27
30
  end
28
31
 
32
+ def self.type_class(type)
33
+ Config.types[type]
34
+ end
35
+
29
36
  def self.supported_schedules
30
- [
31
- :pointstreak,
32
- :ezleagues
33
- ]
37
+ Config.types.keys
34
38
  end
35
39
 
36
40
  def self.valid_url?(url)
@@ -0,0 +1,15 @@
1
+ module ScheduleScraper
2
+ class Config
3
+ class << self
4
+ attr_accessor :types
5
+ end
6
+
7
+ def self.register_type(klass)
8
+ @types = {} unless @types
9
+
10
+ key = klass.to_s.downcase.split("::")[1].to_sym
11
+
12
+ @types[key] = klass
13
+ end
14
+ end
15
+ end
@@ -11,6 +11,7 @@ module ScheduleScraper
11
11
 
12
12
  def self.included(base)
13
13
  base.extend ClassMethods
14
+ Config.register_type base
14
15
  end
15
16
 
16
17
  def to_h
@@ -1,3 +1,3 @@
1
1
  module ScheduleScraper
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -0,0 +1,22 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ module ScheduleScraper
4
+ module ExampleSite
5
+ class Schedule
6
+ include ScheduleScraper::Schedule
7
+ end
8
+ end
9
+ end
10
+
11
+ describe ScheduleScraper::Config do
12
+ describe ".register_type" do
13
+ it "retains the included class type" do
14
+ expected = ScheduleScraper::ExampleSite::Schedule
15
+ ScheduleScraper::Config.types.values.must_include(expected)
16
+ end
17
+
18
+ it "converts the class to a simple symbol for the type" do
19
+ ScheduleScraper::Config.types.keys.must_include(:examplesite)
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,11 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
2
 
3
3
  describe ScheduleScraper::Schedule do
4
- subject() { ScheduleTest.fetch("http://www.xyz.com") }
4
+ subject() { ScheduleScraper::ScheduleTest.fetch("http://www.xyz.com") }
5
+
6
+ it "adds itself to avaliable schedule types" do
7
+ ScheduleScraper::Config.types.keys.must_include(:scheduletest)
8
+ end
5
9
 
6
10
  it "converts events to a list hashes" do
7
11
  export = subject.to_h
@@ -15,6 +15,12 @@ describe ScheduleScraper do
15
15
  }.must_raise ScheduleScraper::UnsupportedSchedule
16
16
  end
17
17
 
18
+ it "supports deterministic schedule types" do
19
+ ScheduleScraper::Pointstreak::Schedule.stub :fetch, nil do
20
+ ScheduleScraper.fetch(options)
21
+ end
22
+ end
23
+
18
24
  it "validates the url" do
19
25
  -> {
20
26
  ScheduleScraper.fetch(:pointstreak, "abc")
data/spec/spec_helper.rb CHANGED
@@ -23,19 +23,21 @@ class EventTest
23
23
  def time; @time ||= "09:00 PM"; end
24
24
  end
25
25
 
26
- class ScheduleTest
27
- include ScheduleScraper::Schedule
26
+ module ScheduleScraper
27
+ class ScheduleTest
28
+ include ScheduleScraper::Schedule
28
29
 
29
- def self.fetch(url)
30
- new()
31
- end
30
+ def self.fetch(url)
31
+ new()
32
+ end
32
33
 
33
- def events
34
- (1..10).collect { EventTest.new }
35
- end
34
+ def events
35
+ (1..10).collect { EventTest.new }
36
+ end
36
37
 
37
- def event_class
38
- EventTest
38
+ def event_class
39
+ EventTest
40
+ end
39
41
  end
40
42
  end
41
43
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schedule-scraper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-07 00:00:00.000000000 Z
12
+ date: 2012-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nibbler
@@ -154,6 +154,7 @@ files:
154
154
  - README.md
155
155
  - Rakefile
156
156
  - lib/schedule-scraper.rb
157
+ - lib/schedule-scraper/config.rb
157
158
  - lib/schedule-scraper/event.rb
158
159
  - lib/schedule-scraper/ezleagues/event.rb
159
160
  - lib/schedule-scraper/ezleagues/schedule.rb
@@ -162,6 +163,7 @@ files:
162
163
  - lib/schedule-scraper/schedule.rb
163
164
  - lib/schedule-scraper/version.rb
164
165
  - schedule-scraper.gemspec
166
+ - spec/schedule-scraper/config_spec.rb
165
167
  - spec/schedule-scraper/event_spec.rb
166
168
  - spec/schedule-scraper/ezleagues/event_spec.rb
167
169
  - spec/schedule-scraper/ezleagues/schedule_spec.rb
@@ -198,6 +200,7 @@ specification_version: 3
198
200
  summary: A web calendar scraper for sites that do not provid portable (csv, i-cal
199
201
  etc) version. Initial version suport PointStreak.com.
200
202
  test_files:
203
+ - spec/schedule-scraper/config_spec.rb
201
204
  - spec/schedule-scraper/event_spec.rb
202
205
  - spec/schedule-scraper/ezleagues/event_spec.rb
203
206
  - spec/schedule-scraper/ezleagues/schedule_spec.rb