ngpod_scraper 0.1.1
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 +9 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.markdown +46 -0
- data/Rakefile +1 -0
- data/VERSION +1 -0
- data/bin/ngpod_scraper +6 -0
- data/lib/ngpod_scraper/client.rb +42 -0
- data/lib/ngpod_scraper/ngpod_scraper.rb +9 -0
- data/lib/ngpod_scraper/photo.rb +87 -0
- data/lib/ngpod_scraper/photo_page.rb +25 -0
- data/lib/ngpod_scraper/version.rb +3 -0
- data/lib/ngpod_scraper.rb +12 -0
- data/ngpod_scraper.gemspec +29 -0
- data/spec/fixtures/config.yml +8 -0
- data/spec/fixtures/test.html +2698 -0
- data/spec/fixtures/test.jpg +0 -0
- data/spec/ngpod_scraper/client_spec.rb +81 -0
- data/spec/ngpod_scraper/ngpod_scraper_spec.rb +17 -0
- data/spec/ngpod_scraper/photo_page_spec.rb +39 -0
- data/spec/ngpod_scraper/photo_spec.rb +129 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- metadata +183 -0
Binary file
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Client" do
|
4
|
+
describe "new" do
|
5
|
+
it "should convert the config's keys to symbols" do
|
6
|
+
config = {'url' => "file://spec/fixtures/test.html", 'photo' => {'path_format' => 'test.jpg'}}
|
7
|
+
|
8
|
+
client = NgpodScraper::Client.new(config)
|
9
|
+
client.config[:url].should == config['url']
|
10
|
+
client.config[:photo][:path_format].should == config['photo']['path_format']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "run" do
|
15
|
+
before :each do
|
16
|
+
url = 'http://photography.nationalgeographic.com/photography/photo-of-the-day'
|
17
|
+
FakeWeb.register_uri(:get, url, :body => 'spec/fixtures/test.html')
|
18
|
+
|
19
|
+
photo_url = 'http://s.ngeo.com/wpf/media-live/photos/000/210/cache/istiqlal-mosque-jakarta_21078_990x742.jpg'
|
20
|
+
FakeWeb.register_uri(:get, photo_url, :body => 'spec/fixtures/test.jpg')
|
21
|
+
|
22
|
+
@config = {
|
23
|
+
:url => url,
|
24
|
+
:show_logs => false,
|
25
|
+
:photo => {
|
26
|
+
:path_format => 'tmp/#{year}-#{month}/#{day}-#{hour}.jpg',
|
27
|
+
:wallpaper_path_format => 'tmp/photo-of-the-day.jpg',
|
28
|
+
:wallpaper_width => 1280,
|
29
|
+
:wallpaper_height => 800,
|
30
|
+
:wallpaper_background_color => 'black'
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should build a photo" do
|
36
|
+
client = NgpodScraper::Client.new(@config)
|
37
|
+
photo = client.run
|
38
|
+
photo.should_not be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should not do anything if the photo exists" do
|
42
|
+
path = 'spec/fixtures/test.jpg'
|
43
|
+
@config[:path_format] = path
|
44
|
+
Pow(path).exists?.should be_true
|
45
|
+
|
46
|
+
photo = Photo.new(:file => Pow(path).open, :path_format => path)
|
47
|
+
photo.should_not_receive(:save)
|
48
|
+
|
49
|
+
client = NgpodScraper::Client.new(@config)
|
50
|
+
client.should_receive(:get_photo).and_return(photo)
|
51
|
+
|
52
|
+
client.run
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should save the photo if the photo does not exist" do
|
56
|
+
path = 'tmp/#{year}-#{month}/test.jpg'
|
57
|
+
Pow("tmp/#{Time.now.strftime('%Y-%m')}/test.jpg").exists?.should be_false
|
58
|
+
|
59
|
+
@config[:photo][:path_format] = path
|
60
|
+
client = NgpodScraper::Client.new(@config)
|
61
|
+
photo = client.run
|
62
|
+
|
63
|
+
Pow("tmp/#{Time.now.strftime('%Y-%m')}/test.jpg").exists?.should be_true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should save the wallpaper if the photo does not exist" do
|
67
|
+
path = 'tmp/test.jpg'
|
68
|
+
|
69
|
+
wallpaper_path = 'tmp/wallpaper.jpg'
|
70
|
+
Pow("tmp/wallpaper.jpg").exists?.should be_false
|
71
|
+
|
72
|
+
@config[:photo][:path_format] = path
|
73
|
+
@config[:photo][:wallpaper_path_format] = wallpaper_path
|
74
|
+
|
75
|
+
client = NgpodScraper::Client.new(@config)
|
76
|
+
photo = client.run
|
77
|
+
|
78
|
+
Pow("tmp/wallpaper.jpg").exists?.should be_true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "NgpodScraper" do
|
4
|
+
describe "client(path)" do
|
5
|
+
it "should return a client whose config is from the path" do
|
6
|
+
path = 'spec/fixtures/config.yml'
|
7
|
+
|
8
|
+
config = YAML.load_file(path)
|
9
|
+
config.should be_a(Hash)
|
10
|
+
config.should_not be_empty
|
11
|
+
|
12
|
+
client = NgpodScraper.client(path)
|
13
|
+
client.config[:url].should == config['url']
|
14
|
+
client.config[:photo][:path_format].should == config['photo']['path_format']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "PhotoPage" do
|
4
|
+
describe "new" do
|
5
|
+
it "should set the url and config of the page" do
|
6
|
+
url = 'http://photography.nationalgeographic.com/photography/photo-of-the-day'
|
7
|
+
config = {:show_logs => true}
|
8
|
+
photo_page = PhotoPage.new(url, config)
|
9
|
+
photo_page.url.should == url
|
10
|
+
photo_page.config.should == config
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "photo" do
|
15
|
+
it "should get the photo of the day from the page" do
|
16
|
+
url = 'http://photography.nationalgeographic.com/photography/photo-of-the-day'
|
17
|
+
FakeWeb.register_uri(:get, url, :body => 'spec/fixtures/test.html')
|
18
|
+
|
19
|
+
photo_url = 'http://s.ngeo.com/wpf/media-live/photos/000/210/cache/istiqlal-mosque-jakarta_21078_990x742.jpg'
|
20
|
+
FakeWeb.register_uri(:get, photo_url, :body => 'spec/fixtures/test.jpg')
|
21
|
+
|
22
|
+
photo_page = PhotoPage.new(url)
|
23
|
+
photo = photo_page.photo
|
24
|
+
|
25
|
+
photo.should be_a(Photo)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "photo_url" do
|
30
|
+
it "should be the url of the photo of the day in the page" do
|
31
|
+
url = 'http://photography.nationalgeographic.com/photography/photo-of-the-day'
|
32
|
+
body = Pow('spec/fixtures/test.html').open.read
|
33
|
+
FakeWeb.register_uri(:get, url, :body => body)
|
34
|
+
|
35
|
+
photo_page = PhotoPage.new(url)
|
36
|
+
photo_page.photo_url.gsub(/\s+/, '').length.should > 0
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe "Photo" do
|
3
|
+
describe "new" do
|
4
|
+
it "should set its attributes" do
|
5
|
+
attributes = {
|
6
|
+
:path_format => 'spec/tmp/#{f.name}',
|
7
|
+
:wallpaper_path_format => 'spec/tmp/photo-of-the-day.jpg',
|
8
|
+
:wallpaper_width => 1280,
|
9
|
+
:wallpaper_height => 800
|
10
|
+
}
|
11
|
+
|
12
|
+
photo = Photo.new(attributes)
|
13
|
+
photo.path_format.should == attributes[:path_format]
|
14
|
+
photo.wallpaper_path_format.should == attributes[:wallpaper_path_format]
|
15
|
+
photo.wallpaper_width.should == attributes[:wallpaper_width]
|
16
|
+
photo.wallpaper_height.should == attributes[:wallpaper_height]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "exists?" do
|
21
|
+
it "should be false if there's no file saved in photo.path" do
|
22
|
+
path = Pow('spec/fixtures/1.jpg')
|
23
|
+
path.exists?.should be_false
|
24
|
+
|
25
|
+
photo = Photo.new(:file => Pow('spec/fixtures/test.jpg').open, :path_format => 'spec/fixtures/1.jpg')
|
26
|
+
photo.exists?.should be_false
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be true if there's there's file saved in photo.path" do
|
30
|
+
path = Pow('spec/fixtures/test.jpg')
|
31
|
+
path.exists?.should be_true
|
32
|
+
|
33
|
+
photo = Photo.new(:file => path.open, :path_format => path.to_s)
|
34
|
+
photo.exists?.should be_true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "path" do
|
39
|
+
it "should eval the path_format" do
|
40
|
+
file = Pow('spec/fixtures/test.jpg').open
|
41
|
+
time = Time.now
|
42
|
+
|
43
|
+
photo = Photo.new(:url => file.path, :file => file, :path_format => 'tmp/#{year}/#{month}/#{day}/#{hour}-#{name}')
|
44
|
+
photo.path.should =~ /#{"tmp/#{time.strftime('%Y/%m/%d/%H')}-#{Pow(file.path).name}"}/
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "path" do
|
49
|
+
it "should eval the wallpaper_path_format" do
|
50
|
+
file = Pow('spec/fixtures/test.jpg').open
|
51
|
+
time = Time.now
|
52
|
+
|
53
|
+
photo = Photo.new(:url => file.path, :file => file, :wallpaper_path_format => 'tmp/#{year}/#{month}/#{day}/#{hour}-#{name}')
|
54
|
+
photo.wallpaper_path.should =~ /#{"tmp/#{time.strftime('%Y/%m/%d/%H')}-#{Pow(file.path).name}"}/
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "save" do
|
59
|
+
it "should save the photo in its path" do
|
60
|
+
file = Pow('spec/fixtures/test.jpg').open
|
61
|
+
photo = Photo.new(:url => file.path, :file => file, :path_format => 'tmp/#{year}/#{name}')
|
62
|
+
Pow(photo.path).exists?.should be_false
|
63
|
+
|
64
|
+
photo.save
|
65
|
+
|
66
|
+
Pow(photo.path).exists?.should be_true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "wallpaper_scale" do
|
71
|
+
it "should be the wallpaper_height/image.height if that is the smallest" do
|
72
|
+
file = Pow('spec/fixtures/test.jpg').open
|
73
|
+
photo = Photo.new(:file => file, :path_format => file.path)
|
74
|
+
photo.wallpaper_height = photo.image.rows / 4
|
75
|
+
photo.wallpaper_width = photo.image.columns / 2
|
76
|
+
|
77
|
+
photo.wallpaper_scale.should == photo.wallpaper_height.to_f / photo.image.rows
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should be the wallpaper_width/image.width if that is the smallest" do
|
81
|
+
file = Pow('spec/fixtures/test.jpg').open
|
82
|
+
photo = Photo.new(:file => file, :path_format => file.path)
|
83
|
+
photo.wallpaper_height = photo.image.rows / 2
|
84
|
+
photo.wallpaper_width = photo.image.columns / 4
|
85
|
+
|
86
|
+
photo.wallpaper_scale.should == photo.wallpaper_width.to_f / photo.image.columns
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should be 1 if both height and width rations are greater that 1 (don't enlarge the image)" do
|
90
|
+
file = Pow('spec/fixtures/test.jpg').open
|
91
|
+
photo = Photo.new(:file => file, :path_format => file.path)
|
92
|
+
photo.wallpaper_height = photo.image.rows * 2
|
93
|
+
photo.wallpaper_width = photo.image.columns * 4
|
94
|
+
|
95
|
+
photo.wallpaper_scale.should == 1
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "wallpaper" do
|
100
|
+
it "should be the image centered in a background" do
|
101
|
+
file = Pow('spec/fixtures/test.jpg').open
|
102
|
+
|
103
|
+
photo = Photo.new(:file => file, :path_format => file.path, :wallpaper_background_color => 'black')
|
104
|
+
photo.wallpaper_height = photo.image.rows * 2
|
105
|
+
photo.wallpaper_width = photo.image.columns * 4
|
106
|
+
|
107
|
+
#sorry, I don't know how I can test this
|
108
|
+
photo.wallpaper.should be_a(Magick::Image)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "save_wallpaper" do
|
113
|
+
it "should save the wallpaper in the wallpaper_path" do
|
114
|
+
file = Pow('spec/fixtures/test.jpg').open
|
115
|
+
|
116
|
+
photo = Photo.new(:file => file, :path_format => file.path)
|
117
|
+
photo.wallpaper_background_color = 'black'
|
118
|
+
photo.wallpaper_height = 800
|
119
|
+
photo.wallpaper_width = 1280
|
120
|
+
photo.wallpaper_path_format = "tmp/#{Time.now.to_i}-wallpaper.jpg"
|
121
|
+
|
122
|
+
Pow(photo.wallpaper_path).exists?.should_not be_true
|
123
|
+
|
124
|
+
photo.save_wallpaper
|
125
|
+
|
126
|
+
Pow(photo.wallpaper_path).exists?.should be_true
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ngpod_scraper'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'fakeweb'
|
4
|
+
|
5
|
+
include NgpodScraper
|
6
|
+
|
7
|
+
Spec::Runner.configure do |config|
|
8
|
+
config.before :suite do
|
9
|
+
FakeWeb.allow_net_connect = false
|
10
|
+
end
|
11
|
+
|
12
|
+
config.after :each do
|
13
|
+
Pow('tmp').delete! if Pow('tmp').exists?
|
14
|
+
FakeWeb.clean_registry
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ngpod_scraper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- George Mendoza
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-12-04 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: fakeweb
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 2
|
32
|
+
- 8
|
33
|
+
version: 1.2.8
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 27
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 3
|
48
|
+
- 0
|
49
|
+
version: 1.3.0
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: nokogiri
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 4
|
64
|
+
- 2
|
65
|
+
version: 1.4.2
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: pow
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 17
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
- 2
|
80
|
+
- 3
|
81
|
+
version: 0.2.3
|
82
|
+
type: :runtime
|
83
|
+
version_requirements: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rmagick
|
86
|
+
prerelease: false
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 57
|
93
|
+
segments:
|
94
|
+
- 2
|
95
|
+
- 13
|
96
|
+
- 1
|
97
|
+
version: 2.13.1
|
98
|
+
type: :runtime
|
99
|
+
version_requirements: *id005
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: valuable
|
102
|
+
prerelease: false
|
103
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 59
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
- 8
|
112
|
+
- 2
|
113
|
+
version: 0.8.2
|
114
|
+
type: :runtime
|
115
|
+
version_requirements: *id006
|
116
|
+
description: A tool for scraping National Geographic's Photo of the Day
|
117
|
+
email:
|
118
|
+
- gsmendoza@gmail.com
|
119
|
+
executables:
|
120
|
+
- ngpod_scraper
|
121
|
+
extensions: []
|
122
|
+
|
123
|
+
extra_rdoc_files: []
|
124
|
+
|
125
|
+
files:
|
126
|
+
- .gitignore
|
127
|
+
- Gemfile
|
128
|
+
- LICENSE
|
129
|
+
- README.markdown
|
130
|
+
- Rakefile
|
131
|
+
- VERSION
|
132
|
+
- bin/ngpod_scraper
|
133
|
+
- lib/ngpod_scraper.rb
|
134
|
+
- lib/ngpod_scraper/client.rb
|
135
|
+
- lib/ngpod_scraper/ngpod_scraper.rb
|
136
|
+
- lib/ngpod_scraper/photo.rb
|
137
|
+
- lib/ngpod_scraper/photo_page.rb
|
138
|
+
- lib/ngpod_scraper/version.rb
|
139
|
+
- ngpod_scraper.gemspec
|
140
|
+
- spec/fixtures/config.yml
|
141
|
+
- spec/fixtures/test.html
|
142
|
+
- spec/fixtures/test.jpg
|
143
|
+
- spec/ngpod_scraper/client_spec.rb
|
144
|
+
- spec/ngpod_scraper/ngpod_scraper_spec.rb
|
145
|
+
- spec/ngpod_scraper/photo_page_spec.rb
|
146
|
+
- spec/ngpod_scraper/photo_spec.rb
|
147
|
+
- spec/spec.opts
|
148
|
+
- spec/spec_helper.rb
|
149
|
+
homepage: http://github.com/gsmendoza/ngpod_scraper
|
150
|
+
licenses: []
|
151
|
+
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
|
155
|
+
require_paths:
|
156
|
+
- lib
|
157
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
none: false
|
159
|
+
requirements:
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
hash: 3
|
163
|
+
segments:
|
164
|
+
- 0
|
165
|
+
version: "0"
|
166
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
hash: 3
|
172
|
+
segments:
|
173
|
+
- 0
|
174
|
+
version: "0"
|
175
|
+
requirements: []
|
176
|
+
|
177
|
+
rubyforge_project: ngpod_scraper
|
178
|
+
rubygems_version: 1.8.10
|
179
|
+
signing_key:
|
180
|
+
specification_version: 3
|
181
|
+
summary: National Geographic Photo of the Day Screen Scraper
|
182
|
+
test_files: []
|
183
|
+
|