myer 0.0.1

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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +21 -0
  7. data/README.md +5 -0
  8. data/Rakefile +44 -0
  9. data/bin/myer +198 -0
  10. data/features/myer.feature +8 -0
  11. data/features/step_definitions/myer_steps.rb +6 -0
  12. data/features/support/env.rb +15 -0
  13. data/lib/myer.rb +25 -0
  14. data/lib/myer/admin_cli_controller.rb +70 -0
  15. data/lib/myer/api.rb +104 -0
  16. data/lib/myer/cli_controller.rb +204 -0
  17. data/lib/myer/config.rb +86 -0
  18. data/lib/myer/content.rb +92 -0
  19. data/lib/myer/crypto.rb +40 -0
  20. data/lib/myer/exceptions.rb +7 -0
  21. data/lib/myer/plot.rb +11 -0
  22. data/lib/myer/proc_net_parser.rb +11 -0
  23. data/lib/myer/test_cli_controller.rb +52 -0
  24. data/lib/myer/ticket.rb +3 -0
  25. data/lib/myer/ticket_store.rb +61 -0
  26. data/lib/myer/version.rb +3 -0
  27. data/myer.gemspec +26 -0
  28. data/myer.rdoc +5 -0
  29. data/scripts/plot-helper.py +32 -0
  30. data/spec/admin_cli_controller_spec.rb +128 -0
  31. data/spec/api_spec.rb +136 -0
  32. data/spec/cli_controller_spec.rb +368 -0
  33. data/spec/config_spec.rb +116 -0
  34. data/spec/content_spec.rb +103 -0
  35. data/spec/crypto_spec.rb +37 -0
  36. data/spec/data/myer-full.config +9 -0
  37. data/spec/data/myer-multiple.config +14 -0
  38. data/spec/data/myer.config +6 -0
  39. data/spec/data/plot-data.csv +31 -0
  40. data/spec/data/secret-ticket-12345678.json +1 -0
  41. data/spec/data/secret-ticket-987654321.json +1 -0
  42. data/spec/plot_spec.rb +9 -0
  43. data/spec/proc_net_parser_spec.rb +15 -0
  44. data/spec/shared_examples_for_config.rb +47 -0
  45. data/spec/spec_helper.rb +14 -0
  46. data/spec/test_cli_controller_spec.rb +72 -0
  47. data/spec/ticket_store_spec.rb +86 -0
  48. data/test/default_test.rb +14 -0
  49. data/test/test_helper.rb +9 -0
  50. metadata +220 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 96eb334f1899d3979918cb3fdec8a20bc20edf80
4
+ data.tar.gz: 7b857a67dea1c8440c69d87cd776d7ef4c90aec0
5
+ SHA512:
6
+ metadata.gz: c928c5c4484c25836bcc86170844c173221271118da31d8d47523d81af609ab44cedc0bbfb3e7bfc69c3fc56d01775fe5e99dc7dd876443a7f8c9286f754fa9e
7
+ data.tar.gz: 97b62bd79399807f99d3defa7eba08b70139b8447439ab2cdbd9af9c94cbf14c5153cac2ac78bae62fb813514186bd6d515cba9e5790a25ef89f5f3dfaa92c31
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ results.html
3
+ coverage
4
+ *.gem
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.0.0"
4
+ - "2.1.1"
5
+ script: bundle exec rspec spec
6
+ addons:
7
+ code_climate:
8
+ repo_token:
9
+ secure: XQRgzJQhdraJYMTUusZwi2D7CeArx1a/PF8tkpT3BiGO3xKLRdImfjSWP4HOAMzKE7iOOtwcySgHMJIEguWurn95mvIwbMQtA41vjDbEXCnHOS2F0n15Gb7sy2ULf6Qx+41YO5TlqubAUQRvPgb6wNFZ0OBemvLENTWMzrhITJo=
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Cornelius Schumacher
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/cornelius/myer.svg?branch=master)](https://travis-ci.org/cornelius/myer)
2
+ [![Test Coverage](https://codeclimate.com/github/cornelius/myer/badges/coverage.svg)](https://codeclimate.com/github/cornelius/myer)
3
+ [![Code Climate](https://codeclimate.com/github/cornelius/myer/badges/gpa.svg)](https://codeclimate.com/github/cornelius/myer)
4
+
5
+ Command line client of [Project MySelf](https://github.com/cornelius/project-myself)
@@ -0,0 +1,44 @@
1
+ require 'rake/clean'
2
+ require 'rubygems'
3
+ require 'rubygems/package_task'
4
+ require 'rdoc/task'
5
+ require 'cucumber'
6
+ require 'cucumber/rake/task'
7
+ Rake::RDocTask.new do |rd|
8
+ rd.main = "README.rdoc"
9
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
10
+ rd.title = 'Your application title'
11
+ end
12
+
13
+ spec = eval(File.read('myer.gemspec'))
14
+
15
+ Gem::PackageTask.new(spec) do |pkg|
16
+ end
17
+ CUKE_RESULTS = 'results.html'
18
+ CLEAN << CUKE_RESULTS
19
+ desc 'Run features'
20
+ Cucumber::Rake::Task.new(:features) do |t|
21
+ opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
22
+ opts += " --tags #{ENV['TAGS']}" if ENV['TAGS']
23
+ t.cucumber_opts = opts
24
+ t.fork = false
25
+ end
26
+
27
+ desc 'Run features tagged as work-in-progress (@wip)'
28
+ Cucumber::Rake::Task.new('features:wip') do |t|
29
+ tag_opts = ' --tags ~@pending'
30
+ tag_opts = ' --tags @wip'
31
+ t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty -x -s#{tag_opts}"
32
+ t.fork = false
33
+ end
34
+
35
+ task :cucumber => :features
36
+ task 'cucumber:wip' => 'features:wip'
37
+ task :wip => 'features:wip'
38
+ require 'rake/testtask'
39
+ Rake::TestTask.new do |t|
40
+ t.libs << "test"
41
+ t.test_files = FileList['test/*_test.rb']
42
+ end
43
+
44
+ task :default => [:test,:features]
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gli'
4
+
5
+ require_relative '../lib/myer'
6
+
7
+ include GLI::App
8
+
9
+ program_desc 'Command line client for Project MySelf'
10
+
11
+ version Myer::VERSION
12
+
13
+ subcommand_option_handling :normal
14
+ arguments :strict
15
+
16
+ desc 'Describe some switch here'
17
+ switch [:s,:switch]
18
+
19
+ desc 'Describe some flag here'
20
+ default_value 'the default'
21
+ arg_name 'The name of the argument'
22
+ flag [:f,:flagname]
23
+
24
+ pre do |global,command,options,args|
25
+ # Pre logic here
26
+ # Return true to proceed; false to abort and not call the
27
+ # chosen command
28
+ # Use skips_pre before a command to skip this block
29
+ # on that command only
30
+ true
31
+ end
32
+
33
+ post do |global,command,options,args|
34
+ # Post logic here
35
+ # Use skips_post before a command to skip this
36
+ # block on that command only
37
+ end
38
+
39
+ on_error do |exception|
40
+ # Error logic here
41
+ # return false to skip default error handling
42
+ true
43
+ end
44
+
45
+ desc "Test"
46
+ command :test do |c|
47
+ c.desc "Full server acceptance test"
48
+ c.arg :server
49
+ c.arg :pin
50
+ c.command :full do |full|
51
+ full.action do |global_options, options, args|
52
+ TestCliController.new.full(args[0], args[1])
53
+ end
54
+ end
55
+
56
+ c.desc "Full local server acceptance test"
57
+ c.arg :executable
58
+ c.command :local do |local|
59
+ local.action do |global_options, options, args|
60
+ TestCliController.new.local(args[0])
61
+ end
62
+ end
63
+ end
64
+
65
+ desc "Admin actions"
66
+ command :admin do |c|
67
+ c.desc "Register admin client"
68
+ c.arg :server
69
+ c.arg :pin
70
+ c.command :register do |register|
71
+ register.action do |global_options, options, args|
72
+ AdminCliController.new.register(args[0], args[1])
73
+ end
74
+ end
75
+
76
+ c.desc "Register as user client"
77
+ c.command :register_user do |register|
78
+ register.action do |global_options, options, args|
79
+ AdminCliController.new.register_user
80
+ end
81
+ end
82
+
83
+ c.desc "List all existing buckets"
84
+ c.command :list_buckets do |sc|
85
+ sc.action do
86
+ AdminCliController.new.list_buckets
87
+ end
88
+ end
89
+
90
+ c.desc "Delete bucket"
91
+ c.arg :bucket_id
92
+ c.command :delete_bucket do |sc|
93
+ sc.action do |global_options, options, args|
94
+ AdminCliController.new.delete_bucket(args[0])
95
+ end
96
+ end
97
+
98
+ c.desc "Print status"
99
+ c.command :status do |sc|
100
+ sc.action do
101
+ AdminCliController.new.status
102
+ end
103
+ end
104
+ end
105
+
106
+ desc "Create bucket"
107
+ arg :name
108
+ command :create_bucket do |c|
109
+ c.action do |global_options, options, args|
110
+ CliController.new.create_bucket(args[0])
111
+ end
112
+ end
113
+
114
+ desc "Create token"
115
+ command :create_token do |c|
116
+ c.action do
117
+ CliController.new.create_token
118
+ end
119
+ end
120
+
121
+ desc "Register user client"
122
+ arg :server
123
+ arg :token
124
+ command :register do |c|
125
+ c.action do |global_options, options, args|
126
+ CliController.new.register(args[0], args[1])
127
+ end
128
+ end
129
+
130
+ desc "Write item"
131
+ command :write do |c|
132
+ c.switch :raw, desc: "Write unencrypted"
133
+ c.action do |global_options, options, args|
134
+ if options[:raw]
135
+ CliController.new.write_raw(STDIN.read)
136
+ else
137
+ CliController.new.write(STDIN.read)
138
+ end
139
+ end
140
+ end
141
+
142
+ desc "Write value"
143
+ arg :value
144
+ command :write_value do |c|
145
+ c.flag :tag, desc: "Add tag as meta data"
146
+ c.action do |global_options, options, args|
147
+ CliController.new.write_value(args[0], options[:tag])
148
+ end
149
+ end
150
+
151
+ desc "Write pair of values"
152
+ arg :value1
153
+ arg :value2
154
+ command :write_pair do |c|
155
+ c.action do |global_options, options, args|
156
+ CliController.new.write_pair(args[0], args[1])
157
+ end
158
+ end
159
+
160
+ desc "Read items"
161
+ command :read do |c|
162
+ c.action do
163
+ CliController.new.read
164
+ end
165
+ end
166
+
167
+ desc "Plot data"
168
+ command :plot do |c|
169
+ c.switch :dont_sync, desc: "Don't sync data from server"
170
+ c.action do |_, options, _|
171
+ CliController.new.plot(dont_sync: options[:dont_sync])
172
+ end
173
+ end
174
+
175
+ desc "Export data"
176
+ arg :output_path
177
+ command :export do |c|
178
+ c.action do|global_options, options, args|
179
+ CliController.new.export(args[0])
180
+ end
181
+ end
182
+
183
+ desc "Consume ticket"
184
+ arg :ticket_path
185
+ command :consume_ticket do |c|
186
+ c.action do |global_options, options, args|
187
+ CliController.new.consume_ticket(args[0])
188
+ end
189
+ end
190
+
191
+ desc "List tickets"
192
+ command :list_tickets do |c|
193
+ c.switch :status, desc: "Show server status"
194
+ c.action do |_, options, _|
195
+ CliController.new.list_tickets(show_status: options[:status])
196
+ end
197
+ end
198
+ exit run(ARGV)
@@ -0,0 +1,8 @@
1
+ Feature: My bootstrapped app kinda works
2
+ In order to get going on coding my awesome app
3
+ I want to have aruba and cucumber setup
4
+ So I don't have to do it myself
5
+
6
+ Scenario: App just runs
7
+ When I get help for "myer"
8
+ Then the exit status should be 0
@@ -0,0 +1,6 @@
1
+ When /^I get help for "([^"]*)"$/ do |app_name|
2
+ @app_name = app_name
3
+ step %(I run `#{app_name} help`)
4
+ end
5
+
6
+ # Add more step definitions here
@@ -0,0 +1,15 @@
1
+ require 'aruba/cucumber'
2
+
3
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
4
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
5
+
6
+ Before do
7
+ # Using "announce" causes massive warnings on 1.9.2
8
+ @puts = true
9
+ @original_rubylib = ENV['RUBYLIB']
10
+ ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
11
+ end
12
+
13
+ After do
14
+ ENV['RUBYLIB'] = @original_rubylib
15
+ end
@@ -0,0 +1,25 @@
1
+ require "net/http"
2
+ require "json"
3
+ require "xdg"
4
+ require "open3"
5
+ require "tempfile"
6
+ require "securerandom"
7
+
8
+ def require_myer(file)
9
+ require_relative("myer/#{file}")
10
+ end
11
+
12
+ require_myer "version"
13
+
14
+ require_myer "exceptions"
15
+ require_myer "config"
16
+ require_myer "cli_controller"
17
+ require_myer "admin_cli_controller"
18
+ require_myer "test_cli_controller"
19
+ require_myer "crypto"
20
+ require_myer "ticket"
21
+ require_myer "ticket_store"
22
+ require_myer "proc_net_parser"
23
+ require_myer "content"
24
+ require_myer "plot"
25
+ require_myer "api"
@@ -0,0 +1,70 @@
1
+ class AdminCliController
2
+ include Myer::Config
3
+
4
+ attr_accessor :out
5
+
6
+ def initialize
7
+ @out = STDOUT
8
+ initialize_config
9
+ end
10
+
11
+ def api(server_name = default_server)
12
+ api = MySelf::Api.new
13
+ api.server = server_name
14
+ if server(server_name)
15
+ api.user = server(server_name).admin_id
16
+ api.password = server(server_name).admin_password
17
+ end
18
+ api
19
+ end
20
+
21
+ def register(server_name, pid)
22
+ self.default_server = server_name
23
+ self.admin_id, self.admin_password = api(server_name).admin_register(pid)
24
+
25
+ write_config
26
+ end
27
+
28
+ def list_buckets
29
+ read_config
30
+
31
+ buckets = api.admin_list_buckets
32
+
33
+ store = TicketStore.new(config_dir)
34
+ buckets.each do |bucket_id|
35
+ line = bucket_id + ": "
36
+ ticket = store.load_ticket(bucket_id)
37
+ if ticket
38
+ line += ticket.name || "<no name>"
39
+ else
40
+ line += "<no ticket>"
41
+ end
42
+ if bucket_id == default_bucket_id
43
+ line += " (default)"
44
+ end
45
+ out.puts line
46
+ end
47
+ end
48
+
49
+ def delete_bucket(bucket_id)
50
+ read_config
51
+
52
+ api.admin_delete_bucket(bucket_id)
53
+ end
54
+
55
+ def status
56
+ read_config
57
+
58
+ out.puts "Default server: #{default_server}"
59
+ out.puts "Default bucket: #{default_bucket_id}"
60
+ end
61
+
62
+ def register_user
63
+ read_config
64
+
65
+ token = api.create_token
66
+ self.user_id, self.user_password = api.register(token)
67
+
68
+ write_config
69
+ end
70
+ end
@@ -0,0 +1,104 @@
1
+ module MySelf
2
+ class Api
3
+ attr_accessor :server
4
+ attr_accessor :user, :password
5
+
6
+ def http_request
7
+ http = Net::HTTP.new(server, 4735)
8
+
9
+ request = yield
10
+
11
+ response = http.request(request)
12
+
13
+ if response.code != "200"
14
+ raise "#{request.path} HTTP Error #{response.code} - #{response.body}"
15
+ else
16
+ if response.body and !response.body.empty?
17
+ return JSON.parse(response.body)
18
+ else
19
+ return nil
20
+ end
21
+ end
22
+ end
23
+
24
+ def post(path, content = nil, auth_enabled = true)
25
+ http_request do
26
+ request = Net::HTTP::Post.new(path)
27
+ request.basic_auth(user, password) if auth_enabled
28
+ request.body = content if content
29
+ request
30
+ end
31
+ end
32
+
33
+ def get(path)
34
+ http_request do
35
+ request = Net::HTTP::Get.new(path)
36
+ request.basic_auth(user, password)
37
+ request
38
+ end
39
+ end
40
+
41
+ def delete(path)
42
+ http_request do
43
+ request = Net::HTTP::Delete.new(path)
44
+ request.basic_auth(user, password)
45
+ request
46
+ end
47
+ end
48
+
49
+ def admin_register(pid)
50
+ json = post("/admin/register/#{pid}",nil,false)
51
+ return json["admin_id"], json["password"]
52
+ end
53
+
54
+ def admin_list_buckets
55
+ get("/admin/buckets")
56
+ end
57
+
58
+ def admin_delete_bucket(bucket_id)
59
+ delete("/admin/buckets/#{bucket_id}")
60
+ end
61
+
62
+ def create_token
63
+ json = post("/tokens")
64
+ return json["token"]
65
+ end
66
+
67
+ def register(token)
68
+ json = post("/register/" + token, nil, false)
69
+ return json["user_id"], json["user_password"]
70
+ end
71
+
72
+ def create_bucket
73
+ json = post("/data")
74
+ return json["bucket_id"]
75
+ end
76
+
77
+ def create_item(bucket_id, content)
78
+ json = post("/data/#{bucket_id}", content)
79
+ return json["item_id"]
80
+ end
81
+
82
+ def get_items(bucket_id)
83
+ json = get("/data/#{bucket_id}")
84
+
85
+ inner_items = []
86
+
87
+ json.each do |json_item|
88
+ item = OpenStruct.new
89
+ item.id = json_item["item_id"]
90
+ item.content = json_item["content"]
91
+ inner_items.unshift(item)
92
+ end
93
+
94
+ return inner_items
95
+ end
96
+
97
+ def ping
98
+ json = get("/ping")
99
+ if json["ping"] != "pong"
100
+ raise "ping error: expected 'pong', got '#{result}'"
101
+ end
102
+ end
103
+ end
104
+ end