apdm 0.0.15

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.
Files changed (139) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +4 -0
  5. data/README.md +223 -0
  6. data/Rakefile +1 -0
  7. data/apdm.gemspec +34 -0
  8. data/bin/apdm +6 -0
  9. data/features/ad_tech.feature +11 -0
  10. data/features/step_definitions/ad_tech_steps.rb +19 -0
  11. data/features/support/env.rb +5 -0
  12. data/fixtures/approvals/ad_tech_loader_scripts.approved.txt +42 -0
  13. data/fixtures/approvals/ad_tech_placeholders.approved.txt +6 -0
  14. data/lib/apdm.rb +24 -0
  15. data/lib/apdm/ad_tech.rb +96 -0
  16. data/lib/apdm/ad_tech/ad_loader.rb +67 -0
  17. data/lib/apdm/ad_tech/ads.csv +475 -0
  18. data/lib/apdm/ad_tech/data.rb +47 -0
  19. data/lib/apdm/channel.rb +87 -0
  20. data/lib/apdm/channels.rb +569 -0
  21. data/lib/apdm/credentials.rb +26 -0
  22. data/lib/apdm/design_elements.rb +60 -0
  23. data/lib/apdm/design_elements/api.rb +75 -0
  24. data/lib/apdm/feed.rb +65 -0
  25. data/lib/apdm/issues.rb +14 -0
  26. data/lib/apdm/issues/aasavis.rb +51 -0
  27. data/lib/apdm/issues/amta.rb +253 -0
  28. data/lib/apdm/issues/an.rb +302 -0
  29. data/lib/apdm/issues/auraavis.rb +154 -0
  30. data/lib/apdm/issues/austagderblad.rb +154 -0
  31. data/lib/apdm/issues/avisa-hordaland.rb +154 -0
  32. data/lib/apdm/issues/avisa-valdres.rb +177 -0
  33. data/lib/apdm/issues/ba.rb +352 -0
  34. data/lib/apdm/issues/bladet.rb +154 -0
  35. data/lib/apdm/issues/blv.rb +254 -0
  36. data/lib/apdm/issues/bygdeposten.rb +154 -0
  37. data/lib/apdm/issues/demokraten.rb +154 -0
  38. data/lib/apdm/issues/eikerbladet.rb +409 -0
  39. data/lib/apdm/issues/enebakkavis.rb +51 -0
  40. data/lib/apdm/issues/etl.rb +79 -0
  41. data/lib/apdm/issues/eub.rb +254 -0
  42. data/lib/apdm/issues/finnmarkdagblad.rb +302 -0
  43. data/lib/apdm/issues/finnmarken.rb +302 -0
  44. data/lib/apdm/issues/firda.rb +302 -0
  45. data/lib/apdm/issues/firdaposten.rb +153 -0
  46. data/lib/apdm/issues/fremover.rb +304 -0
  47. data/lib/apdm/issues/gd.rb +304 -0
  48. data/lib/apdm/issues/glomdalen.rb +302 -0
  49. data/lib/apdm/issues/ha-halden.rb +302 -0
  50. data/lib/apdm/issues/hadeland.rb +251 -0
  51. data/lib/apdm/issues/hardanger-folkeblad.rb +151 -0
  52. data/lib/apdm/issues/helgeland-arbeiderblad.rb +304 -0
  53. data/lib/apdm/issues/import.csv +12821 -0
  54. data/lib/apdm/issues/indre.rb +151 -0
  55. data/lib/apdm/issues/jarlsbergavis.rb +154 -0
  56. data/lib/apdm/issues/kvinnheringen.rb +202 -0
  57. data/lib/apdm/issues/lofot-tidende.rb +102 -0
  58. data/lib/apdm/issues/lofotposten.rb +304 -0
  59. data/lib/apdm/issues/mb.rb +103 -0
  60. data/lib/apdm/issues/namdalsavisa.rb +302 -0
  61. data/lib/apdm/issues/nordhordland.rb +103 -0
  62. data/lib/apdm/issues/nordlys.rb +304 -0
  63. data/lib/apdm/issues/oa.rb +302 -0
  64. data/lib/apdm/issues/op.rb +304 -0
  65. data/lib/apdm/issues/opdalingen.rb +150 -0
  66. data/lib/apdm/issues/oyene.rb +51 -0
  67. data/lib/apdm/issues/pd.rb +254 -0
  68. data/lib/apdm/issues/r-a.rb +152 -0
  69. data/lib/apdm/issues/ranablad.rb +304 -0
  70. data/lib/apdm/issues/rb.rb +302 -0
  71. data/lib/apdm/issues/retten.rb +151 -0
  72. data/lib/apdm/issues/ringblad.rb +304 -0
  73. data/lib/apdm/issues/rogalandsavis.rb +302 -0
  74. data/lib/apdm/issues/sa.rb +304 -0
  75. data/lib/apdm/issues/smaalenene.rb +304 -0
  76. data/lib/apdm/issues/sognavis.rb +254 -0
  77. data/lib/apdm/issues/ta.rb +304 -0
  78. data/lib/apdm/issues/tk.rb +304 -0
  79. data/lib/apdm/issues/tvedestrandsposten.rb +150 -0
  80. data/lib/apdm/issues/vestbyavis.rb +51 -0
  81. data/lib/apdm/local_paper_area.rb +21 -0
  82. data/lib/apdm/network.rb +49 -0
  83. data/lib/apdm/null_cache.rb +15 -0
  84. data/lib/apdm/origo.rb +46 -0
  85. data/lib/apdm/saxo.rb +58 -0
  86. data/lib/apdm/saxo/iptc.rb +69 -0
  87. data/lib/apdm/saxo/metadata.rb +36 -0
  88. data/lib/apdm/saxo/remote.rb +67 -0
  89. data/lib/apdm/sinatra.rb +85 -0
  90. data/lib/apdm/version.rb +3 -0
  91. data/lib/cli.rb +12 -0
  92. data/spec/ad_tech/ad_loader_spec.rb +27 -0
  93. data/spec/ad_tech/data_spec.rb +14 -0
  94. data/spec/ad_tech_spec.rb +70 -0
  95. data/spec/approvals_helper.rb +6 -0
  96. data/spec/channel_spec.rb +91 -0
  97. data/spec/channels_spec.rb +9 -0
  98. data/spec/credentials_integration_spec.rb +13 -0
  99. data/spec/credentials_spec.rb +34 -0
  100. data/spec/design_elements_spec.rb +132 -0
  101. data/spec/feed_spec.rb +49 -0
  102. data/spec/fixtures/ad_tech.csv +6 -0
  103. data/spec/fixtures/approvals/adtech/ad_loader.approved.txt +9 -0
  104. data/spec/fixtures/approvals/apdm_adtech/data/handles_artikkelboard.approved.txt +10 -0
  105. data/spec/fixtures/approvals/apdm_adtech/data/handles_bunnbanner.approved.txt +10 -0
  106. data/spec/fixtures/approvals/apdm_adtech/data/handles_skyskraper_1.approved.txt +10 -0
  107. data/spec/fixtures/approvals/apdm_adtech/data/handles_toppbanner.approved.txt +10 -0
  108. data/spec/fixtures/approvals/apdm_adtech/data/is_ok_with_new_bandwagon_data.approved.txt +10 -0
  109. data/spec/fixtures/approvals/apdm_adtech/data/loads_default_data.approved.txt +10 -0
  110. data/spec/fixtures/approvals/apdm_designelements/css/via_api.approved.txt +23 -0
  111. data/spec/fixtures/approvals/apdm_designelements/footer_html/via_api.approved.html +85 -0
  112. data/spec/fixtures/approvals/apdm_designelements/header_html/via_api.approved.html +40 -0
  113. data/spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/keyword.approved.txt +54 -0
  114. data/spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/placeholder.approved.txt +54 -0
  115. data/spec/fixtures/issues.csv +3 -0
  116. data/spec/fixtures/test.jpg +0 -0
  117. data/spec/fixtures/vcr_cassettes/apdm_credentials.yml +44 -0
  118. data/spec/fixtures/vcr_cassettes/css.yml +5588 -0
  119. data/spec/fixtures/vcr_cassettes/footer-html.yml +178 -0
  120. data/spec/fixtures/vcr_cassettes/header-html.yml +132 -0
  121. data/spec/fixtures/vcr_cassettes/origo_someone_credentials.yml +43 -0
  122. data/spec/fixtures/vcr_cassettes/origo_westerdal_credentials.yml +56 -0
  123. data/spec/fixtures/vcr_cassettes/site_stat.yml +172 -0
  124. data/spec/fixtures/vcr_cassettes/site_stat_custom_category.yml +172 -0
  125. data/spec/geo_spec.rb +10 -0
  126. data/spec/issues_etl_spec.rb +41 -0
  127. data/spec/mockcached.rb +36 -0
  128. data/spec/network_spec.rb +43 -0
  129. data/spec/null_cache_spec.rb +29 -0
  130. data/spec/origo_spec.rb +24 -0
  131. data/spec/saxo/iptc_spec.rb +105 -0
  132. data/spec/saxo/metadata_spec.rb +79 -0
  133. data/spec/saxo/remote_spec.rb +71 -0
  134. data/spec/saxo/saxo_spec.rb +82 -0
  135. data/spec/spec_helper.rb +22 -0
  136. data/spec/vcr_helper.rb +6 -0
  137. data/test/fixtures/config-example.yml +6 -0
  138. data/test/saxo/acceptance_spec.rb +109 -0
  139. metadata +427 -0
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ require 'simplecov'
3
+ require 'apdm/saxo/metadata'
4
+
5
+ class APDM::Saxo::IPTC; end
6
+
7
+ describe APDM::Saxo::Metadata do
8
+ describe "#sanitize" do
9
+ it "replaces backticks with single quotes" do
10
+ APDM::Saxo::Metadata.sanitize('`').should eq("'")
11
+ end
12
+
13
+ it "replaces frontticks with single quotes" do
14
+ APDM::Saxo::Metadata.sanitize('´').should eq("'")
15
+ end
16
+
17
+ it "escapes double quotes" do
18
+ APDM::Saxo::Metadata.sanitize('"').should eq('\"')
19
+ end
20
+ end
21
+
22
+ describe "#to_iso88591" do
23
+ it "encodes" do
24
+ # guard
25
+ __ENCODING__.should eq(Encoding::UTF_8)
26
+
27
+ APDM::Saxo::Metadata.to_iso88591("abc").encoding.should eq(Encoding::ISO_8859_1)
28
+ end
29
+ end
30
+
31
+ describe "#to" do
32
+ let(:iptc) { stub(:iptc, :write => nil) }
33
+
34
+ it "creates a new IPTC object" do
35
+ APDM::Saxo::IPTC.should_receive(:new).with('name', 'path', :source => 'url').and_return iptc
36
+ APDM::Saxo::Metadata.new.to('name', 'path', :source => 'url')
37
+ end
38
+
39
+ it "calls write on the result" do
40
+ APDM::Saxo::IPTC.stub(:new => iptc)
41
+ iptc.should_receive(:write).with({:the => 'data'})
42
+ APDM::Saxo::Metadata.new({:the => 'data'}).to('name', 'path')
43
+ end
44
+ end
45
+
46
+ describe "preparing the metadata" do
47
+ let(:data) do
48
+ {
49
+ :keywords => 'one, "two", three',
50
+ :byline => "Mr. O'Byline",
51
+ :headline => 'It said: "Headline!"',
52
+ :credit => 'credit is given where "credit" is due',
53
+ :source => "Mr. O'Source",
54
+ :copyright => "You're gonna be in trouble.",
55
+ :caption => "A Caption'd Thing"
56
+ }
57
+ end
58
+
59
+ subject { APDM::Saxo::Metadata.new(data) }
60
+
61
+ [:keywords, :byline, :headline, :credit, :source, :copyright, :caption].each do |key|
62
+ it "encodes #{key}" do
63
+ subject.metadata[key].encoding.should eq(Encoding::ISO_8859_1)
64
+ end
65
+ end
66
+
67
+ [:keywords, :byline, :headline, :credit, :source, :copyright, :caption].each do |key|
68
+ it "sanitizes #{key}" do
69
+ value = subject.metadata[key].encode(Encoding::UTF_8, Encoding::ISO_8859_1, :undef => :replace)
70
+ value.should eq(APDM::Saxo::Metadata.sanitize(data[key].dup))
71
+ end
72
+ end
73
+
74
+ it "replaces ascii hearts with an emojicon-ish thing" do
75
+ APDM::Saxo::Metadata.sanitize("I <3 you, and 1 > 0 but 1 < 2 OOK?").should eq("I :heart: you, and 1 0 but 1 2 OOK?")
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,71 @@
1
+ require 'apdm/saxo/remote'
2
+
3
+ describe APDM::Saxo::Remote do
4
+ before :each do
5
+ APDM::Saxo::Remote.any_instance.stub(:logger) { stub.as_null_object }
6
+ end
7
+
8
+ let(:saxo) { stub(:saxo, :remote_dir => 'test') }
9
+ let(:photo) { stub(:photo, :file => '/tmp/image.jpg', :name => 'image.jpg') }
10
+ subject { APDM::Saxo::Remote.new(saxo, photo) }
11
+
12
+ describe "basic attributes" do
13
+ its(:saxo) { should eq(saxo) }
14
+ its(:photo) { should eq(photo) }
15
+ its(:source) { should eq('/tmp/image.jpg') }
16
+ its(:destination) { should eq('test/image.jpg') }
17
+ end
18
+
19
+ describe "#transfer_succeeded?" do
20
+ it "is successful if local file size matches remote file size" do
21
+ subject.local_size = 100
22
+ subject.remote_size = 100
23
+ subject.transfer_succeeded?.should be_true
24
+ end
25
+
26
+ it "has failed if file sizes are unequal" do
27
+ subject.local_size = 100
28
+ subject.remote_size = 90
29
+ subject.transfer_succeeded?.should be_false
30
+ end
31
+ end
32
+
33
+ describe "#upload" do
34
+ let(:ftp) { stub(:ftp, :passive= => nil, :putbinaryfile => nil, :size => 100) }
35
+ it "makes sure the connection is passive" do
36
+ ftp.should_receive(:passive=).with(true)
37
+ subject.upload(ftp)
38
+ end
39
+
40
+ it "uploads the file" do
41
+ ftp.should_receive(:putbinaryfile).with(subject.source, subject.destination)
42
+ subject.upload(ftp)
43
+ end
44
+
45
+ it "sets the remote file size" do
46
+ subject.upload(ftp)
47
+ subject.remote_size.should eq(100)
48
+ end
49
+
50
+ end
51
+
52
+ describe "#cleanup" do
53
+ let(:ftp) { stub(:ftp) }
54
+
55
+ context "when transfer fails" do
56
+ it "deletes remote file" do
57
+ subject.stub(:transfer_succeeded? => false)
58
+ ftp.should_receive(:delete).with(subject.destination)
59
+ subject.cleanup(ftp)
60
+ end
61
+ end
62
+
63
+ context "when transfer succeeds" do
64
+ it "deletes local file" do
65
+ subject.stub(:transfer_succeeded? => true)
66
+ File.should_receive(:delete).with(subject.source)
67
+ subject.cleanup(ftp)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,82 @@
1
+ require 'simplecov'
2
+ require 'apdm/saxo'
3
+
4
+ describe APDM::Saxo do
5
+
6
+ describe "logger" do
7
+ let(:logger) { stub(:logger) }
8
+
9
+ it "can take a logger" do
10
+ APDM::Saxo.logger = logger
11
+ APDM::Saxo.logger.should eq(logger)
12
+ end
13
+
14
+ it "returns a new logger if none is specified" do
15
+ FileUtils.stub(:mkdir)
16
+ APDM::Saxo.logger = nil
17
+ Logger.stub(:new) { logger }
18
+ APDM::Saxo.logger.should eq(logger)
19
+ end
20
+ end
21
+
22
+ describe "configuration" do
23
+ let(:options) { {:server => 'server', :username => 'username', :password => 'password', :remote_dir => 'ABCD'} }
24
+
25
+ describe "basic" do
26
+ subject { APDM::Saxo.new(options) }
27
+
28
+ its(:server) { should eq('server') }
29
+ its(:username) { should eq('username') }
30
+ its(:password) { should eq('password') }
31
+ its(:remote_dir) { should eq('ABCD') }
32
+ end
33
+
34
+ describe "with strings as keys" do
35
+ subject { APDM::Saxo.new('server' => 'server', 'username' => 'username', 'password' => 'password', 'remote_dir' => 'ABCD') }
36
+
37
+ its(:server) { should eq('server') }
38
+ its(:username) { should eq('username') }
39
+ its(:password) { should eq('password') }
40
+ its(:remote_dir) { should eq('ABCD') }
41
+ end
42
+
43
+ describe "cleanup" do
44
+ it "always uppercases the remote directory" do
45
+ APDM::Saxo.new(options.merge(:remote_dir => 'prql')).remote_dir.should eq('PRQL')
46
+ end
47
+ end
48
+
49
+ describe "validations" do
50
+ [:username, :password, :server, :remote_dir, 'username', 'password', 'server', 'remote_dir'].each do |key|
51
+ specify "#{key.inspect} cannot be nil" do
52
+ ->{ APDM::Saxo.new(options.merge(key => nil)) }.should raise_error(APDM::Saxo::InvalidConfig)
53
+ end
54
+
55
+ specify "#{key.inspect} cannot be an empty string" do
56
+ ->{ APDM::Saxo.new(options.merge(key => "")) }.should raise_error(APDM::Saxo::InvalidConfig)
57
+ end
58
+ end
59
+ end
60
+
61
+ describe "#write" do
62
+ subject { APDM::Saxo.new(options) }
63
+
64
+ it "delegates to Metadata" do
65
+ APDM::Saxo::Metadata.should_receive(:new).with(:metadata)
66
+ subject.write(:metadata)
67
+ end
68
+ end
69
+
70
+ describe "#transfer" do
71
+ subject { APDM::Saxo.new(options) }
72
+
73
+ it "delegates to Remote" do
74
+ remote = stub(:remote)
75
+ photo = stub(:photo)
76
+ APDM::Saxo::Remote.stub(:new).with(subject, photo) { remote }
77
+ remote.should_receive(:transfer)
78
+ subject.transfer(photo)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,22 @@
1
+ begin
2
+ require 'simplecov'
3
+ rescue LoadError => e
4
+ # ignore
5
+ end
6
+ require 'timecop'
7
+
8
+ RSpec.configure do |config|
9
+ config.backtrace_clean_patterns = [
10
+ /\/lib\d*\/ruby\//,
11
+ /bin\//,
12
+ /spec\/spec_helper\.rb/,
13
+ /lib\/rspec\/(core|expectations|matchers|mocks)/
14
+ ]
15
+ config.before(:each) do
16
+ t = Time.local(2012, 10, 02, 0, 0, 0)
17
+ Timecop.freeze(t)
18
+ end
19
+ config.after(:each) do
20
+ Timecop.return
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |c|
4
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
5
+ c.hook_into :webmock
6
+ end
@@ -0,0 +1,6 @@
1
+ ---
2
+ ftp:
3
+ server: <your ftp server>
4
+ username: <username>
5
+ password: <password>
6
+ remote_dir: <a directory>
@@ -0,0 +1,109 @@
1
+ require 'simplecov'
2
+ require 'yaml'
3
+ require 'apdm/saxo'
4
+
5
+ config = false
6
+ begin
7
+ yml = File.expand_path('../../fixtures/config.yml', __FILE__)
8
+ config = YAML::load(File.open(yml))
9
+ rescue Exception => e
10
+ puts e.message
11
+
12
+ describe "Acceptance Test" do
13
+ pending "copy test/fixtures/config-example.yml to test/fixtures/config.yml and edit to your satisfaction"
14
+ end
15
+ end
16
+
17
+ if config
18
+
19
+ describe 'Acceptance Test' do
20
+ let(:source_image) { 'https://si0.twimg.com/profile_images/1433554316/retro-vintage_normal.jpeg' }
21
+
22
+ let(:local_path) { File.expand_path('../../fixtures', __FILE__) }
23
+ let(:image_name) { 'retro.jpg' }
24
+
25
+ let(:local_file) { "#{local_path}/#{image_name}" }
26
+ let(:remote_file) { "#{options['remote_dir']}/#{image_name}" }
27
+ let(:check_file) { "#{local_path}/verify-#{image_name}" }
28
+
29
+ let(:metadata) do
30
+ {
31
+ :keywords => 'one, two, three',
32
+ :byline => "Your's Truly",
33
+ :headline => 'One heck of a headline',
34
+ :credit => 'Where credit is due.',
35
+ :source => 'Protected',
36
+ :copyright => 'Myself',
37
+ :caption => 'What did you expect?'
38
+ }
39
+ end
40
+
41
+ let(:options) { config['ftp'] }
42
+
43
+ # NOTE: we delete the remote file before running again, in case
44
+ # we want to actually go inspect it manually.
45
+ before(:each) do
46
+ # clean up remote copy from earlier run
47
+ Net::FTP.open(options['server']) do |ftp|
48
+ ftp.login(options['username'], options['password'])
49
+ ftp.passive = true
50
+ begin
51
+ ftp.delete(remote_file)
52
+ rescue Net::FTPPermError => e
53
+ # that's ok
54
+ end
55
+ ftp.ls(options['remote_dir']) do |line|
56
+ line.squeeze.split(" ").last.should_not eq(image_name)
57
+ end
58
+ end
59
+
60
+ begin
61
+ FileUtils.rm(check_file)
62
+ rescue Errno::ENOENT => e
63
+ # that's ok
64
+ end
65
+ # verify that we don't have a local copy from an earlier run
66
+ File.exist?(check_file).should be_false
67
+ end
68
+
69
+ after(:each) do
70
+ # verify that the temporary file that got transfered is gone
71
+ File.exist?(local_file).should be_false
72
+
73
+ # grab a verification file from the server
74
+ Net::FTP.open(options['server']) do |ftp|
75
+ ftp.login(options['username'], options['password'])
76
+ ftp.passive = true
77
+ ftp.getbinaryfile(remote_file, check_file)
78
+ end
79
+
80
+ # sanity check, we managed to get the file:
81
+ File.exist?(check_file).should be_true
82
+
83
+ # check the metadata
84
+ iptc_data = `exiv2 -Pnv #{check_file}`.split("\n").map(&:squeeze)
85
+ iptc_data.should eq(
86
+ [
87
+ "ObjectName retro.jpg",
88
+ "Keywords one, two, thre",
89
+ "Byline Your's Truly",
90
+ "Headline One heck of a headline",
91
+ "Credit Where credit is due.",
92
+ "Source Protected",
93
+ "Copyright Myself",
94
+ "Caption What did you expect?"
95
+ ]
96
+ )
97
+
98
+ FileUtils.rm(check_file)
99
+ File.exist?(check_file).should be_false
100
+ end
101
+
102
+ it "downloads, writes metadata, and transfers" do
103
+ saxo = APDM::Saxo.new(options)
104
+ photo = saxo.write(metadata).to(image_name, local_path, :source => source_image)
105
+ saxo.transfer(photo).should be_true
106
+ end
107
+ end
108
+
109
+ end
metadata ADDED
@@ -0,0 +1,427 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apdm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.15
5
+ platform: ruby
6
+ authors:
7
+ - Katrina Owen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: vcr
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: approvals
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: curb
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: nokogiri
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: feedzirra
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 0.2.0.rc2
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 0.2.0.rc2
153
+ - !ruby/object:Gem::Dependency
154
+ name: rgeo
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rgeo-geojson
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: queryparams
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: unicode
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ! '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description: A collection of APDM local paper-related things.
210
+ email:
211
+ - katrina.owen@gmail.com
212
+ executables:
213
+ - apdm
214
+ extensions: []
215
+ extra_rdoc_files: []
216
+ files:
217
+ - .gitignore
218
+ - .rspec
219
+ - Gemfile
220
+ - README.md
221
+ - Rakefile
222
+ - apdm.gemspec
223
+ - bin/apdm
224
+ - features/ad_tech.feature
225
+ - features/step_definitions/ad_tech_steps.rb
226
+ - features/support/env.rb
227
+ - fixtures/approvals/ad_tech_loader_scripts.approved.txt
228
+ - fixtures/approvals/ad_tech_placeholders.approved.txt
229
+ - lib/apdm.rb
230
+ - lib/apdm/ad_tech.rb
231
+ - lib/apdm/ad_tech/ad_loader.rb
232
+ - lib/apdm/ad_tech/ads.csv
233
+ - lib/apdm/ad_tech/data.rb
234
+ - lib/apdm/channel.rb
235
+ - lib/apdm/channels.rb
236
+ - lib/apdm/credentials.rb
237
+ - lib/apdm/design_elements.rb
238
+ - lib/apdm/design_elements/api.rb
239
+ - lib/apdm/feed.rb
240
+ - lib/apdm/issues.rb
241
+ - lib/apdm/issues/aasavis.rb
242
+ - lib/apdm/issues/amta.rb
243
+ - lib/apdm/issues/an.rb
244
+ - lib/apdm/issues/auraavis.rb
245
+ - lib/apdm/issues/austagderblad.rb
246
+ - lib/apdm/issues/avisa-hordaland.rb
247
+ - lib/apdm/issues/avisa-valdres.rb
248
+ - lib/apdm/issues/ba.rb
249
+ - lib/apdm/issues/bladet.rb
250
+ - lib/apdm/issues/blv.rb
251
+ - lib/apdm/issues/bygdeposten.rb
252
+ - lib/apdm/issues/demokraten.rb
253
+ - lib/apdm/issues/eikerbladet.rb
254
+ - lib/apdm/issues/enebakkavis.rb
255
+ - lib/apdm/issues/etl.rb
256
+ - lib/apdm/issues/eub.rb
257
+ - lib/apdm/issues/finnmarkdagblad.rb
258
+ - lib/apdm/issues/finnmarken.rb
259
+ - lib/apdm/issues/firda.rb
260
+ - lib/apdm/issues/firdaposten.rb
261
+ - lib/apdm/issues/fremover.rb
262
+ - lib/apdm/issues/gd.rb
263
+ - lib/apdm/issues/glomdalen.rb
264
+ - lib/apdm/issues/ha-halden.rb
265
+ - lib/apdm/issues/hadeland.rb
266
+ - lib/apdm/issues/hardanger-folkeblad.rb
267
+ - lib/apdm/issues/helgeland-arbeiderblad.rb
268
+ - lib/apdm/issues/import.csv
269
+ - lib/apdm/issues/indre.rb
270
+ - lib/apdm/issues/jarlsbergavis.rb
271
+ - lib/apdm/issues/kvinnheringen.rb
272
+ - lib/apdm/issues/lofot-tidende.rb
273
+ - lib/apdm/issues/lofotposten.rb
274
+ - lib/apdm/issues/mb.rb
275
+ - lib/apdm/issues/namdalsavisa.rb
276
+ - lib/apdm/issues/nordhordland.rb
277
+ - lib/apdm/issues/nordlys.rb
278
+ - lib/apdm/issues/oa.rb
279
+ - lib/apdm/issues/op.rb
280
+ - lib/apdm/issues/opdalingen.rb
281
+ - lib/apdm/issues/oyene.rb
282
+ - lib/apdm/issues/pd.rb
283
+ - lib/apdm/issues/r-a.rb
284
+ - lib/apdm/issues/ranablad.rb
285
+ - lib/apdm/issues/rb.rb
286
+ - lib/apdm/issues/retten.rb
287
+ - lib/apdm/issues/ringblad.rb
288
+ - lib/apdm/issues/rogalandsavis.rb
289
+ - lib/apdm/issues/sa.rb
290
+ - lib/apdm/issues/smaalenene.rb
291
+ - lib/apdm/issues/sognavis.rb
292
+ - lib/apdm/issues/ta.rb
293
+ - lib/apdm/issues/tk.rb
294
+ - lib/apdm/issues/tvedestrandsposten.rb
295
+ - lib/apdm/issues/vestbyavis.rb
296
+ - lib/apdm/local_paper_area.rb
297
+ - lib/apdm/network.rb
298
+ - lib/apdm/null_cache.rb
299
+ - lib/apdm/origo.rb
300
+ - lib/apdm/saxo.rb
301
+ - lib/apdm/saxo/iptc.rb
302
+ - lib/apdm/saxo/metadata.rb
303
+ - lib/apdm/saxo/remote.rb
304
+ - lib/apdm/sinatra.rb
305
+ - lib/apdm/version.rb
306
+ - lib/cli.rb
307
+ - spec/ad_tech/ad_loader_spec.rb
308
+ - spec/ad_tech/data_spec.rb
309
+ - spec/ad_tech_spec.rb
310
+ - spec/approvals_helper.rb
311
+ - spec/channel_spec.rb
312
+ - spec/channels_spec.rb
313
+ - spec/credentials_integration_spec.rb
314
+ - spec/credentials_spec.rb
315
+ - spec/design_elements_spec.rb
316
+ - spec/feed_spec.rb
317
+ - spec/fixtures/ad_tech.csv
318
+ - spec/fixtures/approvals/adtech/ad_loader.approved.txt
319
+ - spec/fixtures/approvals/apdm_adtech/data/handles_artikkelboard.approved.txt
320
+ - spec/fixtures/approvals/apdm_adtech/data/handles_bunnbanner.approved.txt
321
+ - spec/fixtures/approvals/apdm_adtech/data/handles_skyskraper_1.approved.txt
322
+ - spec/fixtures/approvals/apdm_adtech/data/handles_toppbanner.approved.txt
323
+ - spec/fixtures/approvals/apdm_adtech/data/is_ok_with_new_bandwagon_data.approved.txt
324
+ - spec/fixtures/approvals/apdm_adtech/data/loads_default_data.approved.txt
325
+ - spec/fixtures/approvals/apdm_designelements/css/via_api.approved.txt
326
+ - spec/fixtures/approvals/apdm_designelements/footer_html/via_api.approved.html
327
+ - spec/fixtures/approvals/apdm_designelements/header_html/via_api.approved.html
328
+ - spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/keyword.approved.txt
329
+ - spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/placeholder.approved.txt
330
+ - spec/fixtures/issues.csv
331
+ - spec/fixtures/test.jpg
332
+ - spec/fixtures/vcr_cassettes/apdm_credentials.yml
333
+ - spec/fixtures/vcr_cassettes/css.yml
334
+ - spec/fixtures/vcr_cassettes/footer-html.yml
335
+ - spec/fixtures/vcr_cassettes/header-html.yml
336
+ - spec/fixtures/vcr_cassettes/origo_someone_credentials.yml
337
+ - spec/fixtures/vcr_cassettes/origo_westerdal_credentials.yml
338
+ - spec/fixtures/vcr_cassettes/site_stat.yml
339
+ - spec/fixtures/vcr_cassettes/site_stat_custom_category.yml
340
+ - spec/geo_spec.rb
341
+ - spec/issues_etl_spec.rb
342
+ - spec/mockcached.rb
343
+ - spec/network_spec.rb
344
+ - spec/null_cache_spec.rb
345
+ - spec/origo_spec.rb
346
+ - spec/saxo/iptc_spec.rb
347
+ - spec/saxo/metadata_spec.rb
348
+ - spec/saxo/remote_spec.rb
349
+ - spec/saxo/saxo_spec.rb
350
+ - spec/spec_helper.rb
351
+ - spec/vcr_helper.rb
352
+ - test/fixtures/config-example.yml
353
+ - test/saxo/acceptance_spec.rb
354
+ homepage: https://github.com/bengler/apdm
355
+ licenses: []
356
+ metadata: {}
357
+ post_install_message:
358
+ rdoc_options: []
359
+ require_paths:
360
+ - lib
361
+ required_ruby_version: !ruby/object:Gem::Requirement
362
+ requirements:
363
+ - - ! '>='
364
+ - !ruby/object:Gem::Version
365
+ version: '0'
366
+ required_rubygems_version: !ruby/object:Gem::Requirement
367
+ requirements:
368
+ - - ! '>='
369
+ - !ruby/object:Gem::Version
370
+ version: '0'
371
+ requirements: []
372
+ rubyforge_project:
373
+ rubygems_version: 2.0.7
374
+ signing_key:
375
+ specification_version: 4
376
+ summary: APDM local paper stuff.
377
+ test_files:
378
+ - features/ad_tech.feature
379
+ - features/step_definitions/ad_tech_steps.rb
380
+ - features/support/env.rb
381
+ - spec/ad_tech/ad_loader_spec.rb
382
+ - spec/ad_tech/data_spec.rb
383
+ - spec/ad_tech_spec.rb
384
+ - spec/approvals_helper.rb
385
+ - spec/channel_spec.rb
386
+ - spec/channels_spec.rb
387
+ - spec/credentials_integration_spec.rb
388
+ - spec/credentials_spec.rb
389
+ - spec/design_elements_spec.rb
390
+ - spec/feed_spec.rb
391
+ - spec/fixtures/ad_tech.csv
392
+ - spec/fixtures/approvals/adtech/ad_loader.approved.txt
393
+ - spec/fixtures/approvals/apdm_adtech/data/handles_artikkelboard.approved.txt
394
+ - spec/fixtures/approvals/apdm_adtech/data/handles_bunnbanner.approved.txt
395
+ - spec/fixtures/approvals/apdm_adtech/data/handles_skyskraper_1.approved.txt
396
+ - spec/fixtures/approvals/apdm_adtech/data/handles_toppbanner.approved.txt
397
+ - spec/fixtures/approvals/apdm_adtech/data/is_ok_with_new_bandwagon_data.approved.txt
398
+ - spec/fixtures/approvals/apdm_adtech/data/loads_default_data.approved.txt
399
+ - spec/fixtures/approvals/apdm_designelements/css/via_api.approved.txt
400
+ - spec/fixtures/approvals/apdm_designelements/footer_html/via_api.approved.html
401
+ - spec/fixtures/approvals/apdm_designelements/header_html/via_api.approved.html
402
+ - spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/keyword.approved.txt
403
+ - spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/placeholder.approved.txt
404
+ - spec/fixtures/issues.csv
405
+ - spec/fixtures/test.jpg
406
+ - spec/fixtures/vcr_cassettes/apdm_credentials.yml
407
+ - spec/fixtures/vcr_cassettes/css.yml
408
+ - spec/fixtures/vcr_cassettes/footer-html.yml
409
+ - spec/fixtures/vcr_cassettes/header-html.yml
410
+ - spec/fixtures/vcr_cassettes/origo_someone_credentials.yml
411
+ - spec/fixtures/vcr_cassettes/origo_westerdal_credentials.yml
412
+ - spec/fixtures/vcr_cassettes/site_stat.yml
413
+ - spec/fixtures/vcr_cassettes/site_stat_custom_category.yml
414
+ - spec/geo_spec.rb
415
+ - spec/issues_etl_spec.rb
416
+ - spec/mockcached.rb
417
+ - spec/network_spec.rb
418
+ - spec/null_cache_spec.rb
419
+ - spec/origo_spec.rb
420
+ - spec/saxo/iptc_spec.rb
421
+ - spec/saxo/metadata_spec.rb
422
+ - spec/saxo/remote_spec.rb
423
+ - spec/saxo/saxo_spec.rb
424
+ - spec/spec_helper.rb
425
+ - spec/vcr_helper.rb
426
+ - test/fixtures/config-example.yml
427
+ - test/saxo/acceptance_spec.rb