nightcrawler_swift 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8ecba7c2f2eb54d05e60faf6f646e86f3cbabd6
4
- data.tar.gz: 90002c61b8d4980170bda37ba8350a215e016917
3
+ metadata.gz: 792e1b2a4c65b85291d7a5c733fbd238f6b4f531
4
+ data.tar.gz: b34fa251f341f191b7627d8ac200bb0daa43fdbd
5
5
  SHA512:
6
- metadata.gz: 59ac7d43fb910a23e5f8b5cc79ae674c32f64001e9d013055c289c1ad0c85af24fee8a638584080330c804e7322dbe6d603b17f8a30a7e52e5bffe0e40696e45
7
- data.tar.gz: d9d997b31878e5552c8c1128135a9f7a620df7a4038814f72bbe4f46a6d536ebafdb192e9f3cffefd54b72cbbc49fd91341fb9dbd682419c7b25289d6acc9a1d
6
+ metadata.gz: be4f048df14fe2453b4fc22ed8e495434c5f4fb51009f8e5765fae6f61cbc160dcf12ae4c2d274e4aa69096884b629d8e83538f03bd14dd4992ad39dc1e66f91
7
+ data.tar.gz: d9bd21e55c32c1ee73f16e817c7edf2c529552d94402c615a63a37026f01eb5ba477b21c461878f35fcd54953e574553dda79e5ce6f50cf5b745e61ad55030a7
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  .DS_Store
2
+ pkg
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ script: bundle exec rspec
data/Changelog.md ADDED
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0
4
+
5
+ - Included ```Cache-Control``` header to upload command through max_age configuration parameter
6
+ - Sending etag when uploading assets
7
+ - Bugfix: rake task now returns exit code 1 when error
8
+
9
+ ## 0.2.3
10
+
11
+ - Removed rest-client version due to compatibility issues
12
+
13
+ ## 0.2.2
14
+
15
+ - Included ```Content-Type``` header to upload command
16
+
17
+ ## 0.2.1
18
+
19
+ - Bugfix: sync was not connecting
20
+
21
+ ## 0.2.0
22
+
23
+ - Better Rails integration
24
+ - Download command
25
+
26
+ ## 0.1.1
27
+
28
+ - Bugfix: sync broken syntax
29
+
30
+ ## 0.1.0
31
+
32
+ - Connection object
33
+ - Sync, upload, delete and list commands
34
+ - Rake task to sync Rails public dir
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nightcrawler_swift (0.2.3)
4
+ nightcrawler_swift (0.3.0)
5
5
  multi_mime (>= 1.0.1)
6
6
  rest-client
7
7
 
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  [![Code Climate](https://codeclimate.com/github/tulios/nightcrawler_swift/badges/gpa.svg)](https://codeclimate.com/github/tulios/nightcrawler_swift)
2
-
2
+ [![Travis](https://api.travis-ci.org/tulios/nightcrawler_swift.svg?branch=master)](https://travis-ci.org/tulios/nightcrawler_swift)
3
+ [![Gem Version](https://badge.fury.io/rb/nightcrawler_swift.svg)](http://badge.fury.io/rb/nightcrawler_swift)
3
4
  # Nightcrawler Swift
4
5
 
5
6
  Like the X-Men nightcrawler this gem teleports your assets to a OpenStack Swift bucket/container. It was designed to sync your assets with OpenStack Swift and allow some operations with your buckets/containers.
@@ -21,17 +22,19 @@ Or install it yourself as:
21
22
  ## Usage
22
23
 
23
24
  ### With Rails
24
- #### 1) Configure your swift credentials
25
+ #### 1) Configure your swift credentials and options
25
26
 
26
27
  _In config/application.rb_ or _config/environments/*.rb_
27
28
 
28
29
  ```ruby
29
30
  config.nightcrawler_swift.bucket = "rogue"
30
- config.nightcrawler_swift.tenent_name = "nightcrawler"
31
+ config.nightcrawler_swift.tenant_name = "nightcrawler"
31
32
  config.nightcrawler_swift.username = "my_username1"
32
33
  config.nightcrawler_swift.password = "my_password1"
33
34
  config.nightcrawler_swift.auth_url = "https://auth.url.com:123/v2.0/tokens"
35
+ config.nightcrawler_swift.max_age = 3600 #optional
34
36
  ```
37
+ **max_age** will be used to define *Cache-Control:max-age=<value>* header. It's not required.
35
38
 
36
39
  By default it will use ```Rails.logger``` as logger, to change that use a different logger in configurations, like:
37
40
 
@@ -49,7 +52,7 @@ It will invoke ```rake assets:precompile``` and will copy your public directory
49
52
 
50
53
  ### Programatically
51
54
 
52
- #### 1) Configure your swift credentials
55
+ #### 1) Configure your swift credentials and options
53
56
 
54
57
  ```ruby
55
58
  NightcrawlerSwift.configure({
@@ -57,7 +60,8 @@ NightcrawlerSwift.configure({
57
60
  tenant_name: "nightcrawler"
58
61
  username: "my_username1",
59
62
  password: "my_password1",
60
- auth_url: "https://auth.url.com:123/v2.0/tokens"
63
+ auth_url: "https://auth.url.com:123/v2.0/tokens",
64
+ max_age: 3600 #optional
61
65
  })
62
66
  ```
63
67
 
@@ -6,6 +6,7 @@ module NightcrawlerSwift
6
6
  #
7
7
  def initialize opts = {}
8
8
  @opts = OpenStruct.new opts
9
+ raise NightcrawlerSwift::Exceptions::ConfigurationError.new "max_age should be an Integer" if @opts.max_age and not @opts.max_age.is_a? Numeric
9
10
  end
10
11
 
11
12
  def connect!
@@ -12,6 +12,6 @@ module NightcrawlerSwift
12
12
 
13
13
  class ConnectionError < BaseError; end
14
14
  class NotFoundError < BaseError; end
15
-
15
+ class ConfigurationError < StandardError; end
16
16
  end
17
17
  end
@@ -5,8 +5,12 @@ namespace :nightcrawler_swift do
5
5
 
6
6
  desc "Synchronizes the public directory with OpenStack Swift"
7
7
  task asset_sync: ["assets:precompile", "environment"] do
8
- raise unless defined?(Rails)
9
- NightcrawlerSwift.sync File.join(Rails.root, "public")
8
+ begin
9
+ NightcrawlerSwift.sync File.join(Rails.root, "public")
10
+ rescue => e
11
+ STDERR.puts e.message
12
+ exit 1
13
+ end
10
14
  end
11
15
 
12
16
  end
@@ -1,9 +1,15 @@
1
+ require 'digest'
2
+
1
3
  module NightcrawlerSwift
2
4
  class Upload < Command
3
5
 
4
6
  def execute path, file
5
7
  content_type = MultiMime.by_file(file).content_type
6
- response = put "#{connection.upload_url}/#{path}", body: file.read, headers: {content_type: content_type}
8
+ content = file.read
9
+ etag = '"%s"' % Digest::MD5.new.update(content).hexdigest
10
+ headers = {etag: etag, content_type: content_type}
11
+ headers.merge!({cache_control: "max-age=#{connection.opts.max_age}"}) if connection.opts.max_age
12
+ response = put "#{connection.upload_url}/#{path}", body: content, headers: headers
7
13
  [200, 201].include?(response.code)
8
14
  end
9
15
 
@@ -1,3 +1,3 @@
1
1
  module NightcrawlerSwift
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -8,7 +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.url.com:123/v2.0/tokens"
11
+ auth_url: "https://auth.url.com:123/v2.0/tokens",
12
+ max_age: 31536000 #1 year
12
13
  }
13
14
  end
14
15
 
@@ -89,6 +90,16 @@ describe NightcrawlerSwift::Connection do
89
90
  it "returns self" do
90
91
  expect(subject.connect!).to eql(subject)
91
92
  end
93
+
94
+ context "max_age" do
95
+ it "stores it" do
96
+ expect(subject.opts.max_age).to eql(opts[:max_age])
97
+ end
98
+
99
+ it "should be an integer" do
100
+ expect { NightcrawlerSwift::Connection.new({max_age: "a string"}) }.to raise_error(NightcrawlerSwift::Exceptions::ConfigurationError)
101
+ end
102
+ end
92
103
  end
93
104
 
94
105
  describe "when some error happens" do
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ unless defined?(Rails)
4
+ module Rails
5
+ def self.root; end
6
+ end
7
+ end
8
+
9
+ describe "asset_sync.rake" do
10
+ let :rake do
11
+ Rake.application = Rake::Application.new
12
+ end
13
+
14
+ let :load_path do
15
+ [File.expand_path(File.join(File.dirname(__FILE__), "../../../../lib/nightcrawler_swift/tasks"))]
16
+ end
17
+
18
+ before do
19
+ rake.rake_require "asset_sync", load_path, []
20
+
21
+ Rake::Task.define_task("environment")
22
+ Rake::Task.define_task("assets:precompile")
23
+ end
24
+
25
+ describe "nightcrawler_swift:rails:asset_sync" do
26
+ let(:task_name) { "nightcrawler_swift:rails:asset_sync" }
27
+ subject { rake[task_name] }
28
+
29
+ before do
30
+ allow(Rails).to receive(:root).and_return(".")
31
+ end
32
+
33
+ it "requires environment and assets:precompile" do
34
+ expect(subject.prerequisites).to include "environment"
35
+ expect(subject.prerequisites).to include "assets:precompile"
36
+ end
37
+
38
+ it "calls sync with Rails public dir path" do
39
+ expect(NightcrawlerSwift).to receive(:sync).with("./public")
40
+ subject.invoke
41
+ end
42
+
43
+ context "when occurs an error" do
44
+ it "exits with code 1" do
45
+ allow(STDERR).to receive(:puts)
46
+ allow(NightcrawlerSwift).to receive(:sync).and_raise(StandardError.new)
47
+ code = "wrong code"
48
+
49
+ begin
50
+ subject.invoke
51
+ rescue SystemExit => e
52
+ code = e.status
53
+ end
54
+
55
+ expect(code).to eql(1)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,3 +1,4 @@
1
+ require 'digest'
1
2
  require 'spec_helper'
2
3
 
3
4
  describe NightcrawlerSwift::Upload do
@@ -14,13 +15,21 @@ describe NightcrawlerSwift::Upload do
14
15
  end
15
16
 
16
17
  let :connection do
17
- double :connection, upload_url: "server-url"
18
+ double :connection, upload_url: "server-url", opts: OpenStruct.new {}
18
19
  end
19
20
 
20
21
  let :response do
21
22
  double(:response, code: 201)
22
23
  end
23
24
 
25
+ let :etag do
26
+ '"%s"' % Digest::MD5.new.update(file.read).hexdigest
27
+ end
28
+
29
+ let :max_age do
30
+ 31536000
31
+ end
32
+
24
33
  before do
25
34
  allow(NightcrawlerSwift).to receive(:connection).and_return(connection)
26
35
  allow(subject).to receive(:put).and_return(response)
@@ -41,9 +50,9 @@ describe NightcrawlerSwift::Upload do
41
50
  expect(subject).to have_received(:put).with(anything, hash_including(body: "content"))
42
51
  end
43
52
 
44
- it "sends file content_type as header" do
53
+ it "sends file metadata as headers" do
45
54
  execute
46
- expect(subject).to have_received(:put).with(anything, hash_including(headers: { content_type: "text/css"}))
55
+ expect(subject).to have_received(:put).with(anything, hash_including(headers: { content_type: "text/css", etag: etag}))
47
56
  end
48
57
 
49
58
  it "sends to upload url with given path" do
@@ -51,6 +60,12 @@ describe NightcrawlerSwift::Upload do
51
60
  expect(subject).to have_received(:put).with("server-url/file_name", anything)
52
61
  end
53
62
 
63
+ it "sends max_age into headers" do
64
+ connection.opts.max_age = max_age
65
+ execute
66
+ expect(subject).to have_received(:put).with(anything, hash_including(headers: { content_type: "text/css", etag: etag, cache_control: "max-age=#{max_age}" }))
67
+ end
68
+
54
69
  context "when response code is 200" do
55
70
  let(:response) { double(:response, code: 200) }
56
71
  it { expect(execute).to be true }
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require "rake"
1
2
  require "byebug"
2
3
  require "nightcrawler_swift"
3
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nightcrawler_swift
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tulios
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-28 00:00:00.000000000 Z
12
+ date: 2014-08-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -108,6 +108,8 @@ files:
108
108
  - ".rspec"
109
109
  - ".ruby-gemset"
110
110
  - ".ruby-version"
111
+ - ".travis.yml"
112
+ - Changelog.md
111
113
  - Gemfile
112
114
  - Gemfile.lock
113
115
  - LICENSE.txt
@@ -138,6 +140,7 @@ files:
138
140
  - spec/lib/nightcrawler_swift/download_spec.rb
139
141
  - spec/lib/nightcrawler_swift/list_spec.rb
140
142
  - spec/lib/nightcrawler_swift/sync_spec.rb
143
+ - spec/lib/nightcrawler_swift/tasks/asset_sync_spec.rb
141
144
  - spec/lib/nightcrawler_swift/upload_spec.rb
142
145
  - spec/lib/nightcrawler_swift_spec.rb
143
146
  - spec/spec_helper.rb
@@ -179,6 +182,7 @@ test_files:
179
182
  - spec/lib/nightcrawler_swift/download_spec.rb
180
183
  - spec/lib/nightcrawler_swift/list_spec.rb
181
184
  - spec/lib/nightcrawler_swift/sync_spec.rb
185
+ - spec/lib/nightcrawler_swift/tasks/asset_sync_spec.rb
182
186
  - spec/lib/nightcrawler_swift/upload_spec.rb
183
187
  - spec/lib/nightcrawler_swift_spec.rb
184
188
  - spec/spec_helper.rb