cybercoach 0.1.0
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.
- checksums.yaml +7 -0
- data/.--color +0 -0
- data/.gitignore +53 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/cybercoach.gemspec +27 -0
- data/lib/cybercoach/abstract_resource.rb +74 -0
- data/lib/cybercoach/format_not_supported_error.rb +4 -0
- data/lib/cybercoach/http_error.rb +10 -0
- data/lib/cybercoach/not_implemented_error.rb +4 -0
- data/lib/cybercoach/partnership.rb +44 -0
- data/lib/cybercoach/resource.rb +73 -0
- data/lib/cybercoach/resource_page.rb +88 -0
- data/lib/cybercoach/settings.rb +6 -0
- data/lib/cybercoach/sport.rb +30 -0
- data/lib/cybercoach/user.rb +48 -0
- data/lib/cybercoach/version.rb +3 -0
- data/lib/cybercoach.rb +10 -0
- data/spec/lib/cyber_coach_spec.rb +284 -0
- data/spec/spec_helper.rb +11 -0
- metadata +140 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: e6a9a92ac6f4d0a0056b5e31ea9717363fccd5fd
|
|
4
|
+
data.tar.gz: 37fb5abb5d3fd402380e28d2d4fcbc6754b34621
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: c737a573870e7403031a28189684e7b4947be3353a05507d087cf7b570c6e88f81228234e9f0e42d016edcef74ee24149c0fb6994827ce12792429ebc6f0eecb
|
|
7
|
+
data.tar.gz: 86d6ede3842a3ddac0cae4cbfcb54813ce792e7437736ce52b0193cd639b96829f302e3d5d484d6b4319998ce2f4b406e295bbf90db5d973f71aa4bffe965264
|
data/.--color
ADDED
|
File without changes
|
data/.gitignore
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/.bundle/
|
|
2
|
+
/.yardoc
|
|
3
|
+
/Gemfile.lock
|
|
4
|
+
/_yardoc/
|
|
5
|
+
/coverage/
|
|
6
|
+
/doc/
|
|
7
|
+
/pkg/
|
|
8
|
+
/spec/reports/
|
|
9
|
+
/tmp/
|
|
10
|
+
*.bundle
|
|
11
|
+
*.so
|
|
12
|
+
*.o
|
|
13
|
+
*.a
|
|
14
|
+
mkmf.log
|
|
15
|
+
|
|
16
|
+
# Created by https://www.gitignore.io
|
|
17
|
+
|
|
18
|
+
### Ruby ###
|
|
19
|
+
*.gem
|
|
20
|
+
*.rbc
|
|
21
|
+
/.config
|
|
22
|
+
/coverage/
|
|
23
|
+
/InstalledFiles
|
|
24
|
+
/pkg/
|
|
25
|
+
/spec/reports/
|
|
26
|
+
/test/tmp/
|
|
27
|
+
/test/version_tmp/
|
|
28
|
+
/tmp/
|
|
29
|
+
|
|
30
|
+
## Specific to RubyMotion:
|
|
31
|
+
.dat*
|
|
32
|
+
.repl_history
|
|
33
|
+
build/
|
|
34
|
+
|
|
35
|
+
## Documentation cache and generated files:
|
|
36
|
+
/.yardoc/
|
|
37
|
+
/_yardoc/
|
|
38
|
+
/doc/
|
|
39
|
+
/rdoc/
|
|
40
|
+
|
|
41
|
+
## Environment normalisation:
|
|
42
|
+
/.bundle/
|
|
43
|
+
/lib/bundler/man/
|
|
44
|
+
|
|
45
|
+
# for a library or gem, you might want to ignore these files since the code is
|
|
46
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
47
|
+
# Gemfile.lock
|
|
48
|
+
# .ruby-version
|
|
49
|
+
# .ruby-gemset
|
|
50
|
+
|
|
51
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
|
52
|
+
.rvmrc
|
|
53
|
+
|
data/.rspec
ADDED
data/.ruby-gemset
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cybercoach
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby-2.1.3
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2014 NewYorkFalcons
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Cybercoach
|
|
2
|
+
|
|
3
|
+
TODO: Write a gem description
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'cybercoach'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
$ bundle
|
|
16
|
+
|
|
17
|
+
Or install it yourself as:
|
|
18
|
+
|
|
19
|
+
$ gem install cybercoach
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
TODO: Write usage instructions here
|
|
24
|
+
|
|
25
|
+
## Contributing
|
|
26
|
+
|
|
27
|
+
1. Fork it ( https://github.com/[my-github-username]/cybercoach/fork )
|
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
31
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/cybercoach.gemspec
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'cybercoach/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "cybercoach"
|
|
8
|
+
spec.version = Cybercoach::VERSION
|
|
9
|
+
spec.authors = ["Manuel Leuenberger"]
|
|
10
|
+
spec.email = ["manuel.leu@students.unibe.ch"]
|
|
11
|
+
spec.summary = %q{Cybercoach proxy}
|
|
12
|
+
spec.description = %q{Wraps the CyberCoach resources and their CRUD methods.}
|
|
13
|
+
spec.homepage = "https://github.com/New-York-Falcons/cybercoach"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_runtime_dependency "httparty", "~> 0.13"
|
|
22
|
+
|
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.1"
|
|
26
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
|
27
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require 'httparty'
|
|
2
|
+
require 'cybercoach/http_error'
|
|
3
|
+
|
|
4
|
+
module CyberCoach
|
|
5
|
+
class AbstractResource < Object
|
|
6
|
+
include HTTParty
|
|
7
|
+
attr_accessor :uri
|
|
8
|
+
|
|
9
|
+
headers 'Content-Type' => 'application/json' ,'Accept' => 'application/json'
|
|
10
|
+
format :json
|
|
11
|
+
base_uri CyberCoach::Settings::SERVER_URI
|
|
12
|
+
|
|
13
|
+
def initialize
|
|
14
|
+
super
|
|
15
|
+
@uri = nil
|
|
16
|
+
@options = {}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def read(options={})
|
|
20
|
+
invalidate_uri
|
|
21
|
+
invalidate_options
|
|
22
|
+
options = @options.merge(options)
|
|
23
|
+
response = self.class.get(@uri, options)
|
|
24
|
+
if response.success?
|
|
25
|
+
from_serializable(response)
|
|
26
|
+
else
|
|
27
|
+
raise HttpError.new(response.response)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def serialize
|
|
32
|
+
format = self.class.default_options[:format]
|
|
33
|
+
if format.nil?
|
|
34
|
+
to_serializable
|
|
35
|
+
elsif format == :json
|
|
36
|
+
to_serializable.to_json
|
|
37
|
+
else
|
|
38
|
+
raise FormatNotSupportedError.new
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def from_serializable(serializable)
|
|
43
|
+
@uri = serializable['uri']
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def to_serializable
|
|
47
|
+
serializable = {}
|
|
48
|
+
serializable['uri'] = @uri
|
|
49
|
+
serializable
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Returns the plural name used for parsing and building URIs.
|
|
53
|
+
def plural_name
|
|
54
|
+
raise NotImplementedError.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns the base URI relative to the server.
|
|
58
|
+
def resource_base_uri
|
|
59
|
+
"#{CyberCoach::Settings::BASE_URI}/#{plural_name}/"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
protected
|
|
63
|
+
|
|
64
|
+
# Recalculates the URI from the attributes.
|
|
65
|
+
def invalidate_uri
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Recalculates the request options from the attributes.
|
|
70
|
+
def invalidate_options
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module CyberCoach
|
|
2
|
+
class Partnership < Resource
|
|
3
|
+
attr_accessor :proposer,
|
|
4
|
+
:proposed,
|
|
5
|
+
:confirmed_by_proposer,
|
|
6
|
+
:confirmed_by_proposed,
|
|
7
|
+
:public_visible
|
|
8
|
+
|
|
9
|
+
def from_serializable(serializable)
|
|
10
|
+
super(serializable)
|
|
11
|
+
@proposer = User.new
|
|
12
|
+
unless serializable['user1'].nil?
|
|
13
|
+
@proposer.from_serializable(serializable['user1'])
|
|
14
|
+
end
|
|
15
|
+
@proposed = User.new
|
|
16
|
+
unless serializable['user2'].nil?
|
|
17
|
+
@proposed.from_serializable(serializable['user2'])
|
|
18
|
+
end
|
|
19
|
+
@confirmed_by_proposer = serializable['userconfirmed1']
|
|
20
|
+
@confirmed_by_proposed = serializable['userconfirmed2']
|
|
21
|
+
@public_visible = serializable['publicvisible']
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_serializable()
|
|
25
|
+
serializable = super()
|
|
26
|
+
serializable['user1'] = @proposer.to_serializable
|
|
27
|
+
serializable['user2'] = @proposed.to_serializable
|
|
28
|
+
serializable['publicvisible'] = @public_visible
|
|
29
|
+
serializable
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def plural_name
|
|
33
|
+
'partnerships'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
protected
|
|
37
|
+
|
|
38
|
+
def invalidate_uri
|
|
39
|
+
unless @proposer.nil? or @proposed.nil?
|
|
40
|
+
@uri = "#{resource_base_uri}#{@proposer.username};#{@proposed.username}/"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#require 'cybercoach/abstract_resource'
|
|
2
|
+
|
|
3
|
+
module CyberCoach
|
|
4
|
+
class Resource < AbstractResource
|
|
5
|
+
attr_accessor :id
|
|
6
|
+
|
|
7
|
+
def self.read_all
|
|
8
|
+
page = ResourcePage.new(self)
|
|
9
|
+
page.read()
|
|
10
|
+
page
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create(options={})
|
|
14
|
+
invalidate_uri
|
|
15
|
+
invalidate_options
|
|
16
|
+
options = @options.merge(options).merge({
|
|
17
|
+
body: serialize
|
|
18
|
+
})
|
|
19
|
+
if @uri.nil? or @uri.empty?
|
|
20
|
+
response = self.class.post(self.class.resource_base_uri, options)
|
|
21
|
+
if response.success?
|
|
22
|
+
@uri = response.headers['location']
|
|
23
|
+
else
|
|
24
|
+
raise HttpError.new(response.response)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
response = self.class.put(@uri, options)
|
|
28
|
+
if response.success?
|
|
29
|
+
from_serializable(response)
|
|
30
|
+
else
|
|
31
|
+
raise HttpError.new(response.response)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def update(options={})
|
|
37
|
+
invalidate_uri
|
|
38
|
+
invalidate_options
|
|
39
|
+
options = @options.merge(options).merge({
|
|
40
|
+
body: serialize
|
|
41
|
+
})
|
|
42
|
+
response = self.class.put(@uri, options)
|
|
43
|
+
if response.success?
|
|
44
|
+
from_serializable(response)
|
|
45
|
+
else
|
|
46
|
+
raise HttpError.new(response.response)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def delete(options={})
|
|
51
|
+
invalidate_uri
|
|
52
|
+
invalidate_options
|
|
53
|
+
options = @options.merge(options)
|
|
54
|
+
response = self.class.delete(@uri, options)
|
|
55
|
+
if response.success?
|
|
56
|
+
from_serializable(response)
|
|
57
|
+
else
|
|
58
|
+
raise HttpError.new(response.response)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def from_serializable(serializable)
|
|
63
|
+
super(serializable)
|
|
64
|
+
@id = serializable['id']
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def to_serializable()
|
|
68
|
+
serializable = super()
|
|
69
|
+
serializable['id'] = @id
|
|
70
|
+
serializable
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'cybercoach/abstract_resource'
|
|
2
|
+
|
|
3
|
+
module CyberCoach
|
|
4
|
+
class ResourcePage < AbstractResource
|
|
5
|
+
class NoNextPageError < StandardError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoPreviousPageError < StandardError
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_accessor :start, :end, :size, :available, :type, :items
|
|
12
|
+
|
|
13
|
+
def initialize(type)
|
|
14
|
+
super()
|
|
15
|
+
@type = type
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def next(options={})
|
|
19
|
+
if @next.nil?
|
|
20
|
+
raise NoNextPageError.new
|
|
21
|
+
end
|
|
22
|
+
invalidate_options
|
|
23
|
+
options = @options.merge(options)
|
|
24
|
+
response = self.class.get(@next['href'], options)
|
|
25
|
+
if response.success?
|
|
26
|
+
page = self.class.new(@type)
|
|
27
|
+
page.from_serializable(response)
|
|
28
|
+
page
|
|
29
|
+
else
|
|
30
|
+
raise HttpError.new(response.response)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def previous(options={})
|
|
35
|
+
if @previous.nil?
|
|
36
|
+
raise NoPreviousPageError.new
|
|
37
|
+
end
|
|
38
|
+
invalidate_options
|
|
39
|
+
options = @options.merge(options)
|
|
40
|
+
response = self.class.get(@previous['href'], options)
|
|
41
|
+
if response.success?
|
|
42
|
+
page = self.class.new(@type)
|
|
43
|
+
page.from_serializable(response)
|
|
44
|
+
page
|
|
45
|
+
else
|
|
46
|
+
raise HttpError.new(response.response)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def from_serializable(serializable)
|
|
51
|
+
super(serializable)
|
|
52
|
+
@start = serializable['start']
|
|
53
|
+
@end = serializable['end']
|
|
54
|
+
@size = serializable['size']
|
|
55
|
+
@available = serializable['available']
|
|
56
|
+
if serializable['links'].nil?
|
|
57
|
+
@next = nil
|
|
58
|
+
@previous = nil
|
|
59
|
+
else
|
|
60
|
+
@next = serializable['links'].detect { |link| link['description'] == 'next' }
|
|
61
|
+
@previous = serializable['links'].detect { |link| link['description'] == 'previous' }
|
|
62
|
+
end
|
|
63
|
+
resource = @type.new
|
|
64
|
+
@items = serializable[resource.plural_name].collect do |item_serializable|
|
|
65
|
+
item = @type.new()
|
|
66
|
+
item.from_serializable(item_serializable)
|
|
67
|
+
item
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def plural_name
|
|
72
|
+
@type.new.plural_name
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
protected
|
|
76
|
+
|
|
77
|
+
def invalidate_uri
|
|
78
|
+
query = ''
|
|
79
|
+
unless @start.nil?
|
|
80
|
+
query = "#{query}start=#{@start}&"
|
|
81
|
+
end
|
|
82
|
+
unless @size.nil?
|
|
83
|
+
query = "#{query}size=#{@size}&"
|
|
84
|
+
end
|
|
85
|
+
@uri = "#{resource_base_uri}?#{query}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module CyberCoach
|
|
2
|
+
class Sport < Resource
|
|
3
|
+
attr_accessor :name, :description
|
|
4
|
+
|
|
5
|
+
def from_serializable(serializable)
|
|
6
|
+
super(serializable)
|
|
7
|
+
@name = serializable['name']
|
|
8
|
+
@description = serializable['description']
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_serializable()
|
|
12
|
+
serializable = super()
|
|
13
|
+
serializable['name'] = @name
|
|
14
|
+
serializable['description'] = @description
|
|
15
|
+
serializable
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def plural_name
|
|
19
|
+
'sports'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def invalidate_uri
|
|
25
|
+
unless @name.nil?
|
|
26
|
+
@uri = "#{resource_base_uri}#{@name}/"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'cybercoach/resource'
|
|
2
|
+
require 'cybercoach/http_error'
|
|
3
|
+
|
|
4
|
+
module CyberCoach
|
|
5
|
+
class User < CyberCoach::Resource
|
|
6
|
+
attr_accessor :username, :email, :password, :public_visible, :real_name
|
|
7
|
+
|
|
8
|
+
def from_serializable(serializable)
|
|
9
|
+
super(serializable)
|
|
10
|
+
@username = serializable['username']
|
|
11
|
+
@email = serializable['email']
|
|
12
|
+
# the password is never received from the server, so don't set it
|
|
13
|
+
@public_visible = serializable['publicvisible']
|
|
14
|
+
@real_name = serializable['realname']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_serializable()
|
|
18
|
+
serializable = super()
|
|
19
|
+
serializable['username'] = @username
|
|
20
|
+
serializable['email'] = @email
|
|
21
|
+
serializable['password'] = @password
|
|
22
|
+
serializable['publicvisible'] = @public_visible
|
|
23
|
+
serializable['realname'] = @real_name
|
|
24
|
+
serializable
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def plural_name
|
|
28
|
+
'users'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
protected
|
|
32
|
+
|
|
33
|
+
def invalidate_uri
|
|
34
|
+
unless @username.nil?
|
|
35
|
+
@uri = "#{resource_base_uri}#{@username}/"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def invalidate_options
|
|
40
|
+
@options = @options.merge({
|
|
41
|
+
:basic_auth => {
|
|
42
|
+
:username => @username,
|
|
43
|
+
:password => @password
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
data/lib/cybercoach.rb
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
require 'pry'
|
|
3
|
+
|
|
4
|
+
require 'cybercoach'
|
|
5
|
+
require 'cybercoach/resource_page'
|
|
6
|
+
require 'cybercoach/user'
|
|
7
|
+
require 'cybercoach/sport'
|
|
8
|
+
|
|
9
|
+
describe 'CyberCoach' do
|
|
10
|
+
it 'should have a base URI' do
|
|
11
|
+
expect(CyberCoach::Settings::BASE_URI).not_to be_nil
|
|
12
|
+
end
|
|
13
|
+
it 'should have a server URI' do
|
|
14
|
+
expect(CyberCoach::Settings::SERVER_URI).not_to be_nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe 'ResourcePage' do
|
|
18
|
+
before(:example) do
|
|
19
|
+
@page = CyberCoach::User.read_all()
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should have meta data', focus:true do
|
|
23
|
+
expect(@page.items.size).to eq(5)
|
|
24
|
+
expect(@page.start).to eq(0)
|
|
25
|
+
expect(@page.end).to eq(5)
|
|
26
|
+
expect(@page.available).to be > 5
|
|
27
|
+
expect(@page.type).to eq(CyberCoach::User)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'should have items of its type' do
|
|
31
|
+
type = @page.type
|
|
32
|
+
@page.items.each do |item|
|
|
33
|
+
expect(item).to be_a_kind_of(type)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should read itself' do
|
|
38
|
+
@page.start = 1
|
|
39
|
+
@page.size = 2
|
|
40
|
+
@page.read
|
|
41
|
+
expect(@page.items.size).to eq(2)
|
|
42
|
+
expect(@page.start).to eq(1)
|
|
43
|
+
expect(@page.end).to eq(3)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should be able to navigate between pages' do
|
|
47
|
+
expect{@page.previous}.to raise_error(CyberCoach::ResourcePage::NoPreviousPageError)
|
|
48
|
+
next_page = @page.next
|
|
49
|
+
expect(next_page.items).not_to be_empty
|
|
50
|
+
expect(next_page.start).to eq(@page.end)
|
|
51
|
+
expect(next_page.end).to eq(next_page.start + 5)
|
|
52
|
+
expect(next_page.available).to eq(@page.available)
|
|
53
|
+
expect(next_page.type).to eq(@page.type)
|
|
54
|
+
expect(next_page.items[0].uri).not_to eq(@page.items[0].uri)
|
|
55
|
+
next_previous_page = next_page.previous
|
|
56
|
+
expect(next_previous_page.items[0].uri).to eq(@page.items[0].uri)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe 'Sport' do
|
|
61
|
+
before(:example) do
|
|
62
|
+
@sport = CyberCoach::Sport.new()
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should read itself' do
|
|
66
|
+
@sport.name = 'Running'
|
|
67
|
+
@sport.read
|
|
68
|
+
expect(@sport.id).not_to be_nil
|
|
69
|
+
expect(@sport.uri).not_to be_nil
|
|
70
|
+
expect(@sport.name).not_to be_nil
|
|
71
|
+
expect(@sport.description).not_to be_nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'should raise an error if it does not exist' do
|
|
75
|
+
@sport.name = 'Pants'
|
|
76
|
+
expect{@sport.read}.to raise_error(CyberCoach::HttpError)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'should read all' do
|
|
80
|
+
sports = CyberCoach::Sport.read_all()
|
|
81
|
+
expect(sports.items.size).to eq(4)
|
|
82
|
+
expect{sports.next}.to raise_error(CyberCoach::ResourcePage::NoNextPageError)
|
|
83
|
+
expect{sports.previous}.to raise_error(CyberCoach::ResourcePage::NoPreviousPageError)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe 'User' do
|
|
88
|
+
before(:example) do
|
|
89
|
+
@user = CyberCoach::User.new()
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'should raise an error if it does not exist' do
|
|
93
|
+
@user.username = 'gnirloff'
|
|
94
|
+
expect{@user.read}.to raise_error(CyberCoach::HttpError)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'should read all' do
|
|
98
|
+
users = CyberCoach::User.read_all()
|
|
99
|
+
expect(users.items.size).to eq(5)
|
|
100
|
+
expect(users.next).not_to be_nil
|
|
101
|
+
expect{users.previous}.to raise_error(CyberCoach::ResourcePage::NoPreviousPageError)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe 'crud' do
|
|
105
|
+
before(:example) do
|
|
106
|
+
@user.username = 'newyorkfalconstest1'
|
|
107
|
+
@user.password = 'fancypants'
|
|
108
|
+
@user.email = 'newyorkfalconstest1@newyorkfalcons.ch'
|
|
109
|
+
@user.public_visible = 1
|
|
110
|
+
@user.real_name = 'New York Falcons Test 1'
|
|
111
|
+
begin
|
|
112
|
+
@user.delete
|
|
113
|
+
rescue CyberCoach::HttpError => error
|
|
114
|
+
# don't care
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
after(:example) do
|
|
119
|
+
begin
|
|
120
|
+
@user.delete
|
|
121
|
+
rescue CyberCoach::HttpError => error
|
|
122
|
+
# don't care
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it 'should create itself without nilling the password' do
|
|
127
|
+
old_uri = @user.uri
|
|
128
|
+
old_password = @user.password
|
|
129
|
+
@user.create
|
|
130
|
+
expect(@user.uri).to eq(old_uri)
|
|
131
|
+
expect(@user.password).to eq(old_password)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should read itself without nilling the password' do
|
|
135
|
+
old_password = @user.password
|
|
136
|
+
@user.create
|
|
137
|
+
@user.read
|
|
138
|
+
# users do not have an id
|
|
139
|
+
expect(@user.id).to be_nil
|
|
140
|
+
expect(@user.uri).not_to be_nil
|
|
141
|
+
expect(@user.username).not_to be_nil
|
|
142
|
+
expect(@user.email).not_to be_nil
|
|
143
|
+
expect(@user.password).to eq(old_password)
|
|
144
|
+
expect(@user.public_visible).not_to be_nil
|
|
145
|
+
expect(@user.real_name).not_to be_nil
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'should update itself without nilling the password' do
|
|
149
|
+
@user.create
|
|
150
|
+
old_password = @user.password
|
|
151
|
+
old_real_name = @user.real_name
|
|
152
|
+
new_real_name = 'habakuck'
|
|
153
|
+
@user.real_name = new_real_name
|
|
154
|
+
@user.update
|
|
155
|
+
expect(@user.password).to eq(old_password)
|
|
156
|
+
expect(@user.real_name).not_to eq(old_real_name)
|
|
157
|
+
expect(@user.real_name).to eq(new_real_name)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'should delete itself' do
|
|
161
|
+
@user.create
|
|
162
|
+
@user.delete
|
|
163
|
+
expect{@user.read}.to raise_error(CyberCoach::HttpError)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
describe 'Partnership' do
|
|
169
|
+
before(:context) do
|
|
170
|
+
@proposer = CyberCoach::User.new()
|
|
171
|
+
@proposer.username = 'newyorkfalconstest1'
|
|
172
|
+
@proposer.password = 'fancypants'
|
|
173
|
+
@proposer.email = 'newyorkfalconstest1@newyorkfalcons.ch'
|
|
174
|
+
@proposer.public_visible = 1
|
|
175
|
+
@proposer.real_name = 'New York Falcons Test 1'
|
|
176
|
+
@proposed = CyberCoach::User.new()
|
|
177
|
+
@proposed.username = 'newyorkfalconstest2'
|
|
178
|
+
@proposed.password = 'fancypants'
|
|
179
|
+
@proposed.email = 'newyorkfalconstest2@newyorkfalcons.ch'
|
|
180
|
+
@proposed.public_visible = 1
|
|
181
|
+
@proposed.real_name = 'New York Falcons Test 2'
|
|
182
|
+
begin
|
|
183
|
+
@proposer.delete
|
|
184
|
+
rescue CyberCoach::HttpError => error
|
|
185
|
+
# don't care
|
|
186
|
+
end
|
|
187
|
+
begin
|
|
188
|
+
@proposed.delete
|
|
189
|
+
rescue CyberCoach::HttpError => error
|
|
190
|
+
# don't care
|
|
191
|
+
end
|
|
192
|
+
@proposer.create
|
|
193
|
+
@proposed.create
|
|
194
|
+
@options = {
|
|
195
|
+
:basic_auth => {
|
|
196
|
+
:username => @proposer.username,
|
|
197
|
+
:password => @proposer.password
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
after(:context) do
|
|
203
|
+
begin
|
|
204
|
+
@proposer.delete
|
|
205
|
+
rescue CyberCoach::HttpError => error
|
|
206
|
+
# don't care
|
|
207
|
+
end
|
|
208
|
+
begin
|
|
209
|
+
@proposed.delete
|
|
210
|
+
rescue CyberCoach::HttpError => error
|
|
211
|
+
# don't care
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
before(:example) do
|
|
216
|
+
@partnership = CyberCoach::Partnership.new
|
|
217
|
+
@partnership.proposer = @proposer
|
|
218
|
+
@partnership.proposed = @proposed
|
|
219
|
+
@partnership.public_visible = 1
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
it 'should raise an error if it does not exist' do
|
|
223
|
+
expect{@partnership.read(@options)}.to raise_error(CyberCoach::HttpError)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it 'should read all' do
|
|
227
|
+
partnerships = CyberCoach::Partnership.read_all()
|
|
228
|
+
expect(partnerships.items).not_to be_empty
|
|
229
|
+
expect(partnerships.next).not_to be_nil
|
|
230
|
+
expect{partnerships.previous}.to raise_error(CyberCoach::ResourcePage::NoPreviousPageError)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
describe 'crud' do
|
|
234
|
+
before(:example) do
|
|
235
|
+
begin
|
|
236
|
+
@partnership.delete(@options)
|
|
237
|
+
rescue CyberCoach::HttpError => error
|
|
238
|
+
# don't care
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
after(:example) do
|
|
243
|
+
begin
|
|
244
|
+
@partnership.delete(@options)
|
|
245
|
+
rescue CyberCoach::HttpError => error
|
|
246
|
+
# don't care
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it 'should create itself' do
|
|
251
|
+
@partnership.create(@options)
|
|
252
|
+
expect(@partnership.id).not_to be_nil
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it 'should read itself' do
|
|
256
|
+
@partnership.create(@options)
|
|
257
|
+
@partnership.read(@options)
|
|
258
|
+
expect(@partnership.id).not_to be_nil
|
|
259
|
+
expect(@partnership.uri).not_to be_nil
|
|
260
|
+
expect(@partnership.proposer.username).to eq(@proposer.username)
|
|
261
|
+
expect(@partnership.proposed.username).to eq(@proposed.username)
|
|
262
|
+
expect(@partnership.confirmed_by_proposer).to be_truthy
|
|
263
|
+
expect(@partnership.confirmed_by_proposed).to be_falsy
|
|
264
|
+
expect(@partnership.public_visible).not_to be_nil
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it 'should update itself' do
|
|
268
|
+
@partnership.create(@options)
|
|
269
|
+
old_public_visible = @partnership.public_visible
|
|
270
|
+
new_public_visible = 2
|
|
271
|
+
@partnership.public_visible = new_public_visible
|
|
272
|
+
@partnership.update(@options)
|
|
273
|
+
expect(@partnership.public_visible).not_to eq(old_public_visible)
|
|
274
|
+
expect(@partnership.public_visible).to eq(new_public_visible)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it 'should delete itself' do
|
|
278
|
+
@partnership.create(@options)
|
|
279
|
+
@partnership.delete(@options)
|
|
280
|
+
expect{@partnership.read}.to raise_error(CyberCoach::HttpError)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: cybercoach
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Manuel Leuenberger
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-10-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: httparty
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.13'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0.13'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: bundler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.7'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.7'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rake
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '10.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '10.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rspec
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '3.1'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '3.1'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: pry
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0.10'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0.10'
|
|
83
|
+
description: Wraps the CyberCoach resources and their CRUD methods.
|
|
84
|
+
email:
|
|
85
|
+
- manuel.leu@students.unibe.ch
|
|
86
|
+
executables: []
|
|
87
|
+
extensions: []
|
|
88
|
+
extra_rdoc_files: []
|
|
89
|
+
files:
|
|
90
|
+
- ".--color"
|
|
91
|
+
- ".gitignore"
|
|
92
|
+
- ".rspec"
|
|
93
|
+
- ".ruby-gemset"
|
|
94
|
+
- ".ruby-version"
|
|
95
|
+
- Gemfile
|
|
96
|
+
- LICENSE.txt
|
|
97
|
+
- README.md
|
|
98
|
+
- Rakefile
|
|
99
|
+
- cybercoach.gemspec
|
|
100
|
+
- lib/cybercoach.rb
|
|
101
|
+
- lib/cybercoach/abstract_resource.rb
|
|
102
|
+
- lib/cybercoach/format_not_supported_error.rb
|
|
103
|
+
- lib/cybercoach/http_error.rb
|
|
104
|
+
- lib/cybercoach/not_implemented_error.rb
|
|
105
|
+
- lib/cybercoach/partnership.rb
|
|
106
|
+
- lib/cybercoach/resource.rb
|
|
107
|
+
- lib/cybercoach/resource_page.rb
|
|
108
|
+
- lib/cybercoach/settings.rb
|
|
109
|
+
- lib/cybercoach/sport.rb
|
|
110
|
+
- lib/cybercoach/user.rb
|
|
111
|
+
- lib/cybercoach/version.rb
|
|
112
|
+
- spec/lib/cyber_coach_spec.rb
|
|
113
|
+
- spec/spec_helper.rb
|
|
114
|
+
homepage: https://github.com/New-York-Falcons/cybercoach
|
|
115
|
+
licenses:
|
|
116
|
+
- MIT
|
|
117
|
+
metadata: {}
|
|
118
|
+
post_install_message:
|
|
119
|
+
rdoc_options: []
|
|
120
|
+
require_paths:
|
|
121
|
+
- lib
|
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
|
+
requirements:
|
|
124
|
+
- - ">="
|
|
125
|
+
- !ruby/object:Gem::Version
|
|
126
|
+
version: '0'
|
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - ">="
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0'
|
|
132
|
+
requirements: []
|
|
133
|
+
rubyforge_project:
|
|
134
|
+
rubygems_version: 2.2.2
|
|
135
|
+
signing_key:
|
|
136
|
+
specification_version: 4
|
|
137
|
+
summary: Cybercoach proxy
|
|
138
|
+
test_files:
|
|
139
|
+
- spec/lib/cyber_coach_spec.rb
|
|
140
|
+
- spec/spec_helper.rb
|