nsrr 0.2.0 → 0.3.0.beta1

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: 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