apdm 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/README.md +223 -0
- data/Rakefile +1 -0
- data/apdm.gemspec +34 -0
- data/bin/apdm +6 -0
- data/features/ad_tech.feature +11 -0
- data/features/step_definitions/ad_tech_steps.rb +19 -0
- data/features/support/env.rb +5 -0
- data/fixtures/approvals/ad_tech_loader_scripts.approved.txt +42 -0
- data/fixtures/approvals/ad_tech_placeholders.approved.txt +6 -0
- data/lib/apdm.rb +24 -0
- data/lib/apdm/ad_tech.rb +96 -0
- data/lib/apdm/ad_tech/ad_loader.rb +67 -0
- data/lib/apdm/ad_tech/ads.csv +475 -0
- data/lib/apdm/ad_tech/data.rb +47 -0
- data/lib/apdm/channel.rb +87 -0
- data/lib/apdm/channels.rb +569 -0
- data/lib/apdm/credentials.rb +26 -0
- data/lib/apdm/design_elements.rb +60 -0
- data/lib/apdm/design_elements/api.rb +75 -0
- data/lib/apdm/feed.rb +65 -0
- data/lib/apdm/issues.rb +14 -0
- data/lib/apdm/issues/aasavis.rb +51 -0
- data/lib/apdm/issues/amta.rb +253 -0
- data/lib/apdm/issues/an.rb +302 -0
- data/lib/apdm/issues/auraavis.rb +154 -0
- data/lib/apdm/issues/austagderblad.rb +154 -0
- data/lib/apdm/issues/avisa-hordaland.rb +154 -0
- data/lib/apdm/issues/avisa-valdres.rb +177 -0
- data/lib/apdm/issues/ba.rb +352 -0
- data/lib/apdm/issues/bladet.rb +154 -0
- data/lib/apdm/issues/blv.rb +254 -0
- data/lib/apdm/issues/bygdeposten.rb +154 -0
- data/lib/apdm/issues/demokraten.rb +154 -0
- data/lib/apdm/issues/eikerbladet.rb +409 -0
- data/lib/apdm/issues/enebakkavis.rb +51 -0
- data/lib/apdm/issues/etl.rb +79 -0
- data/lib/apdm/issues/eub.rb +254 -0
- data/lib/apdm/issues/finnmarkdagblad.rb +302 -0
- data/lib/apdm/issues/finnmarken.rb +302 -0
- data/lib/apdm/issues/firda.rb +302 -0
- data/lib/apdm/issues/firdaposten.rb +153 -0
- data/lib/apdm/issues/fremover.rb +304 -0
- data/lib/apdm/issues/gd.rb +304 -0
- data/lib/apdm/issues/glomdalen.rb +302 -0
- data/lib/apdm/issues/ha-halden.rb +302 -0
- data/lib/apdm/issues/hadeland.rb +251 -0
- data/lib/apdm/issues/hardanger-folkeblad.rb +151 -0
- data/lib/apdm/issues/helgeland-arbeiderblad.rb +304 -0
- data/lib/apdm/issues/import.csv +12821 -0
- data/lib/apdm/issues/indre.rb +151 -0
- data/lib/apdm/issues/jarlsbergavis.rb +154 -0
- data/lib/apdm/issues/kvinnheringen.rb +202 -0
- data/lib/apdm/issues/lofot-tidende.rb +102 -0
- data/lib/apdm/issues/lofotposten.rb +304 -0
- data/lib/apdm/issues/mb.rb +103 -0
- data/lib/apdm/issues/namdalsavisa.rb +302 -0
- data/lib/apdm/issues/nordhordland.rb +103 -0
- data/lib/apdm/issues/nordlys.rb +304 -0
- data/lib/apdm/issues/oa.rb +302 -0
- data/lib/apdm/issues/op.rb +304 -0
- data/lib/apdm/issues/opdalingen.rb +150 -0
- data/lib/apdm/issues/oyene.rb +51 -0
- data/lib/apdm/issues/pd.rb +254 -0
- data/lib/apdm/issues/r-a.rb +152 -0
- data/lib/apdm/issues/ranablad.rb +304 -0
- data/lib/apdm/issues/rb.rb +302 -0
- data/lib/apdm/issues/retten.rb +151 -0
- data/lib/apdm/issues/ringblad.rb +304 -0
- data/lib/apdm/issues/rogalandsavis.rb +302 -0
- data/lib/apdm/issues/sa.rb +304 -0
- data/lib/apdm/issues/smaalenene.rb +304 -0
- data/lib/apdm/issues/sognavis.rb +254 -0
- data/lib/apdm/issues/ta.rb +304 -0
- data/lib/apdm/issues/tk.rb +304 -0
- data/lib/apdm/issues/tvedestrandsposten.rb +150 -0
- data/lib/apdm/issues/vestbyavis.rb +51 -0
- data/lib/apdm/local_paper_area.rb +21 -0
- data/lib/apdm/network.rb +49 -0
- data/lib/apdm/null_cache.rb +15 -0
- data/lib/apdm/origo.rb +46 -0
- data/lib/apdm/saxo.rb +58 -0
- data/lib/apdm/saxo/iptc.rb +69 -0
- data/lib/apdm/saxo/metadata.rb +36 -0
- data/lib/apdm/saxo/remote.rb +67 -0
- data/lib/apdm/sinatra.rb +85 -0
- data/lib/apdm/version.rb +3 -0
- data/lib/cli.rb +12 -0
- data/spec/ad_tech/ad_loader_spec.rb +27 -0
- data/spec/ad_tech/data_spec.rb +14 -0
- data/spec/ad_tech_spec.rb +70 -0
- data/spec/approvals_helper.rb +6 -0
- data/spec/channel_spec.rb +91 -0
- data/spec/channels_spec.rb +9 -0
- data/spec/credentials_integration_spec.rb +13 -0
- data/spec/credentials_spec.rb +34 -0
- data/spec/design_elements_spec.rb +132 -0
- data/spec/feed_spec.rb +49 -0
- data/spec/fixtures/ad_tech.csv +6 -0
- data/spec/fixtures/approvals/adtech/ad_loader.approved.txt +9 -0
- data/spec/fixtures/approvals/apdm_adtech/data/handles_artikkelboard.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_adtech/data/handles_bunnbanner.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_adtech/data/handles_skyskraper_1.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_adtech/data/handles_toppbanner.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_adtech/data/is_ok_with_new_bandwagon_data.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_adtech/data/loads_default_data.approved.txt +10 -0
- data/spec/fixtures/approvals/apdm_designelements/css/via_api.approved.txt +23 -0
- data/spec/fixtures/approvals/apdm_designelements/footer_html/via_api.approved.html +85 -0
- data/spec/fixtures/approvals/apdm_designelements/header_html/via_api.approved.html +40 -0
- data/spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/keyword.approved.txt +54 -0
- data/spec/fixtures/approvals/apdm_designelements/tracking_scripts/api/placeholder.approved.txt +54 -0
- data/spec/fixtures/issues.csv +3 -0
- data/spec/fixtures/test.jpg +0 -0
- data/spec/fixtures/vcr_cassettes/apdm_credentials.yml +44 -0
- data/spec/fixtures/vcr_cassettes/css.yml +5588 -0
- data/spec/fixtures/vcr_cassettes/footer-html.yml +178 -0
- data/spec/fixtures/vcr_cassettes/header-html.yml +132 -0
- data/spec/fixtures/vcr_cassettes/origo_someone_credentials.yml +43 -0
- data/spec/fixtures/vcr_cassettes/origo_westerdal_credentials.yml +56 -0
- data/spec/fixtures/vcr_cassettes/site_stat.yml +172 -0
- data/spec/fixtures/vcr_cassettes/site_stat_custom_category.yml +172 -0
- data/spec/geo_spec.rb +10 -0
- data/spec/issues_etl_spec.rb +41 -0
- data/spec/mockcached.rb +36 -0
- data/spec/network_spec.rb +43 -0
- data/spec/null_cache_spec.rb +29 -0
- data/spec/origo_spec.rb +24 -0
- data/spec/saxo/iptc_spec.rb +105 -0
- data/spec/saxo/metadata_spec.rb +79 -0
- data/spec/saxo/remote_spec.rb +71 -0
- data/spec/saxo/saxo_spec.rb +82 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/vcr_helper.rb +6 -0
- data/test/fixtures/config-example.yml +6 -0
- data/test/saxo/acceptance_spec.rb +109 -0
- 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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
data/spec/vcr_helper.rb
ADDED
@@ -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
|