nightcrawler_swift 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +11 -0
- data/Gemfile.lock +1 -1
- data/README.md +40 -25
- data/bin/nswift +8 -0
- data/lib/nightcrawler_swift/cli.rb +208 -0
- data/lib/nightcrawler_swift/command.rb +12 -2
- data/lib/nightcrawler_swift/{delete.rb → commands/delete.rb} +1 -1
- data/lib/nightcrawler_swift/{download.rb → commands/download.rb} +1 -1
- data/lib/nightcrawler_swift/{list.rb → commands/list.rb} +0 -0
- data/lib/nightcrawler_swift/{sync.rb → commands/sync.rb} +2 -2
- data/lib/nightcrawler_swift/commands/upload.rb +25 -0
- data/lib/nightcrawler_swift/connection.rb +44 -23
- data/lib/nightcrawler_swift/exceptions.rb +1 -0
- data/lib/nightcrawler_swift/tasks/asset_sync.rake +7 -1
- data/lib/nightcrawler_swift/version.rb +1 -1
- data/lib/nightcrawler_swift.rb +26 -9
- data/spec/fixtures/auth_success.json +6 -6
- data/spec/lib/nightcrawler_swift/cli_spec.rb +293 -0
- data/spec/lib/nightcrawler_swift/command_spec.rb +55 -14
- data/spec/lib/nightcrawler_swift/{delete_spec.rb → commands/delete_spec.rb} +15 -8
- data/spec/lib/nightcrawler_swift/{download_spec.rb → commands/download_spec.rb} +16 -7
- data/spec/lib/nightcrawler_swift/{list_spec.rb → commands/list_spec.rb} +12 -8
- data/spec/lib/nightcrawler_swift/{sync_spec.rb → commands/sync_spec.rb} +10 -1
- data/spec/lib/nightcrawler_swift/{upload_spec.rb → commands/upload_spec.rb} +23 -8
- data/spec/lib/nightcrawler_swift/connection_spec.rb +32 -20
- data/spec/lib/nightcrawler_swift/tasks/asset_sync_spec.rb +19 -3
- data/spec/lib/nightcrawler_swift_spec.rb +46 -15
- metadata +23 -18
- data/lib/nightcrawler_swift/upload.rb +0 -17
@@ -7,20 +7,62 @@ describe NightcrawlerSwift::Command do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
before do
|
10
|
+
NightcrawlerSwift.configure
|
10
11
|
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
12
|
+
allow(connection).to receive(:token_id).and_return(token)
|
13
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
11
14
|
allow(RestClient::Resource).to receive(:new).and_return(restclient)
|
12
15
|
end
|
13
16
|
|
14
|
-
let(:connection) {
|
17
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
15
18
|
let(:restclient) { double(:restclient, put: response, get: response, delete: response) }
|
16
19
|
let(:response) { double(:response) }
|
20
|
+
let(:url) { "http://url.com" }
|
21
|
+
let(:token) { "token" }
|
22
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
23
|
+
|
24
|
+
shared_examples "resource configured with NightcrawlerSwift.options" do
|
25
|
+
it "uses the configured verify_ssl" do
|
26
|
+
NightcrawlerSwift.configure verify_ssl: true
|
27
|
+
execute_http
|
28
|
+
expect(RestClient::Resource).to have_received(:new).with(url, hash_including(verify_ssl: true))
|
29
|
+
end
|
17
30
|
|
18
|
-
|
19
|
-
|
31
|
+
it "uses the configured timeout" do
|
32
|
+
NightcrawlerSwift.configure timeout: 10
|
33
|
+
execute_http
|
34
|
+
expect(RestClient::Resource).to have_received(:new).with(url, hash_including(timeout: 10))
|
35
|
+
end
|
20
36
|
end
|
21
37
|
|
22
|
-
|
23
|
-
"
|
38
|
+
describe "#connection" do
|
39
|
+
context "when disconnected" do
|
40
|
+
before do
|
41
|
+
allow(NightcrawlerSwift.connection).to receive(:connected?).and_return(false)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "connects and then return the connection" do
|
45
|
+
expect(NightcrawlerSwift.connection).to receive(:connect!)
|
46
|
+
expect(subject.connection).to eql(connection)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when connected" do
|
51
|
+
before do
|
52
|
+
allow(NightcrawlerSwift.connection).to receive(:connected?).and_return(true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns the connection" do
|
56
|
+
expect(NightcrawlerSwift.connection).to_not receive(:connect!)
|
57
|
+
expect(subject.connection).to eql(connection)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#options" do
|
63
|
+
it "returns NightcrawlerSwift.options" do
|
64
|
+
expect(subject.options).to eql(NightcrawlerSwift.options)
|
65
|
+
end
|
24
66
|
end
|
25
67
|
|
26
68
|
describe "#get" do
|
@@ -28,10 +70,8 @@ describe NightcrawlerSwift::Command do
|
|
28
70
|
subject.send :get, url, headers: {content_type: :json}
|
29
71
|
end
|
30
72
|
|
31
|
-
|
32
|
-
|
33
|
-
expect(RestClient::Resource).to have_received(:new).with(url, verify_ssl: false)
|
34
|
-
end
|
73
|
+
let(:execute_http) { get }
|
74
|
+
it_behaves_like "resource configured with NightcrawlerSwift.options"
|
35
75
|
|
36
76
|
it "sends headers with token" do
|
37
77
|
get
|
@@ -48,10 +88,8 @@ describe NightcrawlerSwift::Command do
|
|
48
88
|
subject.send :delete, url, headers: {content_type: :json}
|
49
89
|
end
|
50
90
|
|
51
|
-
|
52
|
-
|
53
|
-
expect(RestClient::Resource).to have_received(:new).with(url, verify_ssl: false)
|
54
|
-
end
|
91
|
+
let(:execute_http) { delete }
|
92
|
+
it_behaves_like "resource configured with NightcrawlerSwift.options"
|
55
93
|
|
56
94
|
it "sends headers with token" do
|
57
95
|
delete
|
@@ -68,6 +106,9 @@ describe NightcrawlerSwift::Command do
|
|
68
106
|
subject.send(:put, url, body: 'content', headers: {a: 1})
|
69
107
|
end
|
70
108
|
|
109
|
+
let(:execute_http) { put }
|
110
|
+
it_behaves_like "resource configured with NightcrawlerSwift.options"
|
111
|
+
|
71
112
|
it "returns RestClient response" do
|
72
113
|
expect(put).to eql(response)
|
73
114
|
end
|
@@ -84,7 +125,7 @@ describe NightcrawlerSwift::Command do
|
|
84
125
|
|
85
126
|
it "uses url to initialize RestClient" do
|
86
127
|
put
|
87
|
-
expect(RestClient::Resource).to have_received(:new).with(url, verify_ssl: false)
|
128
|
+
expect(RestClient::Resource).to have_received(:new).with(url, verify_ssl: false, timeout: nil)
|
88
129
|
end
|
89
130
|
end
|
90
131
|
|
@@ -2,27 +2,34 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe NightcrawlerSwift::Delete do
|
4
4
|
|
5
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
6
|
+
let(:token) { "token" }
|
7
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
8
|
+
let(:upload_url) { "server-url" }
|
9
|
+
|
5
10
|
subject do
|
6
11
|
NightcrawlerSwift::Delete.new
|
7
12
|
end
|
8
13
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
14
|
+
before do
|
15
|
+
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
16
|
+
allow(connection).to receive(:token_id).and_return(token)
|
17
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
18
|
+
allow(connection).to receive(:upload_url).and_return(upload_url)
|
19
|
+
end
|
13
20
|
|
21
|
+
describe "#execute" do
|
14
22
|
let :execute do
|
15
23
|
subject.execute "file_path"
|
16
24
|
end
|
17
25
|
|
18
26
|
before do
|
19
|
-
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
20
27
|
allow(subject).to receive(:delete).and_return(response)
|
21
28
|
end
|
22
29
|
|
23
30
|
context "success" do
|
24
31
|
let :response do
|
25
|
-
double(:response, code: 200
|
32
|
+
double(:response, code: 200)
|
26
33
|
end
|
27
34
|
|
28
35
|
it "deletes using upload url" do
|
@@ -30,8 +37,8 @@ describe NightcrawlerSwift::Delete do
|
|
30
37
|
expect(subject).to have_received(:delete).with("server-url/file_path", headers: {accept: :json})
|
31
38
|
end
|
32
39
|
|
33
|
-
it "returns
|
34
|
-
expect(execute).to eql
|
40
|
+
it "returns true" do
|
41
|
+
expect(execute).to eql true
|
35
42
|
end
|
36
43
|
end
|
37
44
|
|
@@ -2,21 +2,30 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe NightcrawlerSwift::Download do
|
4
4
|
|
5
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
6
|
+
let(:token) { "token" }
|
7
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
8
|
+
let(:public_url) { "server-url" }
|
9
|
+
let(:bucket) { "rogue" }
|
10
|
+
|
5
11
|
subject do
|
6
12
|
NightcrawlerSwift::Download.new
|
7
13
|
end
|
8
14
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
15
|
+
before do
|
16
|
+
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
17
|
+
allow(connection).to receive(:token_id).and_return(token)
|
18
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
19
|
+
allow(connection).to receive(:public_url).and_return(public_url)
|
20
|
+
NightcrawlerSwift.configure bucket: bucket
|
21
|
+
end
|
13
22
|
|
23
|
+
describe "#execute" do
|
14
24
|
let :execute do
|
15
25
|
subject.execute "file_path"
|
16
26
|
end
|
17
27
|
|
18
28
|
before do
|
19
|
-
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
20
29
|
allow(subject).to receive(:get).and_return(response)
|
21
30
|
end
|
22
31
|
|
@@ -25,9 +34,9 @@ describe NightcrawlerSwift::Download do
|
|
25
34
|
double(:response, code: 200, body: "content")
|
26
35
|
end
|
27
36
|
|
28
|
-
it "gets using
|
37
|
+
it "gets using public url" do
|
29
38
|
execute
|
30
|
-
expect(subject).to have_received(:get).with("server-url/file_path")
|
39
|
+
expect(subject).to have_received(:get).with("server-url/#{bucket}/file_path")
|
31
40
|
end
|
32
41
|
|
33
42
|
it "returns body" do
|
@@ -2,19 +2,23 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe NightcrawlerSwift::List do
|
4
4
|
|
5
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
6
|
+
let(:token) { "token" }
|
7
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
8
|
+
let(:upload_url) { "server-url" }
|
9
|
+
|
5
10
|
subject do
|
6
11
|
NightcrawlerSwift::List.new
|
7
12
|
end
|
8
13
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
16
|
-
end
|
14
|
+
before do
|
15
|
+
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
16
|
+
allow(connection).to receive(:token_id).and_return(token)
|
17
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
18
|
+
allow(connection).to receive(:upload_url).and_return(upload_url)
|
19
|
+
end
|
17
20
|
|
21
|
+
describe "#execute" do
|
18
22
|
context "success" do
|
19
23
|
let :json_response do
|
20
24
|
[{"name" => "file"}]
|
@@ -2,12 +2,21 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe NightcrawlerSwift::Sync do
|
4
4
|
|
5
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
6
|
+
let(:token) { "token" }
|
7
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
8
|
+
let(:upload_url) { "server-url" }
|
9
|
+
|
5
10
|
subject do
|
6
11
|
NightcrawlerSwift::Sync.new
|
7
12
|
end
|
8
13
|
|
9
14
|
before do
|
10
15
|
NightcrawlerSwift.logger = Logger.new(StringIO.new)
|
16
|
+
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
17
|
+
allow(connection).to receive(:token_id).and_return(token)
|
18
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
19
|
+
allow(connection).to receive(:upload_url).and_return(upload_url)
|
11
20
|
end
|
12
21
|
|
13
22
|
describe "#execute" do
|
@@ -17,7 +26,7 @@ describe NightcrawlerSwift::Sync do
|
|
17
26
|
end
|
18
27
|
|
19
28
|
it "executes upload command for each file of a directory" do
|
20
|
-
dir = File.expand_path(File.join(File.dirname(__FILE__), "
|
29
|
+
dir = File.expand_path(File.join(File.dirname(__FILE__), "../../../fixtures/assets"))
|
21
30
|
|
22
31
|
subject.instance_variable_set(:@upload, upload)
|
23
32
|
expect(File).to receive(:open).with(File.join(dir, "css1.css"), "r").and_call_original
|
@@ -3,27 +3,36 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
describe NightcrawlerSwift::Upload do
|
5
5
|
|
6
|
+
let(:connection) { NightcrawlerSwift::Connection.new }
|
7
|
+
let(:token) { "token" }
|
8
|
+
let(:expires_at) { (DateTime.now + 60).to_time }
|
9
|
+
let(:upload_url) { "server-url" }
|
10
|
+
|
6
11
|
subject do
|
7
12
|
NightcrawlerSwift::Upload.new
|
8
13
|
end
|
9
14
|
|
15
|
+
before do
|
16
|
+
NightcrawlerSwift.configure
|
17
|
+
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
18
|
+
allow(connection).to receive(:token_id).and_return(token)
|
19
|
+
allow(connection).to receive(:expires_at).and_return(expires_at)
|
20
|
+
allow(connection).to receive(:upload_url).and_return(upload_url)
|
21
|
+
end
|
22
|
+
|
10
23
|
describe "#execute" do
|
11
24
|
let(:path) { "file_name" }
|
12
25
|
let(:file) do
|
13
|
-
dir = File.expand_path(File.join(File.dirname(__FILE__), "
|
26
|
+
dir = File.expand_path(File.join(File.dirname(__FILE__), "../../../fixtures/assets"))
|
14
27
|
File.open(File.join(dir, "css1.css"))
|
15
28
|
end
|
16
29
|
|
17
|
-
let :connection do
|
18
|
-
double :connection, upload_url: "server-url", opts: OpenStruct.new {}
|
19
|
-
end
|
20
|
-
|
21
30
|
let :response do
|
22
31
|
double(:response, code: 201)
|
23
32
|
end
|
24
33
|
|
25
34
|
let :etag do
|
26
|
-
|
35
|
+
Digest::MD5.hexdigest(file.read)
|
27
36
|
end
|
28
37
|
|
29
38
|
let :max_age do
|
@@ -31,7 +40,6 @@ describe NightcrawlerSwift::Upload do
|
|
31
40
|
end
|
32
41
|
|
33
42
|
before do
|
34
|
-
allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
|
35
43
|
allow(subject).to receive(:put).and_return(response)
|
36
44
|
allow(file).to receive(:read).and_return("content")
|
37
45
|
end
|
@@ -61,7 +69,7 @@ describe NightcrawlerSwift::Upload do
|
|
61
69
|
end
|
62
70
|
|
63
71
|
it "sends max_age into headers" do
|
64
|
-
|
72
|
+
NightcrawlerSwift.configure max_age: max_age
|
65
73
|
execute
|
66
74
|
expect(subject).to have_received(:put).with(anything, hash_including(headers: { content_type: "text/css", etag: etag, cache_control: "max-age=#{max_age}" }))
|
67
75
|
end
|
@@ -79,6 +87,13 @@ describe NightcrawlerSwift::Upload do
|
|
79
87
|
let(:response) { double(:response, code: 500) }
|
80
88
|
it { expect(execute).to be false }
|
81
89
|
end
|
90
|
+
|
91
|
+
context "when rescue RestClient::UnprocessableEntity" do
|
92
|
+
it "wraps into NightcrawlerSwift::Exceptions::ValidationError" do
|
93
|
+
expect(subject).to receive(:put).and_raise(RestClient::UnprocessableEntity.new)
|
94
|
+
expect { execute }.to raise_error NightcrawlerSwift::Exceptions::ValidationError
|
95
|
+
end
|
96
|
+
end
|
82
97
|
end
|
83
98
|
|
84
99
|
end
|
@@ -8,8 +8,8 @@ describe NightcrawlerSwift::Connection do
|
|
8
8
|
tenant_name: "tenant_username1",
|
9
9
|
username: "username1",
|
10
10
|
password: "some-pass",
|
11
|
-
auth_url: "https://auth
|
12
|
-
max_age: 31536000 #1 year
|
11
|
+
auth_url: "https://auth-url-com:123/v2.0/tokens",
|
12
|
+
max_age: 31536000 # 1 year
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -19,22 +19,14 @@ describe NightcrawlerSwift::Connection do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
subject do
|
22
|
-
NightcrawlerSwift::Connection.new
|
22
|
+
NightcrawlerSwift::Connection.new
|
23
23
|
end
|
24
24
|
|
25
25
|
before do
|
26
|
+
NightcrawlerSwift.configure opts
|
26
27
|
NightcrawlerSwift.logger = Logger.new(StringIO.new)
|
27
28
|
end
|
28
29
|
|
29
|
-
describe "initialization" do
|
30
|
-
it "creates the opts struct with the given values" do
|
31
|
-
expect(subject.opts).to_not be_nil
|
32
|
-
opts.keys.each do |key|
|
33
|
-
expect(subject.opts.send(key)).to eql(opts[key])
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
30
|
describe "#connect!" do
|
39
31
|
let :auth_json do
|
40
32
|
{
|
@@ -55,12 +47,26 @@ describe NightcrawlerSwift::Connection do
|
|
55
47
|
end
|
56
48
|
|
57
49
|
describe "when it connects" do
|
50
|
+
let :resource do
|
51
|
+
RestClient::Resource.new(
|
52
|
+
opts[:auth_url],
|
53
|
+
verify_ssl: NightcrawlerSwift.options.verify_ssl,
|
54
|
+
timeout: NightcrawlerSwift.options.timeout
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
58
|
before do
|
59
|
-
allow(RestClient).to receive(:
|
60
|
-
|
59
|
+
allow(RestClient::Resource).to receive(:new).and_return(resource)
|
60
|
+
allow(resource).to receive(:post).
|
61
|
+
with(auth_json, content_type: :json, accept: :json).
|
61
62
|
and_return(auth_success_response)
|
62
63
|
end
|
63
64
|
|
65
|
+
it "stores the auth_response" do
|
66
|
+
subject.connect!
|
67
|
+
expect(subject.auth_response).to eql(OpenStruct.new(auth_success_json))
|
68
|
+
end
|
69
|
+
|
64
70
|
it "stores the token id" do
|
65
71
|
subject.connect!
|
66
72
|
expect(subject.token_id).to eql(auth_success_json["access"]["token"]["id"])
|
@@ -72,6 +78,11 @@ describe NightcrawlerSwift::Connection do
|
|
72
78
|
expect(subject.expires_at).to eql(expires_at)
|
73
79
|
end
|
74
80
|
|
81
|
+
it "stores the catalog" do
|
82
|
+
subject.connect!
|
83
|
+
expect(subject.catalog).to eql(auth_success_json["access"]["serviceCatalog"][0])
|
84
|
+
end
|
85
|
+
|
75
86
|
it "stores the admin_url" do
|
76
87
|
subject.connect!
|
77
88
|
expect(subject.admin_url).to eql(auth_success_json["access"]["serviceCatalog"].first["endpoints"].first["adminURL"])
|
@@ -91,18 +102,19 @@ describe NightcrawlerSwift::Connection do
|
|
91
102
|
expect(subject.connect!).to eql(subject)
|
92
103
|
end
|
93
104
|
|
94
|
-
context "
|
95
|
-
|
96
|
-
|
105
|
+
context "and there isn't any catalog configured" do
|
106
|
+
before do
|
107
|
+
auth_success_json["access"]["serviceCatalog"] = []
|
108
|
+
allow(subject).to receive(:auth_response).and_return(OpenStruct.new(auth_success_json))
|
97
109
|
end
|
98
110
|
|
99
|
-
it "
|
100
|
-
expect {
|
111
|
+
it "raises NightcrawlerSwift::Exceptions::ConfigurationError" do
|
112
|
+
expect { subject.connect! }.to raise_error(NightcrawlerSwift::Exceptions::ConfigurationError)
|
101
113
|
end
|
102
114
|
end
|
103
115
|
end
|
104
116
|
|
105
|
-
describe "when some error happens" do
|
117
|
+
describe "when some error happens with the connection" do
|
106
118
|
before do
|
107
119
|
allow(RestClient).to receive(:post).
|
108
120
|
with(opts[:auth_url], auth_json, content_type: :json, accept: :json).
|