spout 0.11.0.beta1 → 0.11.0.beta2

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: 35179a9011f963b875618eeb8fd07854c58f9cce
4
- data.tar.gz: 321e836a1a80d07092e0bbe5d921f712db8dcb18
3
+ metadata.gz: a7a873eabc85e3035b8e784628e510d8e976f15b
4
+ data.tar.gz: 90c06d0bac0ef4c772c82da29760d4007591407b
5
5
  SHA512:
6
- metadata.gz: d811aca192cc49aa05a8fc5dd5c4f1523f977b0fc2eb0e56c6f6ed5cd7f8295d73b69ccd93382183d3199c84986dff828c1faa611a39038b2b2bcb32ef14405f
7
- data.tar.gz: 9ba01d7cb5f51f977b9433a8186f69241585bbba0eb2beb238c7794fe3c1eaa548da3450d527692747a950786ca02f609dad7e90058bc539a28ec371fbe4a521
6
+ metadata.gz: a7cee73fe2aa1bec7762300e8fe24c29462a6db61fa7149bd81274950e5da9ef3071602718f061db7d603db52a5ad56ed97f2377620a08ac96144f4dfc75f2cb
7
+ data.tar.gz: 9c9038e3ea7ff18eae3485622f11d12f8523e656d331ad9274d969c7c70863cf63ad0b729e76ec5b1de7cbf2c6f59fcd946a2312d9a5602ca2c52ddf1c9ef809
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Division of Medicine Program of Sleep Medicine Epidemiology
1
+ Copyright (c) 2016 Division of Medicine Program of Sleep Medicine Epidemiology
2
2
  https://github.com/sleepepi
3
3
 
4
4
 
data/README.md CHANGED
@@ -144,8 +144,8 @@ class DictionaryTest < Minitest::Test
144
144
 
145
145
  VALID_UNITS = ['minutes', 'hours']
146
146
 
147
- @variables.select{|v| v.type == 'numeric' or v.type == 'integer'}.each do |variable|
148
- define_method("test_valid_units: "+variable.path) do
147
+ @variables.select { |v| %w(numeric integer).include?(v.type) }.each do |variable|
148
+ define_method("test_units: #{variable.path}") do
149
149
  puts variable.class
150
150
  # => Spout::Models::Variable
151
151
  assert VALID_UNITS.include?(variable.units)
@@ -165,8 +165,8 @@ class DictionaryTest < Minitest::Test
165
165
  # iterators that can be used to write custom tests
166
166
  include Spout::Helpers::Iterators
167
167
 
168
- @variables.select{|v| ['numeric','integer'].include?(v.type)}.each do |variable|
169
- define_method("test_at_least_two_labels: "+variable.path) do
168
+ @variables.select { |v| %w(numeric integer).include?(v.type) }.each do |variable|
169
+ define_method("test_at_least_two_labels: #{variable.path}") do
170
170
  assert_operator 2, :<=, variable.labels.size
171
171
  end
172
172
  end
@@ -8,6 +8,7 @@ require 'spout/helpers/quietly'
8
8
  require 'spout/helpers/send_file'
9
9
  require 'spout/helpers/semantic'
10
10
  require 'spout/helpers/json_request'
11
+ require 'spout/helpers/json_request_generic'
11
12
 
12
13
  # - **User Authorization**
13
14
  # - User authenticates via token, the user must be a dataset editor
@@ -48,10 +49,13 @@ module Spout
48
49
  @version = version
49
50
  @skip_checks = !(argv.delete('--skip-checks').nil? && argv.delete('--no-checks').nil?)
50
51
 
51
- @skip_graphs = !(argv.delete('--skip-graphs').nil? && argv.delete('--no-graphs').nil?)
52
- @skip_csvs = !(argv.delete('--skip-csvs').nil? && argv.delete('--no-csvs').nil?)
52
+ @skip_variables = !(argv.delete('--skip-variables').nil? && argv.delete('--no-variables').nil?)
53
+ @skip_dataset = !(argv.delete('--skip-dataset').nil? && argv.delete('--no-dataset').nil?)
54
+ @skip_dictionary = !(argv.delete('--skip-dictionary').nil? && argv.delete('--no-dictionary').nil?)
55
+ @skip_documentation = !(argv.delete('--skip-documentation').nil? && argv.delete('--no-documentation').nil?)
53
56
  @clean = !(argv.delete('--no-resume').nil? && argv.delete('--clean').nil?)
54
- @skip_server_updates = !(argv.delete('--skip-server-updates').nil? && argv.delete('--no-server-updates').nil?)
57
+ @skip_server_scripts = !(argv.delete('--skip-server-scripts').nil? && argv.delete('--no-server-scripts').nil?)
58
+ @archive_only = !(argv.delete('--archive-only').nil?)
55
59
 
56
60
  token_arg = argv.find { |arg| /^--token=/ =~ arg }
57
61
  argv.delete(token_arg)
@@ -61,13 +65,10 @@ module Spout
61
65
  argv.delete(rows_arg)
62
66
  @number_of_rows = rows_arg.gsub(/--rows=/, '').to_i if rows_arg
63
67
 
64
- # puts "token_arg: #{token_arg}".colorize(:red)
65
- # puts "@token: #{@token}".colorize(:red)
66
- # puts "rows_arg: #{rows_arg}".colorize(:red)
67
- # puts "@number_of_rows: #{@number_of_rows}".colorize(:red)
68
-
69
68
  @argv = argv
70
69
 
70
+ @created_folders = []
71
+
71
72
  begin
72
73
  run_all
73
74
  rescue Interrupt
@@ -77,28 +78,19 @@ module Spout
77
78
 
78
79
  def run_all
79
80
  config_file_load
80
- version_check unless @skip_checks
81
- test_check unless @skip_checks
81
+ version_check
82
+ test_check
82
83
  user_authorization
83
- load_subjects_from_csvs unless @skip_graphs
84
- graph_generation unless @skip_graphs
85
- dataset_uploads unless @skip_csvs
86
- data_dictionary_uploads unless @skip_csvs
87
- markdown_uploads unless @skip_csvs
88
- trigger_server_updates unless @skip_server_updates
84
+ upload_variables
85
+ dataset_uploads
86
+ data_dictionary_uploads
87
+ markdown_uploads
88
+ trigger_server_updates
89
+ set_default_dataset_version
89
90
  rescue DeployError
90
91
  # Nothing on Deploy Error
91
92
  end
92
93
 
93
- def load_subjects_from_csvs
94
- @dictionary_root = Dir.pwd
95
- @variable_files = Dir.glob(File.join(@dictionary_root, 'variables', '**', '*.json'))
96
-
97
- @subject_loader = Spout::Helpers::SubjectLoader.new(@variable_files, [], @version, @number_of_rows, @config.visit)
98
- @subject_loader.load_subjects_from_csvs!
99
- @subjects = @subject_loader.subjects
100
- end
101
-
102
94
  def config_file_load
103
95
  print ' `.spout.yml` Check: '
104
96
  @config = Spout::Helpers::ConfigReader.new
@@ -142,6 +134,11 @@ module Spout
142
134
  # - `CHANGELOG.md` top line should include version, ex: `## 0.1.0`
143
135
  # - "v#{VERSION}" matches HEAD git tag annotation
144
136
  def version_check
137
+ if @skip_checks
138
+ puts ' Version Check: ' + 'SKIP'.colorize(:blue)
139
+ return
140
+ end
141
+
145
142
  stdout = quietly do
146
143
  `git status --porcelain`
147
144
  end
@@ -179,6 +176,11 @@ module Spout
179
176
  end
180
177
 
181
178
  def test_check
179
+ if @skip_checks
180
+ puts ' Spout Tests: ' + 'SKIP'.colorize(:blue)
181
+ return
182
+ end
183
+
182
184
  print " Spout Tests: "
183
185
 
184
186
  stdout = quietly do
@@ -192,7 +194,7 @@ module Spout
192
194
  failure message
193
195
  end
194
196
 
195
- puts " Spout Coverage: " + "SKIP".colorize(:blue)
197
+ puts ' Spout Coverage: ' + 'SKIP'.colorize(:blue)
196
198
  end
197
199
 
198
200
  def user_authorization
@@ -207,43 +209,69 @@ module Spout
207
209
  else
208
210
  puts 'UNAUTHORIZED'.colorize(:red)
209
211
  puts "#{INDENT}You are not set as an editor on the #{@slug} dataset or you mistyped your token."
210
- raise DeployError
212
+ fail DeployError
211
213
  end
212
214
 
213
215
  # failure ''
214
216
  # puts 'PASS'.colorize(:green)
215
217
  end
216
218
 
219
+ def upload_variables
220
+ if @skip_variables
221
+ puts ' Upload Variables: ' + 'SKIP'.colorize(:blue)
222
+ return
223
+ end
224
+ load_subjects_from_csvs
225
+ graph_generation
226
+ end
227
+
228
+ def load_subjects_from_csvs
229
+ @dictionary_root = Dir.pwd
230
+ @variable_files = Dir.glob(File.join(@dictionary_root, 'variables', '**', '*.json'))
231
+ @subject_loader = Spout::Helpers::SubjectLoader.new(@variable_files, [], @version, @number_of_rows, @config.visit)
232
+ @subject_loader.load_subjects_from_csvs!
233
+ @subjects = @subject_loader.subjects
234
+ end
235
+
217
236
  def graph_generation
218
237
  # failure ''
219
238
  require 'spout/commands/graphs'
220
239
  @argv << '--clean' if @clean
221
240
  Spout::Commands::Graphs.new(@argv, @version, true, @url, @slug, @token, @webserver_name, @subjects)
222
- puts "\r Graph Generation: " + 'DONE '.colorize(:green)
241
+ puts "\r Upload Variables: " + 'DONE '.colorize(:green)
223
242
  end
224
243
 
225
244
  def dataset_uploads
226
- available_folders = (Dir.exist?('csvs') ? Dir.entries('csvs').select { |e| File.directory? File.join('csvs', e) }.reject { |e| ['.', '..'].include?(e) }.sort : [])
227
- semantic = Spout::Helpers::Semantic.new(@version, available_folders)
228
- csv_directory = semantic.selected_folder
229
-
230
- if @version != csv_directory
231
- puts "\r Dataset Uploads: " + "SKIPPED - #{csv_directory} CSV dataset already on server".colorize(:blue)
245
+ if @skip_dataset
246
+ puts ' Dataset Uploads: ' + 'SKIP'.colorize(:blue)
232
247
  return
233
248
  end
234
249
 
250
+ available_folders = (Dir.exist?('csvs') ? Dir.entries('csvs').select { |e| File.directory? File.join('csvs', e) }.reject { |e| ['.', '..'].include?(e) }.sort : [])
251
+ semantic = Spout::Helpers::Semantic.new(@version, available_folders)
252
+ csv_directory = semantic.selected_folder
235
253
  csv_files = Dir.glob("csvs/#{csv_directory}/**/*.csv")
236
254
 
237
255
  csv_files.each_with_index do |csv_file, index|
238
256
  print "\r Dataset Uploads: " + "#{index + 1} of #{csv_files.count}".colorize(:green)
239
- folder = csv_file.gsub(/^csvs/, '').gsub(/#{File.basename(csv_file)}$/, '')
240
- response = Spout::Helpers::SendFile.post("#{@url}/api/v1/dictionary/upload_dataset_csv.json", csv_file, @version, @token, @slug, folder)
257
+ folder = csv_file.gsub(%r{^csvs/#{csv_directory}}, '').gsub(/#{File.basename(csv_file)}$/, '')
258
+ folder = folder.gsub(%r{/$}, '')
259
+ @created_folders << "datasets#{folder}"
260
+ @created_folders << 'datasets/archive'
261
+ @created_folders << "datasets/archive/#{@version}#{folder}"
262
+ upload_file(csv_file, "datasets#{folder}") unless @archive_only
263
+ upload_file(csv_file, "datasets/archive/#{@version}#{folder}")
241
264
  end
242
- puts "\r Dataset Uploads: " + "DONE ".colorize(:green)
265
+ puts "\r Dataset Uploads: " + 'DONE '.colorize(:green)
243
266
  end
244
267
 
245
268
  def data_dictionary_uploads
246
- print ' Dictionary Uploads:'
269
+ if @skip_dictionary
270
+ puts ' Dictionary Uploads: ' + 'SKIP'.colorize(:blue)
271
+ return
272
+ end
273
+
274
+ print ' Dictionary Uploads:'
247
275
 
248
276
  require 'spout/commands/exporter'
249
277
  Spout::Commands::Exporter.new(@version, ['--quiet'])
@@ -251,44 +279,75 @@ module Spout
251
279
  csv_files = Dir.glob("dd/#{@version}/*.csv")
252
280
  csv_files.each_with_index do |csv_file, index|
253
281
  print "\r Dictionary Uploads: " + "#{index + 1} of #{csv_files.count}".colorize(:green)
254
- response = Spout::Helpers::SendFile.post("#{@url}/api/v1/dictionary/upload_dataset_csv.json", csv_file, @version, @token, @slug, nil)
282
+ @created_folders << 'datasets'
283
+ @created_folders << 'datasets/archive'
284
+ @created_folders << "datasets/archive/#{@version}"
285
+ upload_file(csv_file, 'datasets') unless @archive_only
286
+ upload_file(csv_file, "datasets/archive/#{@version}")
255
287
  end
256
288
  puts "\r Dictionary Uploads: " + 'DONE '.colorize(:green)
257
289
  end
258
290
 
259
291
  def markdown_uploads
260
- print 'Documentation Uploads:'
292
+ if @skip_documentation
293
+ puts 'Documentation Uploads: ' + 'SKIP'.colorize(:blue)
294
+ return
295
+ end
296
+
297
+ print 'Documentation Uploads:'
261
298
  markdown_files = Dir.glob(%w(CHANGELOG.md KNOWNISSUES.md))
262
299
  markdown_files.each_with_index do |markdown_file, index|
263
300
  print "\rDocumentation Uploads: " + "#{index + 1} of #{markdown_files.count}".colorize(:green)
264
- Spout::Helpers::SendFile.post("#{@url}/api/v1/dictionary/upload_dataset_csv.json", markdown_file, @version, @token, @slug, nil)
301
+ @created_folders << 'datasets'
302
+ @created_folders << 'datasets/archive'
303
+ @created_folders << "datasets/archive/#{@version}"
304
+ upload_file(markdown_file, 'datasets') unless @archive_only
305
+ upload_file(markdown_file, "datasets/archive/#{@version}")
265
306
  end
266
307
  puts "\rDocumentation Uploads: " + 'DONE '.colorize(:green)
267
308
  end
268
309
 
269
310
  def trigger_server_updates
311
+ if @skip_server_scripts
312
+ puts 'Launch Server Scripts: ' + 'SKIP'.colorize(:blue)
313
+ return
314
+ end
315
+
270
316
  print 'Launch Server Scripts: '
271
- response = Spout::Helpers::JsonRequest.get("#{@url}/datasets/#{@slug}/a/#{@token}/refresh_dictionary.json?version=#{@version}")
317
+ params = { auth_token: @token, dataset: @slug, version: @version, folders: @created_folders.compact.uniq }
318
+ (response, status) = Spout::Helpers::JsonRequestGeneric.post("#{@url}/api/v1/dictionary/refresh.json", params)
272
319
  if response.is_a?(Hash) && response['refresh'] == 'success'
273
320
  puts 'DONE'.colorize(:green)
274
- elsif response.is_a?(Hash) && response['refresh'] == 'notagfound'
275
- puts 'FAIL'.colorize(:red)
276
- puts "#{INDENT}Tag not found in repository, resolve using: " + 'git push --tags'.colorize(:white)
277
- raise DeployError
278
- elsif response.is_a?(Hash) && response['refresh'] == 'gitrepodoesnotexist'
279
- puts 'FAIL'.colorize(:red)
280
- puts "#{INDENT}Dataset data dictionary git repository has not been cloned on the server. Contact server admin.".colorize(:white)
281
- raise DeployError
282
321
  else
283
322
  puts 'FAIL'.colorize(:red)
284
- raise DeployError
323
+ fail DeployError
324
+ end
325
+ end
326
+
327
+ def set_default_dataset_version
328
+ if @archive_only
329
+ puts ' Set Default Version: ' + 'SKIP'.colorize(:blue)
330
+ return
331
+ end
332
+
333
+ print ' Set Default Version: '
334
+ params = { auth_token: @token, dataset: @slug, version: @version }
335
+ (response, status) = Spout::Helpers::JsonRequestGeneric.post("#{@url}/api/v1/dictionary/update_default_version.json", params)
336
+ if response.is_a?(Hash) && response['version_update'] == 'success'
337
+ puts @version.to_s.colorize(:green)
338
+ else
339
+ failure("#{INDENT}Unable to set default version\n#{INDENT}to " + @version.to_s.colorize(:white) + ' for ' + @slug.to_s.colorize(:white) + ' dataset.')
285
340
  end
286
341
  end
287
342
 
288
343
  def failure(message)
289
344
  puts 'FAIL'.colorize(:red)
290
345
  puts message
291
- raise DeployError
346
+ fail DeployError
347
+ end
348
+
349
+ def upload_file(file, folder)
350
+ Spout::Helpers::SendFile.post("#{@url}/api/v1/dictionary/upload_file.json", file, @version, @token, @slug, folder)
292
351
  end
293
352
  end
294
353
  end
@@ -108,7 +108,7 @@ module Spout
108
108
  next unless Spout::Models::Subject.method_defined?(variable.id)
109
109
 
110
110
  if @deploy_mode
111
- print "\r Graph Generation: " + "#{"% 3d" % ((file_index+1)*100/variable_files_count)}% Uploaded".colorize(:white)
111
+ print "\r Upload Variables: " + "#{"% 3d" % ((file_index+1)*100/variable_files_count)}% Uploaded".colorize(:white)
112
112
  else
113
113
  puts "#{file_index + 1} of #{variable_files_count}: #{variable.folder}#{variable.id}"
114
114
  end
@@ -132,17 +132,24 @@ Usage: spout deploy NAME
132
132
 
133
133
  NAME is the name of the webserver listed in `.spout.yml` file
134
134
  Optional Flags:
135
- --clean Regenerate all variables (default is to resume
136
- where command last left off)
137
- --rows=N Limit the number of rows read from CSVs to a
138
- maximum of N rows
139
- <variable> Only deploy specified variable(s)
140
- Ex: spout deploy production age gender
141
- --skip-checks Skips Spout checks
142
- --skip-graphs Skip generation of variable graphs
143
- --skip-csvs Skip upload of Data Dictionary and Dataset CSVs
144
- --token=TOKEN Provide token via command-line for automated
145
- processes
135
+ --clean Regenerate all variables (default is to
136
+ resume where command last left off)
137
+ --rows=N Limit the number of rows read from CSVs
138
+ to a maximum of N rows
139
+ <variable> Only deploy specified variable(s)
140
+ Ex: spout deploy production age gender
141
+ --skip-checks Skip Spout checks
142
+ --skip-variables Skip upload of dataset variables
143
+ --skip-dataset Skip upload of dataset CSVs
144
+ --skip-dictionary Skip upload of data dictionary
145
+ --skip-documentation Skip upload of CHANGELOG.md and
146
+ KNOWNISSUES.md
147
+ --skip-server-scripts Skips server refreshing datasets folder
148
+ to list newly uploaded files
149
+ --archive-only Only upload files to the datasets/archive
150
+ folder and not in the root datasets folder
151
+ --token=TOKEN Provide token via command-line for
152
+ automated processes
146
153
 
147
154
  More information here:
148
155
 
@@ -17,7 +17,7 @@ module Spout
17
17
 
18
18
  def load_json(column)
19
19
  file = Dir.glob("variables/**/#{column.to_s.downcase}.json", File::FNM_CASEFOLD).first
20
- @file_name_test = (file != nil)
20
+ @file_name_test = !file.nil?
21
21
  @json = JSON.parse(File.read(file)) rescue @json = {}
22
22
  @json_id_test = (@json['id'].to_s.downcase == column)
23
23
  end
@@ -1,5 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
+ # Launches default Spout tests and custom tests for specific to this dictionary
3
4
  class DictionaryTest < Minitest::Test
4
5
  # This line includes all default Spout Dictionary tests
5
6
  include Spout::Tests
@@ -10,18 +11,17 @@ class DictionaryTest < Minitest::Test
10
11
 
11
12
  # Example 1: Create custom tests to show that `integer` and `numeric` variables have a valid unit type
12
13
  # VALID_UNITS = ['minutes', 'hours'] # Add your own valid units to this array
13
- # @variables.select{|v| v.type == 'numeric' or v.type == 'integer'}.each do |variable|
14
- # define_method("test_units: "+variable.path) do
15
- # message = "\"#{variable.units}\"".colorize( :red ) + " invalid units.\n" +
16
- # " Valid types: " +
17
- # VALID_UNITS.sort.collect{|u| u.inspect.colorize( :white )}.join(', ')
14
+ # @variables.select { |v| %w(numeric integer).include?(v.type) }.each do |variable|
15
+ # define_method("test_units: #{variable.path}") do
16
+ # message = "\"#{variable.units}\"".colorize(:red) + " invalid units.\n Valid types: " +
17
+ # VALID_UNITS.sort.collect { |u| u.inspect.colorize(:white) }.join(', ')
18
18
  # assert VALID_UNITS.include?(variable.units), message
19
19
  # end
20
20
  # end
21
21
 
22
22
  # Example 2: Create custom tests to show that variables have 2 or more labels.
23
- # @variables.select{|v| ['numeric','integer'].include?(v.type)}.each do |variable|
24
- # define_method("test_at_least_two_labels: "+variable.path) do
23
+ # @variables.select { |v| %w(numeric integer).include?(v.type) }.each do |variable|
24
+ # define_method("test_at_least_two_labels: #{variable.path}") do
25
25
  # assert_operator 2, :<=, variable.labels.size
26
26
  # end
27
27
  # end
@@ -1,3 +1,4 @@
1
+ sudo: false
1
2
  language: ruby
2
3
  rvm:
3
4
  - 2.3.0
data/lib/spout/version.rb CHANGED
@@ -3,7 +3,7 @@ module Spout
3
3
  MAJOR = 0
4
4
  MINOR = 11
5
5
  TINY = 0
6
- BUILD = 'beta1' # 'pre', 'rc', 'rc2', nil
6
+ BUILD = 'beta2' # 'pre', 'rc', 'rc2', nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, BUILD].compact.join('.')
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0.beta1
4
+ version: 0.11.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Remo Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-11 00:00:00.000000000 Z
11
+ date: 2016-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler