ruby-libstorj 1.0.2 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: da0c169cee3689352622405ff4cf677cfa800487
4
- data.tar.gz: e5cb152afd2618c23dacb2bd0a1b2469d82ae5b9
3
+ metadata.gz: d6fe0bf8d40e520d210d6dce512a1c767b4eb3df
4
+ data.tar.gz: 7409289788a7ccb6915364c29a2593901597a76c
5
5
  SHA512:
6
- metadata.gz: ddc31eb2a14fd3cd997ea1cc465fa2e08028911fc2aaa017bd9485fa455f63c8329dd91aed844e593871d4e3e8bca2a9bd07b78030cbc47f5e98139a92c1d511
7
- data.tar.gz: 9e5e35acf4530e58c351b46bb0e4dc9e8871d7ff81e6a6bc7209477eed0e232eda8808a9d78739a91367d39d0f7e508f8f73fe64f456fc0cb182f7a20894a356
6
+ metadata.gz: e69068e9392da1589dc68a710b7a6841bc07aea6b7d13006a7da4c015cedd7c665fbafbde2a27ac39ed3c1a274e50f1028038d6a8fafa746f76b36753d5dbdfa
7
+ data.tar.gz: 13fec483fc292a4aa73c28aa4e20d6982dcfcaa06bb4e35ac8febc70f26646be9beb11c6692eb546ba411b6833c86402b014141bd00ca90da7890bcbe0c50bb4
data/.gitignore CHANGED
@@ -5,6 +5,6 @@
5
5
  *.a
6
6
  *.log
7
7
  tmp/*
8
- spec/helpers/options.yml
8
+ options.yml
9
9
  Makefile
10
10
  coverage
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-libstorj (1.0.2)
4
+ ruby-libstorj (2.0.0)
5
5
  ffi (~> 1.9)
6
6
  libuv (~> 3.2)
7
7
  rake (~> 12.0)
data/README.md CHANGED
@@ -28,7 +28,7 @@ Ruby library for encrypted file transfer on the Storj network via bindings to [l
28
28
  cd ruby-libstorj && \
29
29
  rake install
30
30
  ```
31
- (see [installing for development](#wip) if you have issues with `rake install`)
31
+ (see [installing for development](#install-gem-1) if you have issues with `rake install`)
32
32
 
33
33
  ### Usage:
34
34
  Until more thorough documentation is available, please see the tests:
@@ -39,6 +39,7 @@ Until more thorough documentation is available, please see the tests:
39
39
  - `.mnemonic_check`
40
40
  - `.mnemonic_generate`
41
41
  + [`LibStorj::Env`](./spec/ruby-libstorj/env_spec.rb) _[(source)](./lib/ruby-libstorj/env.rb)_
42
+ - `.new`
42
43
  - `#get_info`
43
44
  - `#get_buckets`
44
45
  - `#create_bucket`
@@ -79,17 +80,15 @@ rake compile
79
80
  ```
80
81
  (see [`rake-compiler`](https://github.com/rake-compiler/rake-compiler))
81
82
 
82
- ### Build gem:
83
- ```bash
84
- rake
85
-
86
- # OR
87
- # rake build
88
- # rake build[no-test] # build without requiring tests to pass
89
- ```
90
-
91
- ### Install gem:
83
+ ### Build and install gem:
92
84
  + with `rake`:
85
+ ```bash
86
+ rake
87
+
88
+ # OR
89
+ # rake build
90
+ # rake build[no-test] # build without requiring tests to pass
91
+ ```
93
92
  ```bash
94
93
  rake install
95
94
 
@@ -99,22 +98,25 @@ rake
99
98
 
100
99
  + with `gem`:
101
100
 
102
- Maybe you need/want to pass args to `gem`, or maybe `rake install` doesn't work on your system:
101
+ Maybe you need/want to pass args to `gem`, or maybe `rake install` doesn't work in your environment:
103
102
 
104
103
  ```bash
105
- gem install --local ./ruby-libstorj-*.gem --no-ri --no-rdoc
104
+ gem build ./ruby-libstorj.gemspec
105
+ ```
106
+ ```bash
107
+ gem install --local ./ruby-libstorj-<version>.gem --no-ri --no-rdoc
106
108
  ```
107
109
 
108
110
  ### Testing:
109
111
  #### First create spec/helpers/options.yml !
110
112
  For the moment, the test suite doesn't start it's own mock backend but it does parse whatever's in the `spec/helpsers/options.yml` file to initialize `LibStorj::Ext::Storj::Env` to connect via http/https.
111
113
 
112
- You can copy [`spec/helpers/options.yml.example`](spec/helpers/options.example.yml) and modify it for your use:
114
+ You can copy [`spec/helpers/options.yml.example`](options.example.yml) and modify it for your use:
113
115
  ```bash
114
116
  cp spec/helpers/options.yml.example spec/helpers/options.yml && \
115
117
  vim spec/helpers/options.yml # or whatever
116
118
  ```
117
- `spec/helpers/options.yml` should be in the [`.gitignore`](./.gitignore) so you shouldn't have to worry about accidentally committing it.
119
+ Ensure that `spec/helpers/options.yml` is in the [`.gitignore`](./.gitignore) so you don't have to worry about accidentally committing it.
118
120
 
119
121
  #### A quick note on rspec formatters:
120
122
  The "progress" formatter is the default.
@@ -187,109 +189,3 @@ For example usages see "with `rake`" below.
187
189
  # rspec spec/ruby-libstorj/env_spec.rb:15 # run test(s) containing line 15
188
190
  ```
189
191
  (see `rspec --help | less`)
190
-
191
- ### Gotchas:
192
- + `libuv` (see http://docs.libuv.org/en/v1.x/)
193
-
194
- #### The problem
195
- The C library [`libuv`](http://docs.libuv.org/en/v1.x/) is used by [`libstorj`](https://github.com/storj/libstorj) for concurrency;
196
- however, ruby's C API is not thread-safe so this is currently resolved by using the ruby gem [`libuv`](https://rubygems.org/gems/libuv) in tandem with the C-`libuv` calls in `libstorj`
197
-
198
- Specifically, `libstorj` makes calls to the C-`libuv` function [`uv_queue_work`](http://docs.libuv.org/en/v1.x/threadpool.html), which queues work to be run in another thread.
199
- In standard C-`libuv` usage, you would call [`uv_run(...)`](http://docs.libuv.org/en/v1.x/loop.html#c.uv_run):
200
-
201
- ```c
202
- #include <uv.h>
203
- ...
204
- // Queue work to be run in another thread
205
- uv_queue_work(...);
206
- ...
207
- // Run the event loop
208
- uv_run(...);
209
- ```
210
-
211
- After calling a function which queues work using the C `uv_queue_work` function, simply calling `uv_run` from ruby does **not work**:
212
- ```c
213
- /* example.c */
214
- #include <uv.h>
215
- ...
216
- // implemented elsewhere
217
- uv_work_t* my_work_factory(void* handle);
218
- ...
219
- handle_wrapper
220
- ...
221
- extern "C"
222
- int example_queue_work(void* handle, uv_after_work_cb cb)
223
- {
224
- uv_loop_t* loop = uv_default_loop();
225
- uv_work_t *work = my_work_factory(handle);
226
-
227
- return uv_queue_work(loop, work, my_worker, cb);
228
- }
229
- ```
230
-
231
- ```ruby
232
- # example.rb
233
- # NOTE: THIS IS AN EXAMPLE OF WHAT DOES NOT WORK
234
- ####################################### === ####
235
- require 'ffi'
236
-
237
- module Example
238
- extend FFI::Library
239
- # load built shared object from C/C++ using ruby ffi
240
- ffi_lib '/path/to/libexample.so'
241
-
242
- # NB: if `libexample` is installed in the usual system location*
243
- # ffi_lib 'example'
244
-
245
- # expose C functions as members of the `Example` module
246
- attach_function('queue_work', 'example_queue_work', [:pointer, :int], :int)
247
- attach_function('run', 'uv_run', [:pointer, :int], :int)
248
- end
249
-
250
- handle = FFI::Function.new(...) {...}
251
- cb = FFI::Function.new(...) {...}
252
-
253
- Example.queue_work handle, cb
254
- Example.run #=> segmentation fault
255
- ```
256
- _*`ffi_lib` automatically adds the conventional "lib" prefix to args which are not absolute paths_
257
-
258
-
259
- It seems to be the case that calls to `uv_default_loop()` made from within C-libstorj point to a different location than the default loop from ruby-livub.
260
- It may be the case that C-libuv is being loaded twice, one linked through C-libstorj and the other through ruby-libuv bindings or something; more digging required.
261
-
262
- #### The solution
263
- Instead of calling `uv_run` directly, if we let the ruby `libuv` gem do it for us, we can call `uv_queue_work` in C as much as we want.
264
-
265
- Using ruby-`libuv`'s `reactor` block to wrap calls to C functions that call `uv_queue_work`, we let ruby-`libuv` do the heavy concurrency lifting and C-`libuv` integration:
266
-
267
- ```ruby
268
- # example.rb
269
- require 'libuv'
270
- require 'ffi'
271
-
272
- module Example
273
- extend FFI::Library
274
- # load built shared object from C/C++ using ruby ffi
275
- ffi_lib '/path/to/libexample.so'
276
-
277
- # NB: if `libexample` is installed in the usual system location*
278
- # ffi_lib 'example'
279
-
280
- # expose C functions as members of the `Example` module
281
- attach_function('queue_work', 'example_queue_work', [:pointer, :int], :int)
282
- end
283
-
284
- handle = FFI::Function.new(...) {...}
285
- cb = FFI::Function.new(...) {...}
286
-
287
- reactor do |reactor|
288
- reactor.work do
289
- Example.queue_work handle, cb
290
- end
291
- end
292
- ```
293
- (see https://github.com/cotag/libuv)
294
-
295
- _NB: the understanding presented here comes from reading the docs and source of the various C and ruby libraries involved_
data/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
  # i.e. `require 'ruby-libstorj/...'`
3
3
  require_relative './lib/ruby-libstorj/arg_forwarding_task'
4
4
 
5
+ TEMP_PATH = File.join(%W(#{__dir__} tmp))
6
+
5
7
  # NB: using begin/rescue so that you can use your
6
8
  # Rakefile in an environment where RSpec is
7
9
  # unavailable (e.g. production)
@@ -52,14 +54,12 @@ Rake::ExtensionTask.new 'ruby-libstorj'
52
54
 
53
55
  # TODO: everything that follows... but better
54
56
  LibStorj::ArgForwardingTask.new(:build, args_deps_hash: {
55
- %i[no-test] => []
57
+ %i[no-test] => [TEMP_PATH.to_sym]
56
58
  }) do |t, args, deps|
57
59
  Rake::Task[:spec].invoke if args.to_hash[:'no-test'].nil?
58
60
 
59
- directory 'tmp'
60
-
61
- sh 'gem build ./ruby-libstorj.gemspec'
62
- sh 'mv ./ruby-libstorj-*.gem ./tmp/'
61
+ sh 'gem build ruby-libstorj.gemspec'
62
+ sh "mv ruby-libstorj-*.gem #{TEMP_PATH}#{File::SEPARATOR}"
63
63
  end
64
64
 
65
65
  LibStorj::ArgForwardingTask.new(:install, args_deps_hash: {
@@ -72,5 +72,7 @@ LibStorj::ArgForwardingTask.new(:install, args_deps_hash: {
72
72
  --no-rdoc'
73
73
  end
74
74
 
75
+ directory TEMP_PATH
76
+
75
77
  # Build (and test) when you run `rake`
76
78
  task default: %i[build]
@@ -21,6 +21,6 @@ RUN make install
21
21
  RUN gem install ruby-libstorj
22
22
 
23
23
  WORKDIR /storj
24
- COPY ./spec/helpers/storj_options.rb ./test.rb ./
25
- COPY ./spec/helpers/options.example.yml ./options.yml
26
- CMD /bin/bash
24
+ COPY ./dockerfiles/test.rb ./test.rb
25
+ COPY ./options.example.yml ./options.yml
26
+ CMD bash -c 'echo "### Edit ./options.yml & edit/run ruby ./test.rb ###" && /bin/bash'
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+
3
+ const MongoClient = require('mongodb').MongoClient;
4
+ const assert = require('assert');
5
+
6
+ // Connection URL
7
+ const url = 'mongodb://localhost:27017';
8
+
9
+ // Database Name
10
+ const dbName = 'storj-sandbox';
11
+
12
+ // Use connect method to connect to the server
13
+ MongoClient.connect(url, function(err, client) {
14
+ assert.equal(null, err);
15
+ console.log("Successfully connected to mongo...");
16
+
17
+ const db = client.db(dbName);
18
+
19
+ // find and update all users to be activated
20
+ db.collection('users').updateMany({activated: false}, {$set:
21
+ {
22
+ activated: true,
23
+ activator: null
24
+ }
25
+ }, function(err, result) {
26
+ if (err) {
27
+ return console.error(err);
28
+ }
29
+
30
+ console.log("...done!");
31
+ // console.log(result);
32
+ client.close();
33
+ });
34
+ });
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/expect
2
+
3
+ set email "$env(STORJ_EMAIL)\n"
4
+ set pass "$env(STORJ_PASS)\n"
5
+ set keypass "$env(STORJ_KEYPASS)\n"
6
+ set strength "128\n"
7
+ set timeout 3
8
+
9
+ spawn storj register
10
+
11
+ expect "Bridge username"
12
+ send $email
13
+
14
+ expect "Bridge password:"
15
+ send $pass
16
+
17
+ expect "Strength:"
18
+ send $strength
19
+
20
+ # expect "overwrite"
21
+ # send "y\n"
22
+
23
+ expect "Unlock passphrase:"
24
+ send $keypass
25
+
26
+ expect "Again to verify:"
27
+ send $keypass
28
+
29
+ expect "EOF"
30
+
31
+ exit
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/expect
2
+
3
+ set email "$env(STORJ_EMAIL)\n"
4
+ set pass "$env(STORJ_PASS)\n"
5
+ set keypass "$env(STORJ_KEYPASS)\n"
6
+ set mnemonic "$env(STORJ_MNEMONIC)\n"
7
+ set timeout 3
8
+
9
+ spawn storj import-keys
10
+
11
+ expect "Would you like to overwrite"
12
+ send "y\n"
13
+
14
+ expect "Bridge username"
15
+ send $email
16
+
17
+ expect "Bridge password:"
18
+ send $pass
19
+
20
+ expect "Encryption key:"
21
+ send $mnemonic
22
+
23
+ expect "Unlock passphrase:"
24
+ send $keypass
25
+
26
+ expect "Again to verify:"
27
+ send $keypass
28
+
29
+ expect "EOF"
30
+
31
+ exit
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "setup-user",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "activate_user.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "author": "",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "mongodb": "^3.0.4"
13
+ }
14
+ }
@@ -0,0 +1,26 @@
1
+ #!/bin/bash
2
+ . ~/.nvm/nvm.sh
3
+
4
+ root_dir="/root"
5
+
6
+ #redis
7
+ service redis-server start
8
+
9
+ #mongodb
10
+ service mongod start
11
+
12
+ #storjbridge
13
+ pm2 start -n bridge $root_dir/bin/storj-bridge -- -c $root_dir/config/storj-bridge/config.json -d $root_dir/config/storj-bridge
14
+
15
+ #wait for things to come up
16
+ echo "Sleeping for 5..."
17
+ sleep 5
18
+
19
+ ./create_user.sh
20
+ ./import_keys.sh
21
+ npm install
22
+ node ./activate_user.js
23
+
24
+ service redis-server stop
25
+ service mongod stop
26
+ pm2 delete all
@@ -0,0 +1,9 @@
1
+ require 'ruby-libstorj'
2
+
3
+ options_path = File.join %W(#{__dir__} options.yml)
4
+ storj = LibStorj::Env.new(path: options_path)
5
+
6
+ storj.get_buckets do |error, buckets|
7
+ puts "error: #{error}"
8
+ puts "buckets: #{buckets}"
9
+ end
@@ -6,8 +6,17 @@ module LibStorj
6
6
 
7
7
  C_ANALOGUE = ::LibStorj::Ext::Storj::Env
8
8
 
9
- def initialize(*options)
10
- @storj_env = ::LibStorj::Ext::Storj.method(:init_env).call(*options)
9
+ def initialize(path:, **options)
10
+ # NB: ensure all options are pointers before passing them directly
11
+ options = {} unless options.all? {|_, o| o.is_a? ::FFI::Pointer}
12
+
13
+ if !path.nil? && File.exists?(path)
14
+ options = ::LibStorj.load_yaml_options(path).merge options
15
+ end
16
+
17
+ # puts options
18
+ @storj_env = ::LibStorj::Ext::Storj.method(:init_env).call(*options.values)
19
+
11
20
  # use ruby libuv's default_loop
12
21
  @storj_env[:loop] = ::Libuv::Ext.default_loop
13
22
  end
@@ -15,8 +15,10 @@ module LibStorj
15
15
  require 'ruby-libstorj/ext/upload_options'
16
16
  require 'ruby-libstorj/ext/file'
17
17
 
18
- require 'ruby-libstorj/env'
19
18
  require 'ruby-libstorj/mixins/storj'
20
19
 
20
+ extend ::LibStorj::Storj::Mixins
21
21
  extend ::LibStorj::Ext::Storj::Mixins
22
+
23
+ require 'ruby-libstorj/env'
22
24
  end
@@ -1,4 +1,62 @@
1
1
  module LibStorj
2
+ module Storj
3
+ module Mixins
4
+ require 'yaml'
5
+
6
+ def load_yaml_options(path)
7
+ throw(:ENOENT) unless File.exist?(path)
8
+
9
+ options_yml = YAML.load_file path
10
+ build_options(default_type_map, options_yml.to_hash)
11
+ end
12
+
13
+ def default_type_map
14
+ {
15
+ bridge: ::LibStorj::Ext::Storj::BridgeOptions,
16
+ encrypt: ::LibStorj::Ext::Storj::EncryptOptions,
17
+ http: ::LibStorj::Ext::Storj::HttpOptions,
18
+ log: ::LibStorj::Ext::Storj::LogOptions
19
+ }
20
+ end
21
+
22
+ def build_options(type_map, option_groups)
23
+ Hash[option_groups.map do |group_name, options|
24
+
25
+ option_type = type_map[group_name.to_sym]
26
+ member_field_hash = Hash[option_type.members.zip option_type.layout.fields]
27
+ option_instance = option_type.new
28
+
29
+ options.map do |name, value|
30
+ name = name.to_sym
31
+
32
+ if name == :logger
33
+ option_instance[:logger] = ::LibStorj::Ext::Storj.const_get value
34
+
35
+ next
36
+ end
37
+
38
+ option_field = member_field_hash[name]
39
+
40
+ # TODO: check types and/or error handle
41
+ if option_field.nil?
42
+ option_instance = FFI::MemoryPointer::NULL
43
+ elsif option_field.is_a?(FFI::StructLayout::Pointer)
44
+ # Assuming pointers are strings
45
+ #
46
+ pointer = FFI::MemoryPointer.from_string(value.nil? ? '' : value)
47
+ option_instance[name] = pointer
48
+ else
49
+ option_instance[name] = value
50
+ end
51
+
52
+ end
53
+
54
+ [group_name, option_instance]
55
+ end]
56
+ end
57
+ end
58
+ end
59
+
2
60
  module Ext
3
61
  module Storj
4
62
  module Mixins
@@ -4,7 +4,7 @@
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = 'ruby-libstorj'
7
- gem.version = '1.0.2' #LibStorj::VERSION
7
+ gem.version = '2.0.0' #LibStorj::VERSION
8
8
  gem.license = 'AGPL-3.0'
9
9
  gem.authors = ['Bryan White']
10
10
  gem.email = ['bryanchriswhite@gmail.com', 'bryan@storj.io']
@@ -1,52 +1,6 @@
1
1
  module LibStorjTest
2
- require 'yaml'
3
2
  require 'ruby-libstorj'
4
3
 
5
- def build_options(type_map)
6
- options_yml = YAML.load_file "#{__dir__}/options.yml"
7
- options_yml.to_a.map do |option_group|
8
- group_name, options = option_group
9
-
10
- option_type = type_map[group_name.to_sym]
11
- member_field_hash = Hash[option_type.members.zip option_type.layout.fields]
12
- option_instance = option_type.new
13
-
14
- options.each do |option|
15
- name, value = [option[0].to_sym, option[1]]
16
-
17
- if name == :logger
18
- option_instance[:logger] = ::LibStorj::Ext::Storj.const_get value
19
-
20
- next
21
- end
22
-
23
- option_field = member_field_hash[name]
24
-
25
- # TODO: check types and/or error handle
26
- if option_field.nil?
27
- option_instance = FFI::MemoryPointer::NULL
28
- elsif option_field.is_a?(FFI::StructLayout::Pointer)
29
- # Assuming pointers are strings
30
- #
31
- pointer = FFI::MemoryPointer.from_string(value.nil? ? '' : value)
32
- option_instance[name] = pointer
33
- else
34
- option_instance[name] = value
35
- end
36
-
37
- end
38
-
39
- option_instance
40
- end
41
- end
42
-
43
- def default_options
44
- build_options bridge: ::LibStorj::Ext::Storj::BridgeOptions,
45
- encrypt: ::LibStorj::Ext::Storj::EncryptOptions,
46
- http: ::LibStorj::Ext::Storj::HttpOptions,
47
- log: ::LibStorj::Ext::Storj::LogOptions
48
- end
49
-
50
4
  def get_test_bucket_id(&block)
51
5
  instance.get_buckets do |error, buckets|
52
6
  throw(:no_bucket) if buckets.nil?
@@ -5,8 +5,9 @@ include LibStorjTest
5
5
  RSpec.describe LibStorj::Env do
6
6
  let(:bucket_class) {::LibStorj::Ext::Storj::Bucket}
7
7
  let(:file_class) {::LibStorj::Ext::Storj::File}
8
+ let(:default_path) {File.join %W(#{__dir__} .. .. options.yml)}
8
9
  let(:instance) do
9
- described_class.new(*default_options)
10
+ described_class.new(path: default_path)
10
11
  end
11
12
 
12
13
  after :each do
@@ -69,7 +70,7 @@ RSpec.describe LibStorj::Env do
69
70
  end
70
71
 
71
72
  it 'yields a nil error and an array of buckets' do
72
- expect do |block| #{|block| instance.get_bucekts(&block)}.to yield_with_args
73
+ expect do |block|
73
74
  instance.get_buckets do |error, buckets|
74
75
  expect(error).to be(nil)
75
76
  expect(buckets.length).to be(bucket_names.length)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-libstorj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan White
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-20 00:00:00.000000000 Z
11
+ date: 2018-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -86,6 +86,12 @@ files:
86
86
  - Rakefile
87
87
  - dockerfiles/example.dockerfile
88
88
  - dockerfiles/ruby-libstorj.dockerfile
89
+ - dockerfiles/setup-user/activate_user.js
90
+ - dockerfiles/setup-user/create_user.sh
91
+ - dockerfiles/setup-user/import_keys.sh
92
+ - dockerfiles/setup-user/package.json
93
+ - dockerfiles/setup-user/setup_user.sh
94
+ - dockerfiles/test.rb
89
95
  - ext/libstorj/.gitignore
90
96
  - ext/libstorj/.travis.yml
91
97
  - ext/libstorj/CONTRIBUTING.md
@@ -157,8 +163,8 @@ files:
157
163
  - lib/ruby-libstorj/libstorj.rb
158
164
  - lib/ruby-libstorj/mixins/storj.rb
159
165
  - lib/ruby-libstorj/struct.rb
166
+ - options.example.yml
160
167
  - ruby-libstorj.gemspec
161
- - spec/helpers/options.example.yml
162
168
  - spec/helpers/shared_rake_examples.rb
163
169
  - spec/helpers/storj_options.rb
164
170
  - spec/helpers/upload.data