ruby-libstorj 1.0.2 → 2.0.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: 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