flickr_offline_gallery 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +9 -0
  5. data/{LICENSE.txt → _LICENSE.txt} +0 -0
  6. data/bin/flickr_offline_gallery +2 -1
  7. data/erb/photo.html.erb +23 -2
  8. data/erb/photoset.html.erb +2 -1
  9. data/fixtures/vcr_cassettes/full_photo_sizes.yml +152 -0
  10. data/fixtures/vcr_cassettes/full_photo_sizes_with_janky_metadata.yml +147 -0
  11. data/fixtures/vcr_cassettes/image_downloads.yml +15096 -0
  12. data/fixtures/vcr_cassettes/init.yml +160 -0
  13. data/fixtures/vcr_cassettes/photo.yml +71 -0
  14. data/fixtures/vcr_cassettes/photo_sizes.yml +84 -0
  15. data/fixtures/vcr_cassettes/photo_with_janky_metadata.yml +70 -0
  16. data/fixtures/vcr_cassettes/photoset.yml +663 -0
  17. data/fixtures/vcr_cassettes/photset_downloader_spec.yml +1017 -0
  18. data/flickr_offline_gallery.gemspec +2 -1
  19. data/lib/flickr_offline_gallery/flickr_a_p_i.rb +23 -0
  20. data/lib/flickr_offline_gallery/gallery_generator.rb +26 -0
  21. data/lib/flickr_offline_gallery/path_manager.rb +37 -0
  22. data/lib/flickr_offline_gallery/photo.rb +28 -21
  23. data/lib/flickr_offline_gallery/photo_page.rb +23 -0
  24. data/lib/flickr_offline_gallery/photo_size.rb +9 -4
  25. data/lib/flickr_offline_gallery/photo_sizes.rb +11 -7
  26. data/lib/flickr_offline_gallery/photoset.rb +27 -6
  27. data/lib/flickr_offline_gallery/photoset_downloader.rb +21 -5
  28. data/lib/flickr_offline_gallery/photoset_index_page.rb +17 -0
  29. data/lib/flickr_offline_gallery/template_renderer.rb +42 -0
  30. data/lib/flickr_offline_gallery/verbose_puts.rb +8 -0
  31. data/lib/flickr_offline_gallery/version.rb +1 -1
  32. data/lib/flickr_offline_gallery.rb +7 -40
  33. data/spec/flickr_offline_gallery/gallery_generator_spec.rb +35 -0
  34. data/spec/flickr_offline_gallery/path_manager_spec.rb +34 -0
  35. data/spec/flickr_offline_gallery/photo_page_spec.rb +42 -0
  36. data/spec/flickr_offline_gallery/photo_size_spec.rb +32 -0
  37. data/spec/flickr_offline_gallery/photo_sizes_spec.rb +23 -0
  38. data/spec/flickr_offline_gallery/photo_spec.rb +81 -0
  39. data/spec/flickr_offline_gallery/photoset_downloader_spec.rb +27 -0
  40. data/spec/flickr_offline_gallery/photoset_spec.rb +35 -0
  41. data/spec/flickr_offline_gallery/template_renderer_spec.rb +51 -0
  42. data/spec/flickr_offline_gallery/verbose_puts_spec.rb +33 -0
  43. data/spec/spec_helper.rb +82 -0
  44. metadata +59 -5
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+
5
+ describe GalleryGenerator do
6
+ subject!(:photoset) do
7
+ VCR.use_cassette('photoset') do
8
+ Photoset.new("72157639475533743",
9
+ :output_path => SPEC_TMP_DIR)
10
+ end
11
+ end
12
+
13
+ subject(:generator) { described_class.new(photoset) }
14
+
15
+ it "Should render a photoset gallery" do
16
+ VCR.use_cassette('image_downloads') do
17
+ generator.render_photoset("medium")
18
+ end
19
+ expect(Dir.glob(File.join(SPEC_TMP_DIR, "**", "*")).map do |path|
20
+ path.sub(SPEC_TMP_DIR, '')
21
+ end).to eq(["/flickr-offline-gallery-specs",
22
+ "/flickr-offline-gallery-specs/10440808526.html",
23
+ "/flickr-offline-gallery-specs/10440808526.jpg",
24
+ "/flickr-offline-gallery-specs/11224643544.html",
25
+ "/flickr-offline-gallery-specs/11224643544.jpg",
26
+ "/flickr-offline-gallery-specs/11439134074.html",
27
+ "/flickr-offline-gallery-specs/11439134074.jpg",
28
+ "/flickr-offline-gallery-specs/9579531199.html",
29
+ "/flickr-offline-gallery-specs/9579531199.jpg",
30
+ "/flickr-offline-gallery-specs.html"])
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe PathManager do
5
+ let(:base_path) { "/tmp/galleries" }
6
+ let(:slug) { "holiday-photos" }
7
+ let(:photo_id) { "1235645" }
8
+ subject(:path_manager) { described_class.new(base_path, slug) }
9
+
10
+ it "should have an index page named the same as the slug" do
11
+ expect(path_manager.index_page).to eq( "/tmp/galleries/holiday-photos.html")
12
+ end
13
+
14
+ it "should put photos and their pages in a common folder" do
15
+ expect(path_manager.photo_output_path).to eq( "/tmp/galleries/holiday-photos")
16
+ expect(path_manager.full_path_for(photo_id, :jpg)).to eq( "/tmp/galleries/holiday-photos/1235645.jpg")
17
+ expect(path_manager.full_path_for(photo_id, :html)).to eq("/tmp/galleries/holiday-photos/1235645.html")
18
+ end
19
+
20
+ it "should give relative links for the index page" do
21
+ expect(path_manager.relative_path_for(photo_id, :jpg)).to eq( "holiday-photos/1235645.jpg")
22
+ expect(path_manager.relative_path_for(photo_id, :html)).to eq("holiday-photos/1235645.html")
23
+ end
24
+
25
+ it "should give filenames for the photo page" do
26
+ expect(path_manager.filename_for_photo(photo_id, :jpg)).to eq( "1235645.jpg")
27
+ end
28
+
29
+ it "should give 'back' links back to the index page for photo pages" do
30
+ expect(path_manager.back_to_index).to eq( "../holiday-photos.html")
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe PhotoPage do
5
+
6
+ let(:photo_id) { "9579531199" }
7
+
8
+ let(:horrible_raw_flickr_junk) do
9
+ VCR.use_cassette('photo_with_janky_metadata') do
10
+ FlickrAPI.get_photo_info(photo_id)
11
+ end
12
+ end
13
+
14
+ let(:path_manager) { double("PathManager",
15
+ :back_to_index => "foo",
16
+ :filename_for_photo => "bar"
17
+ ) }
18
+ let(:photoset_id) { "ffff" }
19
+
20
+ let!(:photo) {
21
+
22
+ VCR.use_cassette('full_photo_sizes_with_janky_metadata') do
23
+ Photo.new(horrible_raw_flickr_junk,
24
+ :photoset_id => photoset_id,
25
+ :path_manager => path_manager)
26
+ end
27
+ }
28
+
29
+ subject!(:photo_page) {
30
+ described_class.new(photo)
31
+ }
32
+
33
+ it "should be utf-8" do
34
+ expect(photo_page.render).to include(%(<meta http-equiv="Content-Type" content="text/html; charset=utf-8">))
35
+ end
36
+
37
+ it "should html encode titles/etc" do
38
+ expect(photo_page.render).to include(%(alt="This &quot;néeds&quot; sóme &#39;fü**ed up çhara&quot;cterş"))
39
+ expect(photo_page.render).to include(%(title="This &quot;néeds&quot; sóme &#39;fü**ed up çhara&quot;cterş by Lucas the nomad, on Flickr"))
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe PhotoSize do
5
+
6
+ subject!(:size) {
7
+ VCR.use_cassette('photo_sizes') do
8
+ described_class.new(FlickrAPI.get_photo_sizes("10440808526")[2])
9
+ end
10
+ }
11
+
12
+ it "should should know its label" do
13
+ expect(size.label).to eq("Thumbnail")
14
+ end
15
+
16
+ it "should should know its height" do
17
+ expect(size.height).to eq("75")
18
+ end
19
+
20
+ it "should should know its width" do
21
+ expect(size.width).to eq("100")
22
+ end
23
+
24
+ it "should should know its url" do
25
+ expect(size.url).to eq("https://farm8.staticflickr.com/7402/10440808526_c3fd515635_t.jpg")
26
+ end
27
+
28
+ it 'should know its filename friendly key' do
29
+ expect(size.key).to eq("thumbnail")
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe PhotoSizes do
5
+
6
+ let(:raw_flickr_response) do
7
+ VCR.use_cassette('photo_sizes') do
8
+ FlickrAPI.get_photo_sizes("10440808526")
9
+ end
10
+ end
11
+
12
+ subject!(:sizes) { described_class.new(raw_flickr_response) }
13
+
14
+ it "should allow access like an array" do
15
+ expect(sizes["thumbnail"]).to be_a(PhotoSize)
16
+ expect(sizes["thumbnail"].label).to eq("Thumbnail")
17
+ end
18
+
19
+ it "should respond to #each" do
20
+ expect(sizes).to respond_to(:each)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe Photo do
5
+
6
+ let(:photo_id) { "10440808526" }
7
+
8
+ let(:horrible_raw_flickr_junk) do
9
+ VCR.use_cassette('photo') do
10
+ FlickrAPI.get_photo_info(photo_id)
11
+ end
12
+ end
13
+
14
+ let(:path_manager) { double("PathManager") }
15
+ let(:photoset_id) { "ffff" }
16
+
17
+ subject!(:photo) {
18
+
19
+ VCR.use_cassette('full_photo_sizes') do
20
+ described_class.new(horrible_raw_flickr_junk,
21
+ :photoset_id => photoset_id,
22
+ :path_manager => path_manager)
23
+ end
24
+ }
25
+
26
+ it "should have a title" do
27
+ expect(photo.title).to eq("Giant hippo yawn")
28
+ end
29
+
30
+ it "should have a url" do
31
+ expect(photo.url).to eq("https://www.flickr.com/photos/lucasthenomad/10440808526/in/set-ffff")
32
+ end
33
+
34
+ it "should have a base_url" do
35
+ expect(photo.base_url).to eq("https://www.flickr.com/photos/lucasthenomad/10440808526/")
36
+ end
37
+
38
+ context "delegating path work to the path manager" do
39
+
40
+ it "should ask the path manager for its img_filename" do
41
+ path_manager.should_receive(:filename_for_photo).with(photo_id, :jpg)
42
+ photo.img_filename
43
+ end
44
+
45
+ it "should ask the path manager for its full_jpg_path" do
46
+ path_manager.should_receive(:full_path_for).with(photo_id, :jpg)
47
+ photo.full_jpg_path
48
+ end
49
+
50
+ it "should ask the path manager for its full_html_path" do
51
+ path_manager.should_receive(:full_path_for).with(photo_id, :html)
52
+ photo.full_html_path
53
+ end
54
+
55
+ it "should ask the path manager for its relative_jpg_path" do
56
+ path_manager.should_receive(:relative_path_for).with(photo_id, :jpg)
57
+ photo.relative_jpg_path
58
+ end
59
+
60
+ it "should ask the path manager for its relative_html_path" do
61
+ path_manager.should_receive(:relative_path_for).with(photo_id, :html)
62
+ photo.relative_html_path
63
+ end
64
+
65
+ it "should ask the path manager for its back_to_index_url" do
66
+ path_manager.should_receive(:back_to_index)
67
+ photo.back_to_index_url
68
+ end
69
+
70
+ end
71
+
72
+ it "should have sizes" do
73
+ expect(photo.sizes).to be_a(PhotoSizes)
74
+ end
75
+
76
+ it "should have a author" do
77
+ expect(photo.author).to eq("Lucas the nomad")
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe PhotosetDownloader do
5
+
6
+ subject(:photoset_downloader) do
7
+ described_class.new(photoset, selected_size)
8
+ end
9
+ let(:selected_size) { :thumbnail }
10
+
11
+ let(:photoset) do
12
+ VCR.use_cassette('photoset') do
13
+ Photoset.new("72157639475533743",
14
+ :output_path => SPEC_TMP_DIR)
15
+ end
16
+ end
17
+
18
+ it 'should download' do
19
+ VCR.use_cassette('photset_downloader_spec') do
20
+ photoset_downloader.download
21
+ end
22
+ expect(File.exist?(photoset.photos[0].full_jpg_path)).to be_true
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+ describe Photoset do
5
+ subject(:photoset) do
6
+ VCR.use_cassette('photoset') do
7
+ described_class.new("72157639475533743",
8
+ :output_path => SPEC_TMP_DIR)
9
+ end
10
+ end
11
+
12
+ it 'should have a username' do
13
+ expect(photoset.username).to eq("Lucas the nomad")
14
+ end
15
+
16
+ it 'should have a title' do
17
+ expect(photoset.title).to eq("flickr_offline_gallery specs")
18
+ end
19
+
20
+ it 'should have a slug' do
21
+ expect(photoset.slug).to eq("flickr-offline-gallery-specs")
22
+ end
23
+
24
+ it 'should have a photos' do
25
+ expect(photoset.photos.count).to eq(4)
26
+ expect(photoset.photos.first.title).to eq("Purdy lamps")
27
+ end
28
+
29
+ it "should have an index page filename" do
30
+ expect(photoset.index_page_filename).to eq("#{SPEC_TMP_DIR}/flickr-offline-gallery-specs.html")
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ module FlickrOfflineGallery
3
+ describe TemplateRenderer do
4
+ subject(:renderer) { described_class.new(template_name) }
5
+ let(:template_name) { "cool_template" }
6
+ let(:test_filename) { "tmp/template_renderer_spec.html" }
7
+ let(:template_contents) do <<-ERB
8
+ This is <%= variable %>!
9
+ ERB
10
+ end
11
+
12
+ it "should know where templates live" do
13
+ expect(renderer.template_directory).to eq(File.join(GEM_ROOT, "erb"))
14
+ end
15
+
16
+ it "should know what template to render" do
17
+ expect(renderer.template_path).to eq(File.join(renderer.template_directory, "#{template_name}.html.erb"))
18
+ end
19
+
20
+ it "should raise an error if the template is missing" do
21
+ File.should_receive(:exist?).and_return(false)
22
+ expect {
23
+ renderer.template_contents
24
+ }.to raise_error("Unknown template: #{renderer.template_path}")
25
+ end
26
+
27
+ it "should read in the correct template" do
28
+ File.stub(:exist? => true)
29
+ File.stub(:read => template_contents)
30
+ expect(renderer.template_contents).to eq(template_contents)
31
+ end
32
+
33
+ it "should render the template with the local variables" do
34
+ File.stub(:exist? => true)
35
+ File.stub(:read => template_contents)
36
+
37
+ expect(renderer.render_erb(:variable => "awesome").strip).to eq("This is awesome!")
38
+ expect(renderer.render_erb(:variable => "crappy").strip).to eq("This is crappy!")
39
+ end
40
+
41
+ it "should write the results of the render method to a file" do
42
+ FileUtils.rm_f(test_filename)
43
+
44
+ renderer.should_receive(:render).and_return(template_contents)
45
+
46
+ renderer.write_file(test_filename)
47
+ expect(File.read(test_filename)).to eq(template_contents)
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ module FlickrOfflineGallery
4
+
5
+ describe 'VerbosePuts mixin' do
6
+ class TestPuts
7
+ include FlickrOfflineGallery::VerbosePuts
8
+ end
9
+
10
+ subject(:test_class) { TestPuts.new }
11
+
12
+ before do
13
+ @old_verbose = ENV["VERBOSE"]
14
+ end
15
+
16
+ after do
17
+ ENV["VERBOSE"] = @old_verbose
18
+ end
19
+
20
+ it "should puts if the env var VERBOSE is set" do
21
+ ENV["VERBOSE"] = 'true'
22
+ test_class.should_receive(:puts).with("test string")
23
+ test_class.verbose_puts "test string"
24
+ end
25
+
26
+ it "should not puts if the env var VERBOSE is not set" do
27
+ ENV["VERBOSE"] = nil
28
+ test_class.should_not_receive(:puts).with("test string")
29
+ test_class.verbose_puts "test string"
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,82 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ GEM_ROOT = File.expand_path("../..", __FILE__)
8
+ SPEC_TMP_DIR = File.join(GEM_ROOT, "tmp", "spec")
9
+
10
+ RSpec.configure do |config|
11
+ config.treat_symbols_as_metadata_keys_with_true_values = true
12
+ config.run_all_when_everything_filtered = true
13
+ config.filter_run :focus
14
+
15
+ config.expect_with :rspec do |c|
16
+ # disable the `should` syntax...
17
+ c.syntax = :expect
18
+ end
19
+
20
+ config.before(:each) do
21
+ # clean out any created files between every test
22
+ FileUtils.rm_rf(SPEC_TMP_DIR)
23
+ FileUtils.mkdir_p(SPEC_TMP_DIR)
24
+ end
25
+
26
+ # Run specs in random order to surface order dependencies. If you find an
27
+ # order dependency and want to debug it, you can fix the order by providing
28
+ # the seed, which is printed after each run.
29
+ # --seed 1234
30
+ config.order = 'random'
31
+ end
32
+
33
+ require 'vcr'
34
+ require 'pry-rescue'
35
+ require 'flickraw'
36
+ require 'flickr_offline_gallery'
37
+
38
+
39
+ if ENV["FLICKR_OFFLINE_GALLERY_SPEC_API_KEY"] && ENV["FLICKR_OFFLINE_GALLERY_SPEC_SHARED_SECRET"]
40
+ FlickRaw.api_key = ENV["FLICKR_OFFLINE_GALLERY_SPEC_API_KEY"]
41
+ FlickRaw.shared_secret = ENV["FLICKR_OFFLINE_GALLERY_SPEC_SHARED_SECRET"]
42
+ else
43
+ puts "you need to set FLICKR_OFFLINE_GALLERY_SPEC_API_KEY and FLICKR_OFFLINE_GALLERY_SPEC_SHARED_SECRET to test against live flickr"
44
+ end
45
+
46
+ VCR.configure do |c|
47
+ c.cassette_library_dir = 'fixtures/vcr_cassettes'
48
+ c.hook_into :webmock
49
+
50
+ c.filter_sensitive_data('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') do |interaction|
51
+ if auth_headers = interaction.request.headers["Authorization"]
52
+ auth_headers.first.sub(/.*oauth_nonce="([^"]*)".*/, "\\1")
53
+ else
54
+ nil
55
+ end
56
+ end
57
+
58
+ c.filter_sensitive_data('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') do |interaction|
59
+ if auth_headers = interaction.request.headers["Authorization"]
60
+ auth_headers.first.sub(/.*oauth_consumer_key="([^"]*)".*/, "\\1")
61
+ else
62
+ nil
63
+ end
64
+ end
65
+
66
+ c.filter_sensitive_data('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') do |interaction|
67
+ if auth_headers = interaction.request.headers["Authorization"]
68
+ auth_headers.first.sub(/.*oauth_signature="([^"]*)".*/, "\\1")
69
+ else
70
+ nil
71
+ end
72
+ end
73
+ end
74
+
75
+ # make FlickRaw work consistently with VCR
76
+ #
77
+ # FlickRaw keeps state in class instance variables and dynamically defines a
78
+ # bunch of classes, which means request order is out unless this request is
79
+ # done once up front. Nasty!
80
+ VCR.use_cassette('init') do
81
+ FlickrOfflineGallery::FlickrAPI.instance
82
+ end