schedule-scraper 0.5.0 → 0.6.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.
@@ -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