mode 0.0.5 → 0.0.7

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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/README.md +17 -22
  4. data/bin/mode +1 -1
  5. data/lib/mode.rb +34 -6
  6. data/lib/mode/api/form.rb +53 -0
  7. data/lib/mode/api/link.rb +31 -0
  8. data/lib/mode/api/request.rb +181 -0
  9. data/lib/mode/api/resource.rb +67 -0
  10. data/lib/mode/auth/access_token.rb +23 -0
  11. data/lib/mode/cli.rb +3 -3
  12. data/lib/mode/cli/analyze.rb +1 -1
  13. data/lib/mode/cli/base.rb +5 -0
  14. data/lib/mode/cli/connect.rb +18 -0
  15. data/lib/mode/cli/helpers.rb +0 -9
  16. data/lib/mode/cli/import.rb +9 -38
  17. data/lib/mode/cli/login.rb +13 -0
  18. data/lib/mode/cli/package.rb +2 -5
  19. data/lib/mode/commands/analyze_field.rb +20 -21
  20. data/lib/mode/commands/analyze_schema.rb +69 -48
  21. data/lib/mode/commands/connect.rb +78 -0
  22. data/lib/mode/commands/helpers.rb +54 -0
  23. data/lib/mode/commands/import.rb +209 -20
  24. data/lib/mode/commands/login.rb +111 -0
  25. data/lib/mode/config.rb +13 -33
  26. data/lib/mode/configurable.rb +46 -0
  27. data/lib/mode/connector/config.rb +31 -0
  28. data/lib/mode/connector/daemon.rb +27 -0
  29. data/lib/mode/connector/data_source.rb +75 -0
  30. data/lib/mode/connector/dataset.rb +13 -0
  31. data/lib/mode/connector/message.rb +31 -0
  32. data/lib/mode/connector/poller.rb +27 -0
  33. data/lib/mode/connector/processor.rb +58 -0
  34. data/lib/mode/connector/registrar.rb +36 -0
  35. data/lib/mode/connector/scheduler.rb +62 -0
  36. data/lib/mode/connector/selector.rb +47 -0
  37. data/lib/mode/connector/type_map.rb +45 -0
  38. data/lib/mode/connector/uploader.rb +50 -0
  39. data/lib/mode/logger.rb +202 -0
  40. data/lib/mode/version.rb +1 -1
  41. data/mode.gemspec +13 -2
  42. data/spec/api/form_spec.rb +51 -0
  43. data/spec/api/link_spec.rb +23 -0
  44. data/spec/api/request_spec.rb +111 -0
  45. data/spec/api/resource_spec.rb +70 -0
  46. data/spec/auth/access_token_spec.rb +22 -0
  47. data/spec/commands/analyze_field_spec.rb +26 -0
  48. data/spec/commands/analyze_schema_spec.rb +7 -5
  49. data/spec/commands/connect_spec.rb +80 -0
  50. data/spec/commands/helpers_spec.rb +69 -0
  51. data/spec/commands/import_spec.rb +155 -0
  52. data/spec/commands/login_spec.rb +178 -0
  53. data/spec/config_spec.rb +9 -7
  54. data/spec/connector/config_spec.rb +46 -0
  55. data/spec/connector/daemon_spec.rb +30 -0
  56. data/spec/connector/data_source_spec.rb +73 -0
  57. data/spec/connector/message_spec.rb +22 -0
  58. data/spec/connector/poller_spec.rb +26 -0
  59. data/spec/connector/processor_spec.rb +93 -0
  60. data/spec/connector/registrar_spec.rb +53 -0
  61. data/spec/connector/scheduler_spec.rb +93 -0
  62. data/spec/connector/selector_spec.rb +54 -0
  63. data/spec/connector/type_map_spec.rb +45 -0
  64. data/spec/connector/uploader_spec.rb +55 -0
  65. data/spec/fixtures/country-codes/README.md +71 -0
  66. data/spec/fixtures/country-codes/data/country-codes.csv +250 -0
  67. data/spec/fixtures/country-codes/datapackage.json +142 -0
  68. data/spec/fixtures/country-codes/scripts/get_countries_of_earth.py +370 -0
  69. data/spec/fixtures/country-codes/scripts/reorder_columns.py +8 -0
  70. data/spec/fixtures/country-codes/scripts/requirements.pip +2 -0
  71. data/spec/fixtures/espn_draft.csv +473 -1
  72. data/spec/fixtures/espn_draft/data.csv +473 -0
  73. data/spec/fixtures/espn_draft/datapackage.json +43 -0
  74. data/spec/logger_spec.rb +79 -0
  75. data/spec/spec_helper.rb +6 -1
  76. metadata +156 -19
  77. data/lib/mode/cli/setup.rb +0 -12
  78. data/lib/mode/commands/package.rb +0 -56
  79. data/lib/mode/commands/setup.rb +0 -36
  80. data/lib/mode/package_builder.rb +0 -57
  81. data/spec/commands/setup_spec.rb +0 -62
  82. data/spec/fixtures/MOCK_DATA.csv +0 -100001
  83. data/spec/fixtures/cb_clean_small.csv +0 -100000
  84. data/spec/fixtures/duplicate_keys.csv +0 -3
  85. data/spec/fixtures/format_examples.csv.txt +0 -6
  86. data/spec/fixtures/format_examples_after_excel.csv.txt +0 -1
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "espn_draft",
3
+ "version": "0.0.1",
4
+ "resources": [
5
+ {
6
+ "path": "data.csv",
7
+ "schema": {
8
+ "fields": [
9
+ {
10
+ "name": "draft_order",
11
+ "type": "integer"
12
+ },
13
+ {
14
+ "name": "player",
15
+ "type": "string"
16
+ },
17
+ {
18
+ "name": "position",
19
+ "type": "string"
20
+ },
21
+ {
22
+ "name": "avg_draft_position",
23
+ "type": "number"
24
+ },
25
+ {
26
+ "name": "avg_bid_value",
27
+ "type": "number"
28
+ }
29
+ ]
30
+ },
31
+ "name": "data",
32
+ "dialect": {
33
+ "delimiter": ",",
34
+ "doublequote": false,
35
+ "lineterminator": "\n",
36
+ "quotechar": "\"",
37
+ "skipinitialspace": false
38
+ },
39
+ "format": "csv",
40
+ "hash": "5287981e2eeb1fcf73c6cc14fc1264d4"
41
+ }
42
+ ]
43
+ }
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mode::Logger do
4
+ let(:path) { File.join(File.expand_path("~/.mode"), 'mode.log') }
5
+
6
+ it "has a default target" do
7
+ Mode::Logger.default_path.should == path
8
+ end
9
+
10
+ it "has a default level" do
11
+ Mode::Logger.default_level.should == Logger::INFO
12
+ end
13
+
14
+ it "has a default formatter" do
15
+ formatter = Mode::Logger.default_formatter
16
+ formatter.call("INFO", Time.now, nil, "HEYO").should match(/INFO \[[\d\w\:\+\-]+\]: HEYO/)
17
+ end
18
+
19
+ describe "A logger instance" do
20
+ let(:tmpdir) { Dir.mktmpdir }
21
+ let(:path) { File.join(tmpdir, 'mode.log') }
22
+ let(:levels) { [:debug, :info, :warn, :error, :fatal] }
23
+
24
+ it "initializes and logs at all levels" do
25
+ logger = Mode::Logger.instance(
26
+ Mode::Logger.new(:path => path, :level => Logger::DEBUG))
27
+
28
+ levels.each do |level|
29
+ logger.send(level, "Logger::Test", "HEYO!")
30
+ end
31
+
32
+ content = File.read(path)
33
+
34
+ levels.each do |level|
35
+ content.should match(/#{level.to_s.upcase} \[[\d\w\:\+\-]+\] Logger::Test: HEYO!/)
36
+ end
37
+ end
38
+
39
+ it "switches between levels" do
40
+ logger = Mode::Logger.instance(
41
+ Mode::Logger.new(:path => path, :level => Logger::DEBUG))
42
+
43
+ logger.debug!.should == Logger::DEBUG
44
+ logger.info!.should == Logger::INFO
45
+ logger.warn!.should == Logger::WARN
46
+ logger.error!.should == Logger::ERROR
47
+ logger.fatal!.should == Logger::FATAL
48
+ end
49
+
50
+ it "logs details on new lines" do
51
+ logger = Mode::Logger.instance(
52
+ Mode::Logger.new(:path => path, :level => Logger::DEBUG))
53
+
54
+ logger.info("Logger::Test", "Heyo!", ["Next", "Line"])
55
+
56
+ content = File.read(path)
57
+
58
+ content.should match(/INFO \[[\d\w\:\+\-]+\] Logger::Test: Heyo!/)
59
+ content.should match(/^! Next/)
60
+ content.should match(/^! Line/)
61
+ end
62
+
63
+ it "can be disabled and enabled" do
64
+ logger = Mode::Logger.instance(
65
+ Mode::Logger.new(:path => path, :level => Logger::DEBUG))
66
+
67
+ logger.disable!
68
+ logger.info("Logger::Test", "Heyo!", ["Next", "Line"])
69
+
70
+ content = File.read(path)
71
+ content.should_not match(/Heyo!/)
72
+
73
+ logger.enable!
74
+ logger.info("Logger::Test", "Heyo!", ["Next", "Line"])
75
+ content = File.read(path)
76
+ content.should match(/Heyo!/)
77
+ end
78
+ end
79
+ end
@@ -13,7 +13,12 @@ require 'mode'
13
13
  require 'tmpdir'
14
14
 
15
15
  RSpec.configure do |config|
16
- def data_path(filename)
16
+ def fixture_path(filename = "")
17
17
  File.join(File.dirname(__FILE__), 'fixtures', filename)
18
18
  end
19
+
20
+ def initialize_logger
21
+ path = File.join(Dir.mktmpdir, 'mode.log')
22
+ Mode::Logger.instance(Mode::Logger.new(:path => path, :level => Logger::DEBUG))
23
+ end
19
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mode Analytics
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-18 00:00:00.000000000 Z
11
+ date: 2014-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -66,6 +66,76 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: uri_template
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sequel
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: daemon-spawn
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rufus-scheduler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
69
139
  - !ruby/object:Gem::Dependency
70
140
  name: bundler
71
141
  requirement: !ruby/object:Gem::Requirement
@@ -167,32 +237,75 @@ files:
167
237
  - Rakefile
168
238
  - bin/mode
169
239
  - lib/mode.rb
240
+ - lib/mode/api/form.rb
241
+ - lib/mode/api/link.rb
242
+ - lib/mode/api/request.rb
243
+ - lib/mode/api/resource.rb
244
+ - lib/mode/auth/access_token.rb
170
245
  - lib/mode/cli.rb
171
246
  - lib/mode/cli/analyze.rb
172
247
  - lib/mode/cli/base.rb
248
+ - lib/mode/cli/connect.rb
173
249
  - lib/mode/cli/helpers.rb
174
250
  - lib/mode/cli/import.rb
251
+ - lib/mode/cli/login.rb
175
252
  - lib/mode/cli/package.rb
176
- - lib/mode/cli/setup.rb
177
253
  - lib/mode/commands/analyze_field.rb
178
254
  - lib/mode/commands/analyze_schema.rb
255
+ - lib/mode/commands/connect.rb
179
256
  - lib/mode/commands/helpers.rb
180
257
  - lib/mode/commands/import.rb
181
- - lib/mode/commands/package.rb
182
- - lib/mode/commands/setup.rb
258
+ - lib/mode/commands/login.rb
183
259
  - lib/mode/config.rb
184
- - lib/mode/package_builder.rb
260
+ - lib/mode/configurable.rb
261
+ - lib/mode/connector/config.rb
262
+ - lib/mode/connector/daemon.rb
263
+ - lib/mode/connector/data_source.rb
264
+ - lib/mode/connector/dataset.rb
265
+ - lib/mode/connector/message.rb
266
+ - lib/mode/connector/poller.rb
267
+ - lib/mode/connector/processor.rb
268
+ - lib/mode/connector/registrar.rb
269
+ - lib/mode/connector/scheduler.rb
270
+ - lib/mode/connector/selector.rb
271
+ - lib/mode/connector/type_map.rb
272
+ - lib/mode/connector/uploader.rb
273
+ - lib/mode/logger.rb
185
274
  - lib/mode/version.rb
186
275
  - mode.gemspec
276
+ - spec/api/form_spec.rb
277
+ - spec/api/link_spec.rb
278
+ - spec/api/request_spec.rb
279
+ - spec/api/resource_spec.rb
280
+ - spec/auth/access_token_spec.rb
281
+ - spec/commands/analyze_field_spec.rb
187
282
  - spec/commands/analyze_schema_spec.rb
188
- - spec/commands/setup_spec.rb
283
+ - spec/commands/connect_spec.rb
284
+ - spec/commands/helpers_spec.rb
285
+ - spec/commands/import_spec.rb
286
+ - spec/commands/login_spec.rb
189
287
  - spec/config_spec.rb
190
- - spec/fixtures/MOCK_DATA.csv
191
- - spec/fixtures/cb_clean_small.csv
192
- - spec/fixtures/duplicate_keys.csv
288
+ - spec/connector/config_spec.rb
289
+ - spec/connector/daemon_spec.rb
290
+ - spec/connector/data_source_spec.rb
291
+ - spec/connector/message_spec.rb
292
+ - spec/connector/poller_spec.rb
293
+ - spec/connector/processor_spec.rb
294
+ - spec/connector/registrar_spec.rb
295
+ - spec/connector/scheduler_spec.rb
296
+ - spec/connector/selector_spec.rb
297
+ - spec/connector/type_map_spec.rb
298
+ - spec/connector/uploader_spec.rb
299
+ - spec/fixtures/country-codes/README.md
300
+ - spec/fixtures/country-codes/data/country-codes.csv
301
+ - spec/fixtures/country-codes/datapackage.json
302
+ - spec/fixtures/country-codes/scripts/get_countries_of_earth.py
303
+ - spec/fixtures/country-codes/scripts/reorder_columns.py
304
+ - spec/fixtures/country-codes/scripts/requirements.pip
193
305
  - spec/fixtures/espn_draft.csv
194
- - spec/fixtures/format_examples.csv.txt
195
- - spec/fixtures/format_examples_after_excel.csv.txt
306
+ - spec/fixtures/espn_draft/data.csv
307
+ - spec/fixtures/espn_draft/datapackage.json
308
+ - spec/logger_spec.rb
196
309
  - spec/spec_helper.rb
197
310
  homepage: http://www.modeanalytics.com/
198
311
  licenses:
@@ -214,19 +327,43 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
327
  version: '0'
215
328
  requirements: []
216
329
  rubyforge_project:
217
- rubygems_version: 2.0.0
330
+ rubygems_version: 2.0.14
218
331
  signing_key:
219
332
  specification_version: 4
220
333
  summary: Provides a command line interface and ruby libraries to the Mode Analytics
221
334
  Service
222
335
  test_files:
336
+ - spec/api/form_spec.rb
337
+ - spec/api/link_spec.rb
338
+ - spec/api/request_spec.rb
339
+ - spec/api/resource_spec.rb
340
+ - spec/auth/access_token_spec.rb
341
+ - spec/commands/analyze_field_spec.rb
223
342
  - spec/commands/analyze_schema_spec.rb
224
- - spec/commands/setup_spec.rb
343
+ - spec/commands/connect_spec.rb
344
+ - spec/commands/helpers_spec.rb
345
+ - spec/commands/import_spec.rb
346
+ - spec/commands/login_spec.rb
225
347
  - spec/config_spec.rb
226
- - spec/fixtures/MOCK_DATA.csv
227
- - spec/fixtures/cb_clean_small.csv
228
- - spec/fixtures/duplicate_keys.csv
348
+ - spec/connector/config_spec.rb
349
+ - spec/connector/daemon_spec.rb
350
+ - spec/connector/data_source_spec.rb
351
+ - spec/connector/message_spec.rb
352
+ - spec/connector/poller_spec.rb
353
+ - spec/connector/processor_spec.rb
354
+ - spec/connector/registrar_spec.rb
355
+ - spec/connector/scheduler_spec.rb
356
+ - spec/connector/selector_spec.rb
357
+ - spec/connector/type_map_spec.rb
358
+ - spec/connector/uploader_spec.rb
359
+ - spec/fixtures/country-codes/README.md
360
+ - spec/fixtures/country-codes/data/country-codes.csv
361
+ - spec/fixtures/country-codes/datapackage.json
362
+ - spec/fixtures/country-codes/scripts/get_countries_of_earth.py
363
+ - spec/fixtures/country-codes/scripts/reorder_columns.py
364
+ - spec/fixtures/country-codes/scripts/requirements.pip
229
365
  - spec/fixtures/espn_draft.csv
230
- - spec/fixtures/format_examples.csv.txt
231
- - spec/fixtures/format_examples_after_excel.csv.txt
366
+ - spec/fixtures/espn_draft/data.csv
367
+ - spec/fixtures/espn_draft/datapackage.json
368
+ - spec/logger_spec.rb
232
369
  - spec/spec_helper.rb
@@ -1,12 +0,0 @@
1
- module Mode
2
- module CLI
3
- class Base < Thor
4
- desc "setup", "Setup a new mode configuration in the given directory (defaults to home)"
5
- option :dir, :default => '~'
6
- option :host, :default => 'www.modeanalytics.com'
7
- def setup
8
- Mode::Commands::Init.new(options).execute
9
- end
10
- end
11
- end
12
- end
@@ -1,56 +0,0 @@
1
- require 'digest/md5'
2
-
3
- module Mode
4
- module Commands
5
- class Package < Thor
6
- attr_accessor :data
7
- attr_accessor :base_path
8
- attr_accessor :package_name
9
- attr_accessor :resource_name
10
-
11
- def initialize(data, base_path, package_name, resource_name)
12
- @data = data
13
- @base_path = base_path
14
- @package_name = package_name
15
- @resource_name = resource_name
16
- end
17
-
18
- no_commands do
19
- def execute
20
- unless valid_data?(data)
21
- error "Error: Couldn't find valid data file at #{data}"
22
- return
23
- end
24
-
25
- unless valid_name?(package_name)
26
- error "Error: Data package names can only contain letters, numbers, hyphens and underscores"
27
- return
28
- end
29
-
30
- if DataPackage::Package.exist?(base_path)
31
- error "Error: A data package already exists at #{base_path}"
32
- return
33
- else
34
- FileUtils.mkdir_p(File.join(base_path, package_name))
35
- end
36
-
37
- csv = DataKit::CSV::Parser.new(data)
38
- package = Mode::PackageBuilder.new(csv, base_path, package_name, resource_name).execute
39
-
40
- say "Finished packaging #{name}!"
41
- say "Use `mode table create <account>/<tablename> #{name}` to create a table in the public data warehouse"
42
- end
43
- end
44
-
45
- private
46
-
47
- def valid_name?(name)
48
- name =~ /\A[\w\d\-\_]+\z/
49
- end
50
-
51
- def valid_data?(data)
52
- !data.nil? && File.exist?(data)
53
- end
54
- end
55
- end
56
- end
@@ -1,36 +0,0 @@
1
- module Mode
2
- module Commands
3
- class Setup < Thor
4
- attr_accessor :options
5
-
6
- def initialize(options = {})
7
- @options = options
8
- end
9
-
10
- no_commands do
11
- def execute
12
- config_path = Mode::Config.full_path(options[:dir])
13
-
14
- if File.exist?(config_path)
15
- say "Configuration at #{config_path} already exists"
16
- unless yes? "Would you like to modify the existing configuration? (y/n):"
17
- return
18
- end
19
- end
20
-
21
- say "Initializing configuration at #{config_path}"
22
-
23
- config = Mode::Config.init(options[:dir])
24
-
25
- config.username = ask "Mode username:"
26
-
27
- say "Your can view your access tokens at http://#{options[:host]}/accounts/#{config.username}/access_tokens"
28
-
29
- config.access_token = ask "Access token for #{config.username}:"
30
-
31
- config.save
32
- end
33
- end
34
- end
35
- end
36
- end