nsrr 0.2.0 → 0.3.0.beta1

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: 69a067a927b05ad944da6faccfdf79b6d470f940
4
- data.tar.gz: fb46592c764214c6f6c8d3a854911d128c1336df
3
+ metadata.gz: 47192f16e29c8348a3806bf5b664d6f122772460
4
+ data.tar.gz: 2eb61ae1eb977358192775ca3fb4970eab77fe27
5
5
  SHA512:
6
- metadata.gz: 18a1d58c5c4a82bed071492dc3598ae57e4273b1fc37d42b71cac834fc9d0157adaa58cd171c8f4c87bf4d45e68b28ce1b4a454f3864dd1600669758c3b4f069
7
- data.tar.gz: 73557b26b0f68b376011a701ee105a3909c0c80e28c6700e00e9921de2ebadfd74f9c6b7507bc35b3e332c40d56cd6bc86f5711780beca02fe757c7291ac61a1
6
+ metadata.gz: c18289ef636386f3bfa9160ae229df05d6601db3f6160a0ce4143d26c04debc94afb0fb29d00feec8fedcc03e990f5010d2015ca63e64911b690045c1f3cbf6d
7
+ data.tar.gz: e9f5a51cd80df55a8a0fbad3651ee93222e890e5a1220b328507d98a69fe75db75e7fec8c94e7139accaf572c2886d0fac420802574ccb9d0d9ea2ba05169c67
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 0.3.0
2
+
3
+ ### Enhancements
4
+ - **Download Command**
5
+ - The `nsrr download` command can now download single files
6
+ - Ex: `nsrr download shhs/datasets/CHANGELOG.md`
7
+ - User tokens are stripped of extra whitespace to avoid common authentication
8
+ issues
9
+ - **Gem Changes**
10
+ - Updated to Ruby 2.3.0
11
+ - Updated to colorize 0.7.7
12
+ - Updated to simplecov 0.11.2
13
+ - Removed minitest-reporters
14
+ - Bundler is now a required dependency
15
+
16
+ ### Bug Fix
17
+ - Fixed an issue that flooded test output with uninitialized string class instance variable `@disable_colorization`
18
+
1
19
  ## 0.2.0 (May 29, 2015)
2
20
 
3
21
  ### Enhancements
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015 NSRR
1
+ Copyright (c) 2016 NSRR
2
2
  https://github.com/nsrr
3
3
 
4
4
 
data/README.md CHANGED
@@ -8,7 +8,7 @@ The official ruby gem built to simplify file downloads and dataset integration t
8
8
 
9
9
  ## Prerequisites
10
10
 
11
- You must have **Ruby 2.0+ installed** on your system to use the NSRR gem.
11
+ You must have **Ruby 2.2+ installed** on your system to use the NSRR gem.
12
12
 
13
13
  - [Install Ruby on Windows](http://rubyinstaller.org/)
14
14
  - [Install Ruby on Mac](https://github.com/remomueller/documentation/blob/master/macosx/140-install-ruby.md)
@@ -24,19 +24,14 @@ Install it yourself as:
24
24
  gem install nsrr --no-ri --no-rdoc
25
25
  ```
26
26
 
27
- Or add this line to your application's Gemfile:
28
-
29
- ```
30
- gem 'nsrr'
31
- ```
32
-
33
- And then execute:
27
+ **NOTE:** There is a bug in newer versions of RubyGems that prevent the NSRR gem
28
+ from running correctly. If you run into issues, downgrade RubyGems using the
29
+ following command:
34
30
 
35
31
  ```console
36
- bundle
32
+ gem update --system 2.4.8 --no-ri --no-rdoc
37
33
  ```
38
34
 
39
-
40
35
  ## Usage
41
36
 
42
37
  ### Download files from a dataset
@@ -200,3 +195,45 @@ nsrr version
200
195
  ```console
201
196
  nsrr help
202
197
  ```
198
+
199
+ ## Common Issues
200
+
201
+ ### Errors Running Ruby in Windows Command Prompt
202
+
203
+ In some cases when using Ruby on Windows through the Command Prompt, it is
204
+ necessary to open the Command Prompt in **administrator mode** for the NSRR gem
205
+ to work. This may be due to how Ruby was installed (for admins only), or the
206
+ location the files are being downloaded to (a root directory C: for example).
207
+
208
+ It is recommended to use the gem without elevated privileges first in any case
209
+ (to download directly to Desktop for example) before using admin privileges for
210
+ the Ruby gem.
211
+
212
+ ### Issue "'method_missing': undefined method 'this'" when running NSRR commands
213
+
214
+ There is a bug in newer versions of RubyGems that prevent the NSRR gem
215
+ from running correctly. If you run into issues, downgrade RubyGems using the
216
+ following command:
217
+
218
+ The following versions of RubyGems cause issues while running NSRR commands:
219
+
220
+ - `2.5.0`
221
+ - `2.5.1`
222
+ - `2.5.2`
223
+ - `2.6.0`
224
+ - `2.6.1`
225
+ - `2.6.2`
226
+
227
+ You can check which version you have installed by typing:
228
+
229
+ ```console
230
+ gem -v
231
+ ```
232
+
233
+ You can fix this error by reverting to the last stable version of RubyGems,
234
+ `2.4.8`.
235
+
236
+ ```console
237
+ gem update --system 2.4.8 --no-ri --no-rdoc
238
+ ```
239
+
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rake/testtask'
2
4
 
3
5
  Rake::TestTask.new(:test) do |t|
@@ -5,6 +7,7 @@ Rake::TestTask.new(:test) do |t|
5
7
  t.libs << 'test'
6
8
  t.pattern = 'test/**/*_test.rb'
7
9
  t.verbose = false
10
+ t.warning = false
8
11
  end
9
12
 
10
13
  task default: :test
data/bin/nsrr CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require File.expand_path('../../lib/nsrr', __FILE__)
4
5
 
data/lib/nsrr.rb CHANGED
@@ -1,17 +1,19 @@
1
- require 'colorize'
1
+ # frozen_string_literal: true
2
2
 
3
- require "nsrr/version"
3
+ require 'colorize'
4
+ require 'nsrr/version'
4
5
 
5
6
  Nsrr::COMMANDS = {
6
7
  'c' => :console,
7
8
  'd' => :download,
8
9
  'u' => :update,
9
10
  'v' => :version
10
- }
11
+ }.freeze
11
12
 
13
+ # Exposes certain commands for access from the command line.
12
14
  module Nsrr
13
15
  def self.launch(argv)
14
- self.send((Nsrr::COMMANDS[argv.first.to_s.scan(/\w/).first] || :help), argv)
16
+ send((Nsrr::COMMANDS[argv.first.to_s.scan(/\w/).first] || :help), argv)
15
17
  end
16
18
 
17
19
  def self.console(argv)
@@ -29,7 +31,7 @@ module Nsrr
29
31
  Nsrr::Commands::Update.start(argv)
30
32
  end
31
33
 
32
- def self.help(argv)
34
+ def self.help(_)
33
35
  puts <<-EOT
34
36
 
35
37
  Usage: nsrr COMMAND [ARGS]
@@ -45,13 +47,12 @@ Commands can be referenced by the first letter:
45
47
  Ex: `nsrr v`, for version
46
48
 
47
49
  EOT
48
- puts "Read more on the download command here:"
49
- puts " " + "https://github.com/nsrr/nsrr-gem".colorize( :blue ).on_white.underline
50
+ puts 'Read more on the download command here:'
51
+ puts ' ' + 'https://github.com/nsrr/nsrr-gem'.colorize(:blue).on_white.underline
50
52
  puts "\n"
51
53
  end
52
54
 
53
- def self.version(argv)
55
+ def self.version(_)
54
56
  puts "Nsrr #{Nsrr::VERSION::STRING}"
55
57
  end
56
-
57
58
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'irb'
2
4
  require 'irb/completion'
3
5
  require 'nsrr/models/all'
4
6
 
5
7
  module Nsrr
6
8
  module Commands
9
+ # Allows console to be started with the NSRR environment.
7
10
  class Console
8
11
  class << self
9
12
  def start(*args)
@@ -13,7 +16,7 @@ module Nsrr
13
16
 
14
17
  attr_reader :console
15
18
 
16
- def initialize(argv)
19
+ def initialize(_argv)
17
20
  ARGV.clear
18
21
  @console = IRB
19
22
  end
@@ -22,7 +25,6 @@ module Nsrr
22
25
  puts "Loading environment (Nsrr #{Nsrr::VERSION::STRING})"
23
26
  @console.start
24
27
  end
25
-
26
28
  end
27
29
  end
28
30
  end
@@ -1,10 +1,13 @@
1
- require 'colorize'
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'colorize'
3
4
  require 'nsrr/models/all'
4
5
  require 'nsrr/helpers/authorization'
5
6
 
6
7
  module Nsrr
7
8
  module Commands
9
+ # Downloads a folder or a file from the NSRR webserver. Folders can be
10
+ # downloaded recursively.
8
11
  class Download
9
12
  class << self
10
13
  def run(*args)
@@ -12,38 +15,35 @@ module Nsrr
12
15
  end
13
16
  end
14
17
 
15
- attr_reader :token, :dataset_slug, :folder, :file_comparison, :depth
18
+ attr_reader :token, :dataset_slug, :full_path, :file_comparison, :depth
16
19
 
17
20
  def initialize(argv)
18
21
  (@token, argv) = parse_parameter_with_value(argv, ['token'], '')
19
22
  (@file_comparison, argv) = parse_parameter(argv, ['fast', 'fresh', 'md5'], 'md5')
20
23
  (@depth, argv) = parse_parameter(argv, ['shallow', 'recursive'], 'recursive')
21
24
  @dataset_slug = argv[1].to_s.split('/').first
22
- @folder = (argv[1].to_s.split('/')[1..-1] || []).join('/')
25
+ @full_path = (argv[1].to_s.split('/')[1..-1] || []).join('/')
23
26
  end
24
27
 
25
28
  # Run with Authorization
26
29
  def run
27
- begin
28
- if @dataset_slug == nil
29
- puts "Please specify a dataset: " + "nsrr download DATASET".colorize(:white)
30
- puts "Read more on the download command here:"
31
- puts " " + "https://github.com/nsrr/nsrr-gem".colorize( :blue ).on_white.underline
30
+ if @dataset_slug.nil?
31
+ puts 'Please specify a dataset: ' + 'nsrr download DATASET'.colorize(:white)
32
+ puts 'Read more on the download command here:'
33
+ puts ' ' + 'https://github.com/nsrr/nsrr-gem'.colorize(:blue).on_white.underline
34
+ else
35
+ @token = Nsrr::Helpers::Authorization.get_token(@token) if @token.to_s == ''
36
+ @dataset = Dataset.find(@dataset_slug, @token)
37
+ if @dataset
38
+ @dataset.download(@full_path, depth: @depth, method: @file_comparison)
32
39
  else
33
- @token = Nsrr::Helpers::Authorization.get_token(@token) if @token.to_s == ''
34
- @dataset = Dataset.find(@dataset_slug, @token)
35
- if @dataset
36
- @dataset.download(@folder, depth: @depth, method: @file_comparison)
37
- else
38
- puts "\nThe dataset " + "#{@dataset_slug}".colorize(:white) + " was not found."
39
- auth_section = (@token.to_s == '' ? '' : "/a/#{@token}" )
40
- datasets = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}#{auth_section}/datasets.json")
41
- puts "Did you mean one of: #{datasets.collect{|d| d['slug'].colorize(:white)}.sort.join(', ')}" if datasets and datasets.size > 0
42
- end
40
+ puts "\nThe dataset " + @dataset_slug.to_s.colorize(:white) + ' was not found.'
41
+ (datasets, _status) = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/datasets.json", auth_token: @token)
42
+ puts "Did you mean one of: #{datasets.collect { |d| d['slug'].colorize(:white)}.sort.join(', ') }" if datasets && datasets.size > 0
43
43
  end
44
- rescue Interrupt
45
- puts "\nINTERRUPTED".colorize(:red)
46
44
  end
45
+ rescue Interrupt
46
+ puts "\nINTERRUPTED".colorize(:red)
47
47
  end
48
48
 
49
49
  private
@@ -1,9 +1,11 @@
1
- require 'colorize'
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'colorize'
3
4
  require 'nsrr/helpers/json_request'
4
5
 
5
6
  module Nsrr
6
7
  module Commands
8
+ # Command to check if there is an updated version of the gem available.
7
9
  class Update
8
10
  class << self
9
11
  def start(*args)
@@ -15,23 +17,21 @@ module Nsrr
15
17
  end
16
18
 
17
19
  def start
18
- json = Nsrr::Helpers::JsonRequest.get("https://rubygems.org/api/v1/gems/nsrr.json")
19
-
20
+ (json, _status) = Nsrr::Helpers::JsonRequest.get('https://rubygems.org/api/v1/gems/nsrr.json')
20
21
  if json
21
22
  if json['version'] == Nsrr::VERSION::STRING
22
- puts "The nsrr gem is " + "up-to-date".colorize(:green) + "!"
23
+ puts 'The nsrr gem is ' + 'up-to-date'.colorize(:green) + '!'
23
24
  else
24
25
  puts
25
26
  puts "A newer version (v#{json['version']}) is available! Type the following command to update:"
26
27
  puts
27
- puts " gem install nsrr --no-ri --no-rdoc".colorize(:white)
28
+ puts ' gem install nsrr --no-ri --no-rdoc'.colorize(:white)
28
29
  puts
29
30
  end
30
31
  else
31
- puts "Unable to connect to RubyGems.org. Please try again later."
32
+ puts 'Unable to connect to RubyGems.org. Please try again later.'
32
33
  end
33
34
  end
34
-
35
35
  end
36
36
  end
37
37
  end
@@ -1,20 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'nsrr/helpers/json_request'
2
4
 
3
5
  module Nsrr
4
6
  module Helpers
7
+ # Helper to verify that user is authenticated.
5
8
  class Authorization
6
9
  def self.get_token(token)
7
- puts " Get your token here: " + "#{Nsrr::WEBSITE}/token".colorize( :blue ).on_white.underline
8
- puts " Your input is hidden while entering token.".colorize(:white)
9
- print " Enter your token: "
10
+ puts ' Get your token here: ' + "#{Nsrr::WEBSITE}/token".colorize(:blue).on_white.underline
11
+ puts ' Your input is hidden while entering token.'.colorize(:white)
12
+ print ' Enter your token: '
10
13
  token = STDIN.noecho(&:gets).chomp if token.to_s.strip == ''
11
-
12
- response = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/account/#{token}/profile.json")
13
-
14
- if response.kind_of?(Hash) and response['authenticated']
15
- puts "AUTHORIZED".colorize(:green) + " as " + "#{response['first_name']} #{response['last_name']}".colorize( :white )
14
+ token.strip!
15
+ (response, _status) = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/api/v1/account/profile.json", auth_token: token)
16
+ if response.is_a?(Hash) && response['authenticated']
17
+ puts 'AUTHORIZED'.colorize(:green) + ' as ' + "#{response['first_name']} #{response['last_name']}".colorize(:white)
16
18
  else
17
- puts "UNAUTHORIZED".colorize(:red) + " Public Access Only"
19
+ puts 'UNAUTHORIZED'.colorize(:red) + ' Public Access Only'
18
20
  end
19
21
  token
20
22
  end
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Nsrr::WEBSITE = "https://sleepdata.org"
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'openssl'
2
4
  require 'net/http'
3
5
  require 'uri'
4
6
 
5
7
  module Nsrr
6
8
  module Helpers
9
+ # Downloads a file to a specified folder.
7
10
  class DownloadRequest
8
11
  class << self
9
12
  def get(*args)
@@ -14,49 +17,44 @@ module Nsrr
14
17
  attr_reader :url, :error, :file_size
15
18
 
16
19
  def initialize(url, download_folder)
17
- begin
18
- escaped_url = URI.escape(url)
19
- @url = URI.parse(escaped_url)
20
- @http = Net::HTTP.new(@url.host, @url.port)
21
- if @url.scheme == 'https'
22
- @http.use_ssl = true
23
- @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
24
- end
25
- @download_folder = download_folder
26
- @file_size = 0
27
- rescue => e
28
- @error = 'Invalid Token'
20
+ escaped_url = URI.escape(url)
21
+ @url = URI.parse(escaped_url)
22
+ @http = Net::HTTP.new(@url.host, @url.port)
23
+ if @url.scheme == 'https'
24
+ @http.use_ssl = true
25
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
29
26
  end
27
+ @download_folder = download_folder
28
+ @file_size = 0
29
+ rescue
30
+ @error = 'Invalid Token'
30
31
  end
31
32
 
32
33
  # Writes file segments to disk immediately instead of storing in memory
33
34
  def get
35
+ return unless @error.nil?
34
36
  local_file = ::File.open(@download_folder, 'wb')
35
- begin
36
- partial = true
37
- @http.request_get(@url.path) do |response|
38
- case response.code when '200'
39
- response.read_body do |segment|
40
- local_file.write(segment)
41
- end
42
- @file_size = ::File.size(@download_folder)
43
- partial = false
44
- when '302'
45
- @error = 'Token Not Authorized to Access Specified File'
46
- else
47
- @error = "#{response.code} #{response.class.name}"
37
+ partial = true
38
+ @http.request_get(@url.path) do |response|
39
+ case response.code
40
+ when '200'
41
+ response.read_body do |segment|
42
+ local_file.write(segment)
48
43
  end
44
+ @file_size = ::File.size(@download_folder)
45
+ partial = false
46
+ when '302'
47
+ @error = 'Token Not Authorized to Access Specified File'
48
+ else
49
+ @error = "#{response.code} #{response.class.name}"
49
50
  end
50
- rescue => e # Net::ReadTimeout, SocketError
51
- @error = "(#{e.class}) #{e.message}"
52
- ensure
53
- local_file.close()
54
- ::File.delete(@download_folder) if partial and ::File.exist?(@download_folder)
55
51
  end
52
+ rescue => e # Net::ReadTimeout, SocketError
53
+ @error = "(#{e.class}) #{e.message}"
54
+ ensure
55
+ local_file.close if local_file
56
+ ::File.delete(@download_folder) if partial && ::File.exist?(@download_folder)
56
57
  end
57
-
58
58
  end
59
59
  end
60
60
  end
61
-
62
-
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nsrr
2
4
  module Helpers
5
+ # Converts hash with string keys into hash with keys as symbols.
3
6
  class HashHelper
4
7
  def self.symbolize_keys(hash)
5
8
  hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
@@ -1,43 +1,93 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'openssl'
2
4
  require 'net/http'
3
5
  require 'json'
6
+ require 'cgi'
4
7
 
5
8
  module Nsrr
6
9
  module Helpers
10
+ # Aids in generating JSON requests for GET, POST, and PATCH.
7
11
  class JsonRequest
8
12
  class << self
9
- def get(*args)
10
- new(*args).get
13
+ def get(url, *args)
14
+ new(url, *args).get
15
+ end
16
+
17
+ def post(url, *args)
18
+ new(url, *args).post
19
+ end
20
+
21
+ def patch(url, *args)
22
+ new(url, *args).patch
11
23
  end
12
24
  end
13
25
 
14
26
  attr_reader :url
15
27
 
16
- def initialize(url)
17
- begin
18
- @url = URI.parse(url)
19
- @http = Net::HTTP.new(@url.host, @url.port)
20
- if @url.scheme == 'https'
21
- @http.use_ssl = true
22
- @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
23
- end
24
- rescue
28
+ def initialize(url, args = {})
29
+ @params = nested_hash_to_params(args)
30
+ @url = URI.parse(url)
31
+
32
+ @http = Net::HTTP.new(@url.host, @url.port)
33
+ if @url.scheme == 'https'
34
+ @http.use_ssl = true
35
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
25
36
  end
37
+ rescue
38
+ @error = "Invalid URL: #{url.inspect}"
39
+ puts @error.colorize(:red)
26
40
  end
27
41
 
28
42
  def get
29
- begin
30
- req = Net::HTTP::Get.new(@url.path)
31
- response = @http.start do |http|
32
- http.request(req)
43
+ return unless @error.nil?
44
+ full_path = @url.path
45
+ query = ([@url.query] + @params).flatten.compact.join('&')
46
+ full_path += "?#{query}" if query.to_s != ''
47
+ response = @http.start do |http|
48
+ http.get(full_path)
49
+ end
50
+ [JSON.parse(response.body), response]
51
+ rescue => e
52
+ puts "GET Error: #{e}".colorize(:red)
53
+ end
54
+
55
+ def post
56
+ return unless @error.nil?
57
+ response = @http.start do |http|
58
+ http.post(@url.path, @params.flatten.compact.join('&'))
59
+ end
60
+ [JSON.parse(response.body), response]
61
+ rescue => e
62
+ puts "POST ERROR: #{e}".colorize(:red)
63
+ nil
64
+ end
65
+
66
+ def patch
67
+ @params << '_method=patch'
68
+ post
69
+ end
70
+
71
+ def nested_hash_to_params(args)
72
+ args.collect do |key, value|
73
+ key_value_to_string(key, value, nil)
74
+ end
75
+ end
76
+
77
+ def key_value_to_string(key, value, scope = nil)
78
+ current_scope = (scope ? "#{scope}[#{key}]" : key)
79
+ if value.is_a? Hash
80
+ value.collect do |k,v|
81
+ key_value_to_string(k, v, current_scope)
82
+ end.join('&')
83
+ elsif value.is_a? Array
84
+ value.collect do |v|
85
+ key_value_to_string('', v, current_scope)
33
86
  end
34
- JSON.parse(response.body)
35
- rescue
36
- nil
87
+ else
88
+ "#{current_scope}=#{CGI.escape(value.to_s)}"
37
89
  end
38
90
  end
39
91
  end
40
92
  end
41
93
  end
42
-
43
-
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'nsrr/models/dataset'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'colorize'
2
4
  require 'fileutils'
3
5
  require 'irb'
@@ -12,10 +14,11 @@ require 'nsrr/models/file'
12
14
 
13
15
  module Nsrr
14
16
  module Models
17
+ # Allows dataset and dataset file information to be retrieved, as well as
18
+ # allowing dataset files to be downloaded.
15
19
  class Dataset
16
20
  def self.find(slug, token = nil)
17
- auth_section = (token.to_s == '' ? '' : "/a/#{token}")
18
- json = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}#{auth_section}/datasets/#{slug}.json")
21
+ (json, _status) = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/api/v1/datasets/#{slug}.json", auth_token: token)
19
22
  if json
20
23
  new(json, token)
21
24
  else
@@ -31,18 +34,20 @@ module Nsrr
31
34
  @name = json['name']
32
35
  @files = {}
33
36
  @download_token = token
37
+ @downloaded_folders = []
34
38
  end
35
39
 
36
40
  def files(path = nil)
37
41
  @files[path] ||= begin
38
- auth_section = (@download_token.to_s == '' ? '' : "/a/#{@download_token}" )
39
- json = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/datasets/#{@slug}#{auth_section}/json_manifest/#{path}")
40
- (json || []).collect{|file_json| Nsrr::Models::File.new(file_json)}
42
+ url = "#{Nsrr::WEBSITE}/api/v1/datasets/#{@slug}/files.json"
43
+ params = { auth_token: @download_token, path: path }
44
+ (json, _status) = Nsrr::Helpers::JsonRequest.get(url, params)
45
+ (json || []).collect { |file_json| Nsrr::Models::File.new(file_json) }
41
46
  end
42
47
  end
43
48
 
44
49
  def folders(path = nil)
45
- self.files(path).select{|f| !f.is_file}.collect{|f| f.name}
50
+ files(path).select { |f| !f.is_file }.collect(&:file_name)
46
51
  end
47
52
 
48
53
  # Options include:
@@ -53,7 +58,7 @@ module Nsrr
53
58
  # depth:
54
59
  # 'recursive' => [default] Downloads files in selected path folder and all subfolders
55
60
  # 'shallow' => Only downloads files in selected path folder
56
- def download(path = nil, *args)
61
+ def download(full_path = nil, *args)
57
62
  options = Nsrr::Helpers::HashHelper.symbolize_keys(args.first || {})
58
63
  options[:method] ||= 'md5'
59
64
  options[:depth] ||= 'recursive'
@@ -64,16 +69,16 @@ module Nsrr
64
69
  @files_failed = 0
65
70
 
66
71
  begin
67
- puts " File Check: " + options[:method].to_s.colorize(:white)
68
- puts " Depth: " + options[:depth].to_s.colorize(:white)
69
- puts ""
70
- if @download_token == nil
72
+ puts ' File Check: ' + options[:method].to_s.colorize(:white)
73
+ puts ' Depth: ' + options[:depth].to_s.colorize(:white)
74
+ puts ''
75
+ if @download_token.nil?
71
76
  @download_token = Nsrr::Helpers::Authorization.get_token(@download_token)
72
77
  end
73
78
 
74
79
  @start_time = Time.now
75
80
 
76
- download_helper(path, options)
81
+ download_helper(full_path, options)
77
82
  rescue Interrupt, IRB::Abort
78
83
  puts "\n Interrupted".colorize(:red)
79
84
  end
@@ -81,21 +86,25 @@ module Nsrr
81
86
  @downloaded_megabytes = @downloaded_bytes / (1024 * 1024)
82
87
 
83
88
  puts "\nFinished in #{Time.now - @start_time} seconds." if @start_time
84
- puts "\n#{@folders_created} folder#{"s" if @folders_created != 1} created".colorize(:white) + ", " +
85
- "#{@files_downloaded} file#{"s" if @files_downloaded != 1} downloaded".colorize(:green) + ", " +
86
- "#{@downloaded_megabytes} MiB#{"s" if @downloaded_megabytes != 1} downloaded".colorize(:green) + ", " +
87
- "#{@files_skipped} file#{"s" if @files_skipped != 1} skipped".colorize(:light_blue) + ", " +
88
- "#{@files_failed} file#{"s" if @files_failed != 1} failed".colorize(:red) + "\n\n"
89
+ puts "\n#{@folders_created} folder#{'s' if @folders_created != 1} created".colorize(:white) + ', ' +
90
+ "#{@files_downloaded} file#{'s' if @files_downloaded != 1} downloaded".colorize(:green) + ', ' +
91
+ "#{@downloaded_megabytes} MiB#{'s' if @downloaded_megabytes != 1} downloaded".colorize(:green) + ', ' +
92
+ "#{@files_skipped} file#{'s' if @files_skipped != 1} skipped".colorize(:light_blue) + ', ' +
93
+ "#{@files_failed} file#{'s' if @files_failed != 1} failed".colorize(@files_failed == 0 ? :white : :red) + "\n\n"
89
94
  nil
90
95
  end
91
96
 
92
- def download_helper(path, options)
93
- current_folder = ::File.join(self.slug.to_s, path.to_s)
94
- create_folder(current_folder) if self.files(path).count > 0
97
+ def download_helper(full_path, options)
98
+ return if @downloaded_folders.include?(full_path)
99
+ @downloaded_folders << full_path
100
+
101
+ create_folder_for_path(full_path)
95
102
 
96
- self.files(path).select{|f| f.is_file}.each do |file|
103
+ files(full_path).select(&:is_file).each do |file|
104
+ current_folder = ::File.join(slug.to_s, file.folder.to_s)
97
105
  result = file.download(options[:method], current_folder, @download_token)
98
- case result when 'fail'
106
+ case result
107
+ when 'fail'
99
108
  @files_failed += 1
100
109
  when 'skip'
101
110
  @files_skipped += 1
@@ -104,21 +113,25 @@ module Nsrr
104
113
  @downloaded_bytes += result
105
114
  end
106
115
  end
107
-
108
116
  if options[:depth] == 'recursive'
109
- self.files(path).select{|f| !f.is_file}.each do |file|
110
- folder = [path, file.name].compact.join('/')
111
- self.download_helper(folder, options)
117
+ files(full_path).reject(&:is_file).each do |file|
118
+ download_helper(file.full_path, options)
112
119
  end
113
120
  end
114
121
  end
115
122
 
123
+ def create_folder_for_path(full_path)
124
+ files(full_path).collect(&:folder).uniq.each do |folder|
125
+ current_folder = ::File.join(slug.to_s, folder.to_s)
126
+ create_folder(current_folder)
127
+ end
128
+ end
129
+
116
130
  def create_folder(folder)
117
- puts " create".colorize(:white) + " #{folder}"
131
+ puts ' create'.colorize(:white) + " #{folder}"
118
132
  FileUtils.mkdir_p folder
119
133
  @folders_created += 1
120
134
  end
121
-
122
135
  end
123
136
  end
124
137
  end
@@ -1,22 +1,25 @@
1
- # Models a downloadable file or folder
2
- require 'digest/md5'
1
+ # frozen_string_literal: true
3
2
 
3
+ require 'digest/md5'
4
4
  require 'nsrr/helpers/constants'
5
5
  require 'nsrr/helpers/download_request'
6
6
 
7
7
  module Nsrr
8
8
  module Models
9
+ # Models a downloadable file or folder
9
10
  class File
10
- attr_reader :name, :is_file, :web_file_size, :web_checksum
11
+ attr_reader :dataset_slug, :full_path, :folder, :file_name, :is_file, :file_size, :file_checksum_md5, :archived
11
12
 
12
13
  def initialize(json = {})
13
- @name = json['file_name']
14
- @web_checksum = json['checksum']
15
- @is_file = json['is_file']
16
- @web_file_size = json['file_size']
17
14
  @dataset_slug = json['dataset']
18
- @file_path = json['file_path']
19
- @latest_checksum = ""
15
+ @full_path = json['full_path']
16
+ @folder = json['folder']
17
+ @file_name = json['file_name']
18
+ @is_file = json['is_file']
19
+ @file_size = json['file_size']
20
+ @file_checksum_md5 = json['file_checksum_md5']
21
+ @archived = json['archived']
22
+ @latest_checksum = ''
20
23
  @latest_file_size = -1
21
24
  end
22
25
 
@@ -51,78 +54,73 @@ module Nsrr
51
54
  # If the file check fails, the file is downloaded a second time and rechecked.
52
55
  # If the second download and check fail, the file is marked as failed, and the downloader continues to the subsequent file.
53
56
  def force_download(path, token, method)
54
- download_folder = ::File.join(Dir.pwd, path.to_s, @name.to_s)
57
+ download_folder = ::File.join(Dir.pwd, path.to_s, @file_name.to_s)
55
58
  auth_section = (token.to_s == '' ? '' : "/a/#{token}")
56
- download_url = "#{Nsrr::WEBSITE}/datasets/#{@dataset_slug}/files#{auth_section}/m/nsrr-gem-v#{Nsrr::VERSION::STRING.gsub('.', '-')}/#{@file_path.to_s}"
59
+ download_url = "#{Nsrr::WEBSITE}/datasets/#{@dataset_slug}/files#{auth_section}/m/nsrr-gem-v#{Nsrr::VERSION::STRING.gsub('.', '-')}/#{@full_path.to_s}"
57
60
  download_request = Nsrr::Helpers::DownloadRequest.new(download_url, download_folder)
58
61
  download_request.get
59
-
60
62
  download_success = false
61
-
62
63
  if download_request.error.to_s == ''
63
64
  # Check to see if the file downloaded correctly
64
65
  # If the file size doesn't match, attempt one additional download
65
66
  download_success = did_download_succeed?(method, path)
66
-
67
67
  unless download_success
68
68
  download_request = Nsrr::Helpers::DownloadRequest.new(download_url, download_folder)
69
69
  download_request.get
70
-
71
70
  download_success = did_download_succeed?(method, path)
72
71
  end
73
72
  end
74
-
75
73
  if download_request.error.to_s == '' and download_success
76
- puts " downloaded".colorize(:green) + " #{@name}"
74
+ puts " downloaded".colorize(:green) + " #{@file_name}"
77
75
  download_request.file_size
78
76
  elsif download_request.error.to_s == ''
79
- puts " failed".colorize(:red) + " #{@name}"
77
+ puts " failed".colorize(:red) + " #{@file_name}"
80
78
  if method == 'fast'
81
- puts " File size mismatch, expected: #{@web_file_size}"
79
+ puts " File size mismatch, expected: #{@file_size}"
82
80
  puts " actual: #{@latest_file_size}"
83
81
  else
84
- puts " File checksum mismatch, expected: #{@web_checksum}"
82
+ puts " File checksum mismatch, expected: #{@file_checksum_md5}"
85
83
  puts " actual: #{@latest_checksum}"
86
84
  end
87
85
  ::File.delete(download_folder) if ::File.exist?(download_folder)
88
86
  'fail'
89
87
  else
90
- puts " failed".colorize(:red) + " #{@name}"
88
+ puts ' failed'.colorize(:red) + " #{@file_name}"
91
89
  puts " #{download_request.error}"
92
90
  'fail'
93
91
  end
94
92
  end
95
93
 
96
94
  def skip
97
- puts " identical".colorize(:light_blue) + " #{self.name}"
95
+ puts ' identical'.colorize(:light_blue) + " #{file_name}"
98
96
  'skip'
99
97
  end
100
98
 
101
99
  def md5_matches?(path)
102
- @web_checksum == local_checksum(path)
100
+ @file_checksum_md5 == local_checksum(path)
103
101
  end
104
102
 
105
103
  def local_checksum(path)
106
- download_folder = ::File.join(Dir.pwd, path.to_s, self.name.to_s)
104
+ download_folder = ::File.join(Dir.pwd, path.to_s, file_name.to_s)
107
105
  @latest_checksum = if ::File.exist?(download_folder)
108
- Digest::MD5.file(download_folder).hexdigest
109
- else
110
- ""
111
- end
106
+ Digest::MD5.file(download_folder).hexdigest
107
+ else
108
+ ''
109
+ end
112
110
  @latest_checksum
113
111
  end
114
112
 
115
113
  def file_size_matches?(path)
116
- @web_file_size == local_filesize(path)
114
+ @file_size == local_filesize(path)
117
115
  end
118
116
 
119
117
  def local_filesize(path)
120
- download_folder = ::File.join(Dir.pwd, path.to_s, self.name.to_s)
118
+ download_folder = ::File.join(Dir.pwd, path.to_s, file_name.to_s)
121
119
  @latest_file_size = if ::File.exist?(download_folder)
122
- ::File.size(download_folder)
123
- else
124
- -1
125
- end
120
+ ::File.size(download_folder)
121
+ else
122
+ -1
123
+ end
126
124
  @latest_file_size
127
125
  end
128
126
 
@@ -133,8 +131,6 @@ module Nsrr
133
131
  md5_matches?(path)
134
132
  end
135
133
  end
136
-
137
134
  end
138
135
  end
139
136
  end
140
-
data/lib/nsrr/version.rb CHANGED
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nsrr
2
4
  module VERSION #:nodoc:
3
5
  MAJOR = 0
4
- MINOR = 2
6
+ MINOR = 3
5
7
  TINY = 0
6
- BUILD = nil # "pre", "rc", "rc2", nil
8
+ BUILD = 'beta1' # 'pre', 'beta1', 'beta2', 'rc', 'rc2', nil
7
9
 
8
10
  STRING = [MAJOR, MINOR, TINY, BUILD].compact.join('.')
9
11
  end
data/nsrr.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  # Compiling the Gem
4
5
  # gem build nsrr.gemspec
@@ -12,24 +13,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
12
13
  require 'nsrr/version'
13
14
 
14
15
  Gem::Specification.new do |spec|
15
- spec.name = "nsrr"
16
+ spec.name = 'nsrr'
16
17
  spec.version = Nsrr::VERSION::STRING
17
- spec.authors = ["Remo Mueller"]
18
- spec.email = ["remosm@gmail.com"]
19
- spec.summary = %q{The official ruby gem to simplify file downloads and dataset integration tasks for the NSRR website, https://sleepdata.org}
20
- spec.description = %q{The official ruby gem to simplify file downloads and dataset integration tasks for the NSRR website, https://sleepdata.org}
21
- spec.homepage = "https://github.com/nsrr/nsrr-gem"
22
- spec.license = "CC BY-NC-SA 3.0"
18
+ spec.authors = ['Remo Mueller']
19
+ spec.email = ['remosm@gmail.com']
20
+ spec.summary = 'The official ruby gem to simplify file downloads and dataset integration tasks for the NSRR website, https://sleepdata.org'
21
+ spec.description = 'The official ruby gem to simplify file downloads and dataset integration tasks for the NSRR website, https://sleepdata.org'
22
+ spec.homepage = 'https://github.com/nsrr/nsrr-gem'
23
+ spec.license = 'CC BY-NC-SA 3.0'
23
24
 
24
25
  spec.files = Dir['{bin,lib}/**/*'] + ['CHANGELOG.md', 'LICENSE', 'Rakefile', 'README.md', 'nsrr.gemspec']
25
26
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
26
27
  spec.test_files = spec.files.grep(%r{^(test)/})
27
- spec.require_paths = ["lib"]
28
+ spec.require_paths = ['lib']
28
29
 
29
- spec.add_dependency "rake"
30
- spec.add_dependency "minitest"
31
- spec.add_dependency "minitest-reporters"
32
- spec.add_dependency "colorize", "~> 0.7.3"
33
-
34
- spec.add_development_dependency "bundler", "~> 1.6"
30
+ spec.add_dependency 'bundler', '~> 1.11'
31
+ spec.add_dependency 'rake'
32
+ spec.add_dependency 'minitest'
33
+ spec.add_dependency 'colorize', '~> 0.7.7'
35
34
  end
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nsrr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Remo Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-29 00:00:00.000000000 Z
11
+ date: 2016-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.11'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.11'
27
27
  - !ruby/object:Gem::Dependency
28
- name: minitest
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest-reporters
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -58,28 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.7.3
61
+ version: 0.7.7
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.7.3
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.6'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.6'
68
+ version: 0.7.7
83
69
  description: The official ruby gem to simplify file downloads and dataset integration
84
70
  tasks for the NSRR website, https://sleepdata.org
85
71
  email:
@@ -123,12 +109,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
109
  version: '0'
124
110
  required_rubygems_version: !ruby/object:Gem::Requirement
125
111
  requirements:
126
- - - ">="
112
+ - - ">"
127
113
  - !ruby/object:Gem::Version
128
- version: '0'
114
+ version: 1.3.1
129
115
  requirements: []
130
116
  rubyforge_project:
131
- rubygems_version: 2.4.6
117
+ rubygems_version: 2.4.8
132
118
  signing_key:
133
119
  specification_version: 4
134
120
  summary: The official ruby gem to simplify file downloads and dataset integration