coach4rb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +8 -0
- data/coach4rb.gemspec +29 -0
- data/lib/coach4rb.rb +64 -0
- data/lib/coach4rb/builder.rb +142 -0
- data/lib/coach4rb/client.rb +116 -0
- data/lib/coach4rb/coach.rb +836 -0
- data/lib/coach4rb/json_response_parser.rb +11 -0
- data/lib/coach4rb/mixin/as_hash.rb +34 -0
- data/lib/coach4rb/mixin/auto_constructor.rb +71 -0
- data/lib/coach4rb/mixin/basic_auth.rb +23 -0
- data/lib/coach4rb/mixin/iterable.rb +40 -0
- data/lib/coach4rb/mixin/track_reader.rb +24 -0
- data/lib/coach4rb/mixin/track_writer.rb +19 -0
- data/lib/coach4rb/privacy.rb +11 -0
- data/lib/coach4rb/proxy.rb +143 -0
- data/lib/coach4rb/resource/entity.rb +47 -0
- data/lib/coach4rb/resource/entry.rb +126 -0
- data/lib/coach4rb/resource/page.rb +74 -0
- data/lib/coach4rb/resource/partnership.rb +37 -0
- data/lib/coach4rb/resource/sport.rb +19 -0
- data/lib/coach4rb/resource/subscription.rb +47 -0
- data/lib/coach4rb/resource/user.rb +49 -0
- data/lib/coach4rb/response_parser.rb +11 -0
- data/lib/coach4rb/version.rb +3 -0
- data/test/test_access_proxy.rb +58 -0
- data/test/test_client.rb +41 -0
- data/test/test_coach_client.rb +21 -0
- data/test/test_coach_entry.rb +141 -0
- data/test/test_coach_partnership.rb +115 -0
- data/test/test_coach_subscription.rb +110 -0
- data/test/test_coach_user.rb +191 -0
- data/test/test_entity.rb +63 -0
- data/test/test_entry_resource.rb +36 -0
- data/test/test_helper.rb +3 -0
- data/test/test_page.rb +82 -0
- data/test/test_partnership_resource.rb +69 -0
- data/test/test_sport_resource.rb +33 -0
- data/test/test_subscription_resource.rb +74 -0
- data/test/test_user_resource.rb +104 -0
- data/tools/.keep +0 -0
- metadata +190 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
module Coach4rb
|
2
|
+
|
3
|
+
module Resource
|
4
|
+
|
5
|
+
class Page
|
6
|
+
|
7
|
+
include Mixin::AutoConstructor
|
8
|
+
include Mixin::Iterable
|
9
|
+
include Mixin::AsHash
|
10
|
+
include Enumerable
|
11
|
+
|
12
|
+
attr_accessor :start, :end, :available, :links, :type, :uri
|
13
|
+
|
14
|
+
def self.from_coach(a_hash, entity_class=Entity)
|
15
|
+
new_hash = a_hash.dup
|
16
|
+
type_plural = pluralize(new_hash[:type]) if new_hash[:type]
|
17
|
+
type_plural ||= false
|
18
|
+
new_hash[:links] ||= []
|
19
|
+
new_hash[:type] = type_plural
|
20
|
+
new_hash[:entity_class] ||= entity_class
|
21
|
+
self.new new_hash
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def entities
|
26
|
+
if @type && @entities.nil?
|
27
|
+
hashes = instance_variable_get("@#{@type}")
|
28
|
+
@entities = hashes.map { |a_hash| @entity_class.from_coach a_hash }
|
29
|
+
else
|
30
|
+
@entities
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :items, :entities
|
35
|
+
|
36
|
+
def size
|
37
|
+
entities.size
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def [](key)
|
42
|
+
case key
|
43
|
+
when Integer
|
44
|
+
entities[key]
|
45
|
+
when Symbol
|
46
|
+
super(key)
|
47
|
+
else
|
48
|
+
raise 'Error: param not supported!'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def each(&block)
|
54
|
+
entities.each do |item|
|
55
|
+
block.call item
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_a
|
60
|
+
entities
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def self.pluralize(type)
|
66
|
+
type[-1] == 's' ? type : type + 's' # pluralize
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Coach4rb
|
2
|
+
|
3
|
+
module Resource
|
4
|
+
|
5
|
+
class Partnership < Entity
|
6
|
+
|
7
|
+
attr_accessor :uri, :id, :userconfirmed1, :userconfirmed2,
|
8
|
+
:datecreated, :publicvisible, :user1, :user2,
|
9
|
+
:links, :subscriptions
|
10
|
+
|
11
|
+
alias_method :created, :datecreated
|
12
|
+
alias_method :visible, :publicvisible
|
13
|
+
alias_method :first_user, :user1
|
14
|
+
alias_method :second_user, :user2
|
15
|
+
alias_method :first_user_confirmed, :userconfirmed1
|
16
|
+
alias_method :second_user_confirmed, :userconfirmed2
|
17
|
+
|
18
|
+
def self.from_coach(a_hash)
|
19
|
+
new_hash = a_hash.dup
|
20
|
+
new_hash[:datecreated] = Time.at(new_hash[:datecreated]/1000).to_datetime rescue nil
|
21
|
+
new_hash[:subscriptions] ||= []
|
22
|
+
new_hash[:subscriptions] = new_hash[:subscriptions].map {|a_hash| Resource::Subscription.from_coach a_hash }
|
23
|
+
new_hash[:user1] = Resource::User.from_coach(new_hash[:user1]) rescue nil
|
24
|
+
new_hash[:user2] = Resource::User.from_coach(new_hash[:user2]) rescue nil
|
25
|
+
super new_hash
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def entity_path
|
30
|
+
"/partnerships/#{first_user.username};#{second_user.username}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Coach4rb
|
2
|
+
|
3
|
+
module Resource
|
4
|
+
|
5
|
+
class Subscription < Entity
|
6
|
+
attr_accessor :id, :uri, :datesubscribed, :publicvisble,
|
7
|
+
:partnership, :sport, :entries
|
8
|
+
|
9
|
+
alias_method :created, :datesubscribed
|
10
|
+
alias_method :visible, :publicvisble
|
11
|
+
|
12
|
+
|
13
|
+
def self.from_coach(a_hash)
|
14
|
+
new_hash = a_hash.dup
|
15
|
+
new_hash[:datesubscribed] = Time.at(a_hash[:datesubscribed]/1000).to_datetime rescue nil
|
16
|
+
new_hash[:partnership] = Resource::Partnership.from_coach(new_hash[:partnership]) rescue nil
|
17
|
+
new_hash[:user] = Resource::User.from_coach(new_hash[:user]) rescue nil
|
18
|
+
new_hash[:entries] = new_hash[:entries].map {|a_hash| Resource::Entry.from_coach a_hash} rescue []
|
19
|
+
new_hash[:sport] = Resource::Sport.from_coach(new_hash[:sport]) rescue nil
|
20
|
+
super new_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def sport?(sport)
|
25
|
+
raise 'Error: Invalid sport param!' if sport.nil?
|
26
|
+
*, subscription_sport = uri.split('/') # get last part of the uri
|
27
|
+
subscription_sport = subscription_sport.downcase.to_sym
|
28
|
+
sport = sport.to_s.downcase.to_sym
|
29
|
+
sport == subscription_sport
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def entity_path
|
34
|
+
if @user
|
35
|
+
"/users/#{@user.username}/#{@sport}"
|
36
|
+
elsif @partnership
|
37
|
+
"/partnerships/#{@partnership.first_user.username};#{@partnership.second_user.username}/#{@sport}"
|
38
|
+
else
|
39
|
+
raise 'Error: cannot create url!'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Coach4rb
|
2
|
+
|
3
|
+
module Resource
|
4
|
+
|
5
|
+
class User < Entity
|
6
|
+
|
7
|
+
attr_accessor :username, :password, :email, :realname,
|
8
|
+
:datecreated, :publicvisible, :partnerships,
|
9
|
+
:subscriptions
|
10
|
+
|
11
|
+
alias_method :real_name, :realname
|
12
|
+
alias_method :created, :datecreated
|
13
|
+
alias_method :public_visible, :publicvisible
|
14
|
+
|
15
|
+
|
16
|
+
def self.from_coach(a_hash)
|
17
|
+
new_hash = a_hash.dup
|
18
|
+
new_hash[:password] = nil # avoid having a star password
|
19
|
+
new_hash[:partnerships] ||= []
|
20
|
+
new_hash[:partnerships] = new_hash[:partnerships].map {|a_hash| Resource::Partnership.from_coach a_hash }
|
21
|
+
new_hash[:subscriptions] ||= []
|
22
|
+
new_hash[:subscriptions] = new_hash[:subscriptions].map {|a_hash| Resource::Subscription.from_coach a_hash }
|
23
|
+
new_hash[:datecreated] = Time.at(new_hash[:datecreated]/1000).to_datetime rescue nil
|
24
|
+
super(new_hash)
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def entity_path
|
29
|
+
"/users/#{username}"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def to_flat_hash
|
36
|
+
a_hash = {
|
37
|
+
username: username,
|
38
|
+
password: password,
|
39
|
+
email: email,
|
40
|
+
publicvisible: public_visible,
|
41
|
+
realname: real_name
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestAccessProxy < MiniTest::Test
|
4
|
+
include Coach4rb::Mixin::BasicAuth
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@coach = Coach4rb.configure(
|
8
|
+
scheme: 'http',
|
9
|
+
host: 'diufvm31.unifr.ch',
|
10
|
+
port: 8090,
|
11
|
+
path: '/CyberCoachServer/resources'
|
12
|
+
)
|
13
|
+
@proxy = Coach4rb::Proxy::Access.new'privatealex', 'scareface', @coach
|
14
|
+
@invalid_proxy = Coach4rb::Proxy::InvalidAccess.new @coach
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def test_should_still_work_using_a_proxy
|
19
|
+
partnerships = @proxy.partnerships query: {start: 0, size: 10}
|
20
|
+
assert partnerships
|
21
|
+
assert_equal 10, partnerships.size
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_access_on_private_resource_without_a_proxy
|
25
|
+
user = @coach.user 'privatealex', {authorization: basic_auth_encription('privatealex','test')}
|
26
|
+
assert user
|
27
|
+
assert user.username
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_access_on_private_resource_without_a_proxy
|
31
|
+
users = @coach.users query: { start: 0, size: 2000 }, authorization: basic_auth_encryption('privatealex','test')
|
32
|
+
user = users.detect { |u| u.username == 'privatealex' }
|
33
|
+
assert user
|
34
|
+
assert user.username
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_test_proxy_access
|
39
|
+
assert @proxy.valid?
|
40
|
+
assert @proxy.available?
|
41
|
+
user = @proxy.user 'privatealex'
|
42
|
+
assert user
|
43
|
+
assert user.real_name
|
44
|
+
assert user.email
|
45
|
+
assert user.username
|
46
|
+
assert_equal Coach4rb::Privacy::Private, user.public_visible
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
def test_should_test_invalid_proxy_access
|
52
|
+
assert @invalid_proxy.available?
|
53
|
+
refute @invalid_proxy.valid?
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
end
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestClient < MiniTest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@client = Coach4rb::Client.new(
|
7
|
+
scheme: 'http',
|
8
|
+
host: 'diufvm31.unifr.ch',
|
9
|
+
port: 8090,
|
10
|
+
path: '/CyberCoachServer/resources'
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def test_should_have_path
|
16
|
+
assert @client.path
|
17
|
+
assert_equal '/CyberCoachServer/resources', @client.path
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def test_should_have_site
|
22
|
+
assert 'http://diufvm31.unifr.ch/CyberCoachServer/resources', @client.site
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def test_should_have_port
|
27
|
+
assert 8090, @client.port
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def test_should_have_host
|
32
|
+
assert 'diufvm31.unifr.ch', @client.host
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def test_should_have_scheme
|
37
|
+
assert 'http', @client.scheme
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class CoachTestRetrieval < MiniTest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@coach = Coach4rb.configure(
|
7
|
+
scheme: 'http',
|
8
|
+
host: 'diufvm31.unifr.ch',
|
9
|
+
port: 8090,
|
10
|
+
path: '/CyberCoachServer/resources',
|
11
|
+
debug: true
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def test_if_cyber_coach_is_available
|
17
|
+
assert @coach.available?
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestCoachEntry < MiniTest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@coach = Coach4rb.configure(
|
7
|
+
scheme: 'http',
|
8
|
+
host: 'diufvm31.unifr.ch',
|
9
|
+
port: 8090,
|
10
|
+
path: '/CyberCoachServer/resources',
|
11
|
+
debug: true
|
12
|
+
)
|
13
|
+
@proxy = Coach4rb::Proxy::Access.new 'wantsomemoney', 'test', @coach
|
14
|
+
@user = @coach.user 'wantsomemoney'
|
15
|
+
assert @proxy.valid?
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def test_should_get_entry_by_its_uri
|
20
|
+
uri = '/CyberCoachServer/resources/users/wantsomemoney/Running/1132/'
|
21
|
+
entry = @coach.entry_by_uri uri
|
22
|
+
assert entry
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def test_should_get_entry
|
27
|
+
entry = @coach.entry_by_uri '/CyberCoachServer/resources/users/wantsomemoney/Running/1138/'
|
28
|
+
entry = @coach.entry entry
|
29
|
+
assert entry
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def test_should_get_an_entry_of_a_partnership
|
34
|
+
partnership = @coach.partnership 'arueedlinger', 'asarteam5'
|
35
|
+
assert partnership.subscriptions.size > 0
|
36
|
+
running = partnership.subscriptions.detect { |s| s.sport? :running }
|
37
|
+
assert running
|
38
|
+
subscription = @coach.subscription running
|
39
|
+
assert subscription
|
40
|
+
subscription.entries.each do |entry|
|
41
|
+
assert @coach.entry entry
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def test_should_get_an_entry_of_a_user
|
48
|
+
user = @coach.user 'arueedlinger'
|
49
|
+
assert user.subscriptions.size > 0
|
50
|
+
running = user.subscriptions.detect { |s| s.sport? :running }
|
51
|
+
assert running
|
52
|
+
subscription = @coach.subscription running
|
53
|
+
assert subscription
|
54
|
+
subscription.entries.each do |entry|
|
55
|
+
assert @coach.entry entry
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def test_should_create_an_entry_for_a_user
|
62
|
+
res = @proxy.create_entry(@user, :running) do |entry|
|
63
|
+
entry.comment = 'test'
|
64
|
+
entry.number_of_rounds = 10
|
65
|
+
entry.public_visible = Coach4rb::Privacy::Public
|
66
|
+
end
|
67
|
+
assert res
|
68
|
+
assert res.uri
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def test_should_create_an_entry_using_a_uri
|
73
|
+
res = @proxy.create_entry(@user.uri, :running) do |entry|
|
74
|
+
entry.comment = 'test'
|
75
|
+
entry.number_of_rounds = 10
|
76
|
+
entry.public_visible = Coach4rb::Privacy::Public
|
77
|
+
end
|
78
|
+
assert res
|
79
|
+
assert res.uri
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def test_should_create_an_entry_for_a_partnership
|
84
|
+
proxy = Coach4rb::Proxy::Access.new 'arueedlinger', 'test', @coach
|
85
|
+
partnership = @coach.partnership 'arueedlinger', 'asarteam5'
|
86
|
+
res = proxy.create_entry(partnership, :running) do |entry|
|
87
|
+
entry.comment = 'test'
|
88
|
+
entry.number_of_rounds = 10
|
89
|
+
entry.public_visible = Coach4rb::Privacy::Public
|
90
|
+
end
|
91
|
+
assert res
|
92
|
+
assert res.uri
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
def test_should_update_an_entry_using_a_uri
|
98
|
+
uri = '/CyberCoachServer/resources/users/wantsomemoney/Running/1138/'
|
99
|
+
res = @proxy.update_entry(uri) do |entry|
|
100
|
+
entry.comment = 'Test!!'
|
101
|
+
entry.entry_location = 'sajfsjdjasd'
|
102
|
+
entry.number_of_rounbds = 10000
|
103
|
+
entry.entry_date = DateTime.now
|
104
|
+
entry.track = 'jhasjdhjashjkdasjdjkasndj'
|
105
|
+
end
|
106
|
+
assert res
|
107
|
+
assert res.uri
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
def test_should_update_an_entry
|
112
|
+
entry = @proxy.entry_by_uri '/CyberCoachServer/resources/users/wantsomemoney/Running/1139/'
|
113
|
+
updated_entry = @proxy.update_entry(entry) do |entry|
|
114
|
+
entry.comment = 'Test!!'
|
115
|
+
entry.track = 'muhaa!!!!'
|
116
|
+
end
|
117
|
+
assert updated_entry
|
118
|
+
assert updated_entry.uri
|
119
|
+
assert_equal 'Test!!', updated_entry.comment
|
120
|
+
pp updated_entry.read_track
|
121
|
+
assert_equal 'muhaa!!!!', updated_entry.read_track
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
def test_should_create_and_delete_an_entry
|
126
|
+
entry = @proxy.create_entry(@user, :running) do |e|
|
127
|
+
e.comment = 'test'
|
128
|
+
e.number_of_rounds = 10
|
129
|
+
e.public_visible = Coach4rb::Privacy::Public
|
130
|
+
end
|
131
|
+
|
132
|
+
assert entry
|
133
|
+
assert @proxy.entry_by_uri entry.uri
|
134
|
+
assert @proxy.delete_entry(entry)
|
135
|
+
sleep 2
|
136
|
+
refute @proxy.entry_by_uri(entry.uri)
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
end
|