cs 0.1.1beta → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Gemfile +9 -1
- data/README.md +74 -0
- data/bin/cs +58 -0
- data/bin/cs-console +154 -0
- data/bin/cs-password +44 -0
- data/cs.gemspec +4 -1
- data/lib/cs.rb +31 -4
- data/lib/cs/auth/http.rb +23 -7
- data/lib/cs/cli/cli.rb +29 -0
- data/lib/cs/collection.rb +7 -0
- data/lib/cs/collection/sensor_data_collection.rb +62 -0
- data/lib/cs/end_point.rb +2 -0
- data/lib/cs/end_point/notification.rb +16 -0
- data/lib/cs/end_point/sensor.rb +31 -3
- data/lib/cs/end_point/sensor_data.rb +7 -2
- data/lib/cs/end_point/trigger.rb +16 -0
- data/lib/cs/relation.rb +2 -3
- data/lib/cs/relation/notification_relation.rb +20 -0
- data/lib/cs/relation/sensor_data_relation.rb +12 -0
- data/lib/cs/relation/sensor_relation.rb +27 -0
- data/lib/cs/relation/trigger_relation.rb +21 -0
- data/lib/cs/session.rb +29 -8
- data/lib/cs/version.rb +1 -1
- data/spec/features/user_management_spec.rb +2 -3
- data/spec/lib/cs/collection/sensor_data_collection_spec.rb +27 -0
- data/spec/lib/cs/end_point/sensor_spec.rb +28 -0
- data/spec/lib/cs/relation/group_relation_spec.rb +0 -9
- data/spec/lib/cs/relation/sensor_data_relation_spec.rb +0 -11
- data/spec/lib/cs/relation/sensor_relation_spec.rb +18 -9
- data/spec/lib/cs/session_spec.rb +16 -2
- data/spec/lib/cs_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +37 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c833d41fcb9aa813c7aeda87ad3aac228ace39d
|
4
|
+
data.tar.gz: 0e73999b1157e0641241a7fbf1ddb985416e16df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2397a73ae5ba94dab965f2d47a2e4f00d26611fbf1e382761a9488527c105e9c904ae053f4aea8815ba85c0563f3ff5bc2d047da9909ee2145cf93eabc6c093
|
7
|
+
data.tar.gz: 53f83903a01000f4690768f40bdc321340071147559d33126cdd6a1ee1f7ca4ac04fdd1c919ab0cd0f941989e79c38f4237a08a105f8dead596eb2ae88fc9f28
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,7 +3,15 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in cs.gemspec
|
4
4
|
gemspec
|
5
5
|
gem "time-lord"
|
6
|
-
gem 'json'
|
6
|
+
gem 'json'
|
7
|
+
|
8
|
+
#
|
9
|
+
# Rubinius does not load ruby stdlib by default
|
10
|
+
#
|
11
|
+
|
12
|
+
platforms :rbx do
|
13
|
+
gem 'rubysl'
|
14
|
+
end
|
7
15
|
|
8
16
|
group :test do
|
9
17
|
gem "rake", "~> 10.1.0"
|
data/README.md
CHANGED
@@ -129,6 +129,80 @@ session.dump_to_text("/tmp/output.txt")
|
|
129
129
|
session.open_in_browser
|
130
130
|
```
|
131
131
|
|
132
|
+
## Command Line Executable
|
133
|
+
|
134
|
+
This gem also contain executables to run from command line. The main executable is `cs`
|
135
|
+
|
136
|
+
```bash
|
137
|
+
$ cs -h
|
138
|
+
Usage: cs <command>
|
139
|
+
|
140
|
+
-h, --help Show this message
|
141
|
+
|
142
|
+
Available commands are:
|
143
|
+
|
144
|
+
console Run REPL console based on PRY
|
145
|
+
password Generate hased password from plaintext
|
146
|
+
|
147
|
+
```
|
148
|
+
|
149
|
+
The console executable will run an REPL (Read Evaluate Print Loop) session based on pry.
|
150
|
+
|
151
|
+
install `pry` first in order to use it. `pry-doc` and `pry-nav` is optional
|
152
|
+
|
153
|
+
```bash
|
154
|
+
$ gem install pry
|
155
|
+
$ gem install pry-doc
|
156
|
+
$ gem install pry-nav
|
157
|
+
```
|
158
|
+
|
159
|
+
you can have a configuration file on `~/.cs.yml` which contain the following
|
160
|
+
|
161
|
+
```yaml
|
162
|
+
users:
|
163
|
+
user1:
|
164
|
+
username: "user1@example.com"
|
165
|
+
password: ""
|
166
|
+
password_md5: 1234567890abcdef1234567890abcdef
|
167
|
+
user2:
|
168
|
+
username: "user2@example.com"
|
169
|
+
password: "V3rryS3curePaswd"
|
170
|
+
password_md5: ""
|
171
|
+
|
172
|
+
default_user: user1
|
173
|
+
```
|
174
|
+
|
175
|
+
you can either fill in the password or md5-hashed password. It will use `password_md5` if you fill in both
|
176
|
+
|
177
|
+
|
178
|
+
now you can use it on cs console
|
179
|
+
|
180
|
+
```bash
|
181
|
+
$ cs console
|
182
|
+
CS console 0.1.1
|
183
|
+
|
184
|
+
# create a client with default user
|
185
|
+
|
186
|
+
[1] pry(main)> client = new_client()
|
187
|
+
Successfully logged in with user 'user1@example.com'
|
188
|
+
=> #<CS::Client:0x00000004cd7540
|
189
|
+
@base_uri="https://api.sense-os.nl",
|
190
|
+
@session=SESSION_ID "1234567890abcdefg1.23456789">
|
191
|
+
|
192
|
+
# create a client with another user
|
193
|
+
|
194
|
+
[2] pry(main)> user2_client = new_client("user2")
|
195
|
+
Successfully logged in with user 'user2@example.com'
|
196
|
+
=> #<CS::Client:0x00000004cd7560
|
197
|
+
@base_uri="https://api.sense-os.nl",
|
198
|
+
@session=SESSION_ID "1234567890abcdefg1.23456789">
|
199
|
+
|
200
|
+
# create an empty client object and will not do the login
|
201
|
+
|
202
|
+
[3] pry(main)> empty_client = new_client(false)
|
203
|
+
> #<CS::Client:0x00000004cf2cf0 @base_uri="https://api.sense-os.nl">
|
204
|
+
```
|
205
|
+
|
132
206
|
## Testing
|
133
207
|
|
134
208
|
$ cp spec/support/spec_config.yml.sample spec/support/spec_config.yml
|
data/bin/cs
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# (C) Ahmy Yulrizka (ahmy@sense-os.nl)
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {password: '', double: false}
|
8
|
+
|
9
|
+
def print_help
|
10
|
+
<<EOL
|
11
|
+
|
12
|
+
Available commands are:
|
13
|
+
|
14
|
+
console Run REPL console based on PRY
|
15
|
+
password Generate hased password from plaintext
|
16
|
+
|
17
|
+
EOL
|
18
|
+
end
|
19
|
+
|
20
|
+
def print_error_and_exit(message, code=1)
|
21
|
+
puts "Error: #{message}"
|
22
|
+
exit code
|
23
|
+
end
|
24
|
+
|
25
|
+
if ARGV.empty?
|
26
|
+
puts "Usage: cs <command>"
|
27
|
+
puts print_help
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
|
31
|
+
current_path = File.dirname(__FILE__)
|
32
|
+
|
33
|
+
if ARGV[0].nil? or ARGV[0].empty?
|
34
|
+
print_error_and_exit("Invalid command")
|
35
|
+
end
|
36
|
+
|
37
|
+
command = ARGV[0]
|
38
|
+
executable = "cs-#{command}"
|
39
|
+
executable_path = File.join(current_path, executable)
|
40
|
+
|
41
|
+
if !File.exists?(executable_path)
|
42
|
+
OptionParser.new do |opts|
|
43
|
+
opts.banner = "Usage: cs <command>"
|
44
|
+
|
45
|
+
opts.separator ""
|
46
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
47
|
+
|
48
|
+
puts opts
|
49
|
+
puts print_help
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end.parse!
|
53
|
+
|
54
|
+
print_error_and_exit("Invalid command '#{command}'")
|
55
|
+
end
|
56
|
+
|
57
|
+
arguments = ARGV.slice(1..-1)
|
58
|
+
exec(executable_path, *arguments)
|
data/bin/cs-console
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# (C) Ahmy Yulrizka (ahmy@sense-os.nl)
|
4
|
+
|
5
|
+
$0 = 'pry'
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'pry'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rubygems'
|
11
|
+
require 'pry'
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'cs'
|
15
|
+
require 'logger'
|
16
|
+
require 'optparse'
|
17
|
+
require 'digest/md5'
|
18
|
+
|
19
|
+
DEBUG = Logger::DEBUG
|
20
|
+
ERROR = Logger::ERROR
|
21
|
+
FATAL = Logger::FATAL
|
22
|
+
INFO = Logger::INFO
|
23
|
+
UNKNOWN = Logger::UNKNOWN
|
24
|
+
WARN = Logger::WARN
|
25
|
+
|
26
|
+
CS::load_CLI
|
27
|
+
|
28
|
+
##
|
29
|
+
# OPTION Parsing
|
30
|
+
##
|
31
|
+
OPTIONS = {
|
32
|
+
config_file: "#{ENV['HOME']}/.cs.yml",
|
33
|
+
log_level: INFO
|
34
|
+
}
|
35
|
+
|
36
|
+
OptionParser.new do |opts|
|
37
|
+
opts.banner = "Usage: cs console [options]"
|
38
|
+
|
39
|
+
opts.on("-c", "--config", "Config file default to #{OPTIONS[:config_file]}") do |v|
|
40
|
+
OPTIONS[:config_file] = v
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on("-v", "--verbosity <log_level>", "Log verbosity. <log_level> is one of: debug, error, fatal, info, unknown, warns. Default to info") do |v|
|
44
|
+
mapping = {
|
45
|
+
"debug" => DEBUG,
|
46
|
+
"error" => ERROR,
|
47
|
+
"fatal" => FATAL,
|
48
|
+
"info" => INFO,
|
49
|
+
"unknown" => UNKNOWN,
|
50
|
+
"warns" => WARN
|
51
|
+
}
|
52
|
+
|
53
|
+
level = mapping[v.downcase]
|
54
|
+
OPTIONS[:log_level] = level
|
55
|
+
end
|
56
|
+
|
57
|
+
opts.separator ""
|
58
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
59
|
+
puts opts
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
end.parse!
|
63
|
+
|
64
|
+
##
|
65
|
+
# Helper Method
|
66
|
+
##
|
67
|
+
|
68
|
+
STDOUT_LOGGER = Logger.new(STDOUT)
|
69
|
+
STDOUT_LOGGER.level = OPTIONS[:log_level]
|
70
|
+
|
71
|
+
def print_error(message)
|
72
|
+
STDERR.puts "Error: #{message}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def config(key=nil)
|
76
|
+
CS::CLI::Config::get(key)
|
77
|
+
end
|
78
|
+
|
79
|
+
def new_client(user=nil)
|
80
|
+
client = CS::Client.new
|
81
|
+
|
82
|
+
if user == false
|
83
|
+
return client
|
84
|
+
end
|
85
|
+
|
86
|
+
user_creds = nil
|
87
|
+
if user == false
|
88
|
+
return client
|
89
|
+
elsif user == nil # load default user
|
90
|
+
default_user = config["default_user"]
|
91
|
+
user_creds = config["users"][default_user] rescue nil
|
92
|
+
else # load user by reference
|
93
|
+
user_creds = config["users"][user]
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
username = user_creds["username"]
|
98
|
+
password = user_creds["password_md5"]
|
99
|
+
|
100
|
+
if password.nil? || password.empty?
|
101
|
+
password = user_creds["password"]
|
102
|
+
password = Digest::MD5.hexdigest(password)
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
if client.login!(username, password, false)
|
107
|
+
STDOUT.puts "Successfully logged in with user '#{username}'"
|
108
|
+
else
|
109
|
+
print_error("Failed login with user #{username} -> #{client.session.errors}")
|
110
|
+
end
|
111
|
+
|
112
|
+
client.session.logger = STDOUT_LOGGER
|
113
|
+
client
|
114
|
+
end
|
115
|
+
|
116
|
+
def set_log_level(level)
|
117
|
+
OPTIONS[:log_level] = level
|
118
|
+
STDOUT_LOGGER.level = level
|
119
|
+
end
|
120
|
+
|
121
|
+
def const_to_level_log(value)
|
122
|
+
mapping = {
|
123
|
+
DEBUG => "debug",
|
124
|
+
ERROR => "error",
|
125
|
+
FATAL => "fatal",
|
126
|
+
INFO => "info",
|
127
|
+
UNKNOWN => "unknown",
|
128
|
+
WARN => "warns"
|
129
|
+
}
|
130
|
+
|
131
|
+
mapping[value]
|
132
|
+
end
|
133
|
+
|
134
|
+
def log_level?
|
135
|
+
const_to_level_log(OPTIONS[:log_level])
|
136
|
+
end
|
137
|
+
|
138
|
+
##
|
139
|
+
# MAIN
|
140
|
+
##
|
141
|
+
|
142
|
+
begin
|
143
|
+
CS::CLI::Config::load_config(OPTIONS[:config_file])
|
144
|
+
rescue => e
|
145
|
+
if File.exists?(OPTIONS[:config_file])
|
146
|
+
throw e
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
puts "CS console #{CS::VERSION}"
|
151
|
+
puts
|
152
|
+
|
153
|
+
# Process command line options and run Pry
|
154
|
+
Pry::CLI.parse_options
|
data/bin/cs-password
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# (C) Ahmy Yulrizka (ahmy@sense-os.nl)
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
require 'io/console'
|
7
|
+
require 'digest/md5'
|
8
|
+
|
9
|
+
options = {password: '', double: false}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = "Usage: cs password [options]"
|
12
|
+
|
13
|
+
opts.on("-p", "--password password", "pass password as command line") do |v|
|
14
|
+
options[:password] = v
|
15
|
+
end
|
16
|
+
|
17
|
+
opts.on("-d", "--double-md5", "Hash the password twice") do
|
18
|
+
options[:double] = true
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.separator ""
|
22
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
23
|
+
|
24
|
+
puts opts
|
25
|
+
exit
|
26
|
+
end
|
27
|
+
end.parse!
|
28
|
+
|
29
|
+
def hash(plaintext)
|
30
|
+
Digest::MD5.hexdigest(plaintext)
|
31
|
+
end
|
32
|
+
|
33
|
+
if options[:password].nil? || options[:password].empty?
|
34
|
+
print "password:"
|
35
|
+
v = STDIN.noecho(&:gets).chomp
|
36
|
+
options[:password] = v
|
37
|
+
end
|
38
|
+
|
39
|
+
retval = hash(options[:password])
|
40
|
+
|
41
|
+
retval = hash(retval) if options[:double]
|
42
|
+
|
43
|
+
puts
|
44
|
+
puts retval
|
data/cs.gemspec
CHANGED
@@ -8,6 +8,8 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.summary = %q{Client library to communicate with CommonSense written in ruby}
|
9
9
|
gem.homepage = "https://github.com/senseobservationsystems/commonsense-ruby-lib"
|
10
10
|
|
11
|
+
gem.required_ruby_version = '>= 1.9.3'
|
12
|
+
|
11
13
|
gem.files = `git ls-files`.split($\)
|
12
14
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
@@ -15,6 +17,7 @@ Gem::Specification.new do |gem|
|
|
15
17
|
gem.require_paths = ["lib"]
|
16
18
|
gem.version = CS::VERSION
|
17
19
|
gem.add_development_dependency("launchy", "~> 2.3")
|
18
|
-
gem.
|
20
|
+
gem.add_development_dependency("pry", "~> 0.9.12.6")
|
21
|
+
gem.add_dependency('httparty', '~> 0.12')
|
19
22
|
gem.add_dependency('oauth', '~> 0.4')
|
20
23
|
end
|
data/lib/cs.rb
CHANGED
@@ -9,12 +9,17 @@ require "cs/end_point/user"
|
|
9
9
|
require "cs/end_point/group"
|
10
10
|
require "cs/end_point/sensor"
|
11
11
|
require "cs/end_point/sensor_data"
|
12
|
+
require "cs/end_point/trigger"
|
13
|
+
require "cs/end_point/notification"
|
12
14
|
require "cs/parameter_processor"
|
13
15
|
require "cs/relation"
|
14
16
|
require "cs/relation/sensor_relation"
|
15
17
|
require "cs/relation/sensor_data_relation"
|
16
18
|
require "cs/relation/user_relation"
|
17
19
|
require "cs/relation/group_relation"
|
20
|
+
require "cs/relation/trigger_relation"
|
21
|
+
require "cs/relation/notification_relation"
|
22
|
+
require "cs/collection/sensor_data_collection"
|
18
23
|
|
19
24
|
module CS
|
20
25
|
|
@@ -65,10 +70,10 @@ module CS
|
|
65
70
|
#
|
66
71
|
# client = CS::Client.new
|
67
72
|
# client.login!('username', 'password')
|
68
|
-
def login!(user, password)
|
73
|
+
def login!(user, password, digest=true)
|
69
74
|
@session = Session.new(base_uri: @base_uri)
|
70
75
|
@session.logger = logger
|
71
|
-
@session.login(user, password)
|
76
|
+
@session.login(user, password, digest)
|
72
77
|
end
|
73
78
|
|
74
79
|
# Create a new session to CommonSense using username and plain text password
|
@@ -76,8 +81,8 @@ module CS
|
|
76
81
|
#
|
77
82
|
# client = CS::Client.new
|
78
83
|
# client.login('username', 'password')
|
79
|
-
def login(user, password)
|
80
|
-
login!(user, password) rescue false
|
84
|
+
def login(user, password, digest=true)
|
85
|
+
login!(user, password, digest) rescue false
|
81
86
|
end
|
82
87
|
|
83
88
|
# Create a new session to CommonSense using OAuth credentials
|
@@ -100,6 +105,16 @@ module CS
|
|
100
105
|
@session.session_id = session_id
|
101
106
|
end
|
102
107
|
|
108
|
+
# Create new session by specifying api_key
|
109
|
+
#
|
110
|
+
# client = CS::Client.new
|
111
|
+
# client.session_id = '12345'
|
112
|
+
def api_key=(api_key)
|
113
|
+
@session = Session.new(base_uri: @base_uri)
|
114
|
+
@session.logger = logger
|
115
|
+
@session.api_key = api_key
|
116
|
+
end
|
117
|
+
|
103
118
|
# Retrun logged in user
|
104
119
|
def current_user
|
105
120
|
user = EndPoint::User.new
|
@@ -133,6 +148,14 @@ module CS
|
|
133
148
|
Relation::GroupRelation.new(@session)
|
134
149
|
end
|
135
150
|
|
151
|
+
def triggers
|
152
|
+
Relation::TriggerRelation.new(@session)
|
153
|
+
end
|
154
|
+
|
155
|
+
def notifications
|
156
|
+
Relation::NotificationRelation.new(@session)
|
157
|
+
end
|
158
|
+
|
136
159
|
def current_groups
|
137
160
|
group = EndPoint::Group.new
|
138
161
|
group.session = @session
|
@@ -145,5 +168,9 @@ module CS
|
|
145
168
|
return @session.errors if @session
|
146
169
|
end
|
147
170
|
end
|
171
|
+
|
172
|
+
def self.load_CLI
|
173
|
+
require "cs/cli/cli"
|
174
|
+
end
|
148
175
|
end
|
149
176
|
|