mode 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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