coach_assist 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81df849eba98166f8c445668a19ca1fae8a94fdf
4
- data.tar.gz: d341ac7ee8a96f4b772e50737354e03fef08a2b7
3
+ metadata.gz: 278bc2ac79ab1f23248370336dc8263ad042dc5e
4
+ data.tar.gz: 9ce647e23df24610214a04f09612ce5e7175a550
5
5
  SHA512:
6
- metadata.gz: 9ab982b66efe308daf2a98e7de337c33c9503a060a6115ac52aafd4993e5ffed55129a0d4e7e8e35d207fb10d37321b3777944199083a2277955164e0779f59b
7
- data.tar.gz: 3b5d8fa51b5662963d1e742debc8de4d63a7daf04c3da798e9aba3fb5d41a0ce32ded3603293308b18ebd578eda4323cf6033df8a6aa396d19ce847eb2c2053a
6
+ metadata.gz: 50c6d6f01ad4ec1f2b1930665dba59c5245f75790596e5c9724e87d4aa544fb1efb405a2c8feb10a25a82b61170642f1c63673160f826283650bcb91bc1474f3
7
+ data.tar.gz: edeb36fe187eb95091c29e4216db029bcf3285d2ee73cb52974a2e6ab21b8eab63b03ef7d68adfbd6acac9602d5c91ac3c5ef3af7a870ed5c02555e761b8518d
@@ -0,0 +1,58 @@
1
+ module Coach
2
+ class Client
3
+ include HTTParty
4
+
5
+ debug_output $stdout
6
+ format :json
7
+
8
+ headers 'Accept' => 'application/json'
9
+ base_uri 'http://diufvm31.unifr.ch:8090/CyberCoachServer/resources'
10
+
11
+ def get(path, options={})
12
+ Client.get(path, options.merge(basic_auth: @auth))
13
+ end
14
+
15
+ def post(path, options={})
16
+ Client.post(path, options.merge(basic_auth: @auth))
17
+ end
18
+
19
+ def put(path, options={})
20
+ Client.put(path, options.merge(basic_auth: @auth))
21
+ end
22
+
23
+ def delete(path, options={})
24
+ Client.delete(path, options.merge(basic_auth: @auth))
25
+ end
26
+
27
+ def authenticate(username, password)
28
+ @auth = { username: username, password: password }
29
+ end
30
+
31
+ def authenticated(username, password, &block)
32
+ authenticate(username, password)
33
+ block.call
34
+ @auth = nil
35
+ end
36
+
37
+ def has_auth?
38
+ !!@auth
39
+ end
40
+
41
+ def assert_authenticated!
42
+ raise 'Method must be authenticated first!' unless has_auth?
43
+ end
44
+
45
+ def users
46
+ @user_finder || (@user_finder = Finders::UserFinder.new(self))
47
+ end
48
+
49
+ def partnerships
50
+ @ps_finder || (@ps_finder = Finders::PartnershipFinder.new(self))
51
+ end
52
+
53
+ def subscriptions
54
+ @sub_finder || (@sub_finder = Finders::SubscriptionFinder.new(self))
55
+ end
56
+
57
+ end
58
+ end
data/lib/coach/entity.rb CHANGED
@@ -1,40 +1,48 @@
1
1
  module Coach
2
2
  class Entity < Hashie::Trash
3
3
  include Hashie::Extensions::IndifferentAccess
4
- include HTTParty
4
+
5
+ attr_accessor :client
5
6
 
6
7
  property :uri
7
8
  property :id
8
9
  property :created_at, from: :datecreated
9
- property :visibility, from: :publicvisible
10
-
11
- headers 'Accept' => 'application/json'
12
- base_uri 'http://diufvm31.unifr.ch:8090/CyberCoachServer/resources'
13
-
14
- class << self
15
- def authenticated(username, password, &block)
16
- @auth = { username: username, password: password }
17
- res = instance_eval &block
18
- @auth = nil
19
- res
20
- end
21
- end
10
+ property :visibility, from: :publicvisible, default: 2
22
11
 
23
12
  # Fetch an entity based on its uri. Each entity containing a valid uri will be retrievable through this method
24
13
  def fetch
25
- return self if @fetched
26
- raise 'Entity has not been loaded yet and does not have "uri" property' if self.uri.blank?
14
+ assert_has_uri!
27
15
 
28
- response = Entity.get clean_uri
16
+ response = client.get clean_uri
29
17
  update_attributes! JSON.parse(response.body)
30
18
 
31
- @fetched = true
32
19
  self
33
20
  end
34
21
 
35
- # Remove overlapping url parts
36
- def clean_uri
37
- self.uri.gsub('/CyberCoachServer/resources', '')
22
+ def destroy
23
+ assert_has_uri!
24
+ client.delete clean_uri
25
+ end
26
+
27
+ def update(attributes={})
28
+ assert_has_uri!
29
+ response = client.put clean_uri, body: attributes
30
+ update_attributes! JSON.parse(response.body) if response.code == 200
38
31
  end
32
+
33
+ def set_client(client)
34
+ self.client = client
35
+ self
36
+ end
37
+
38
+ private
39
+ # Remove overlapping url parts
40
+ def clean_uri
41
+ self.uri.gsub('/CyberCoachServer/resources', '')
42
+ end
43
+
44
+ def assert_has_uri!
45
+ raise 'Entity has no URI associated with it' unless self.uri
46
+ end
39
47
  end
40
48
  end
@@ -0,0 +1,11 @@
1
+ module Coach
2
+ module Finders
3
+ class Finder
4
+ attr_accessor :client
5
+
6
+ def initialize(client)
7
+ @client = client
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ module Coach
2
+ module Finders
3
+ class PartnershipFinder < Finder
4
+ def all
5
+ eager, search = options.values_at(:eager, :search)
6
+ response = client.get '/partnerships', query: { start: 0, size: 10000, searchCriteria: search }
7
+ JSON.parse(response.body)['partnerships'].map { |ps| eager ? build(ps).fetch : build(ps) }
8
+ end
9
+
10
+ def find(username1, username2)
11
+ response = client.get "/partnerships/#{username1};#{username2}"
12
+ response.code == 200 ? build(JSON.parse(response.body)) : nil
13
+ end
14
+
15
+ def exists?(username1, username2)
16
+ !!find(username1, username2)
17
+ end
18
+
19
+ def create(username1, username2, attributes={})
20
+ response = client.put "/partnerships/#{username1};#{username2}", body: attributes
21
+ response.code == 201 ? build(JSON.parse(response.body)) : nil
22
+ end
23
+
24
+ def build(attributes={})
25
+ u = Coach::Partnership.new(attributes)
26
+ u.set_client(client)
27
+ u
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ module Coach
2
+ module Finders
3
+ class SubscriptionFinder < Finder
4
+
5
+ def find(username, sport)
6
+ response = client.get "/users/#{username}/#{sport}"
7
+ response.code == 200 ? build(JSON.parse(response.body)) : nil
8
+ end
9
+
10
+ def exists?(username1, username2)
11
+ !!find(username1, username2)
12
+ end
13
+
14
+ def create(username, sport, attributes={})
15
+ response = client.put "/users/#{username}/#{sport}", body: attributes
16
+ response.code == 201 ? build(JSON.parse(response.body)) : nil
17
+ end
18
+
19
+ def build(attributes={})
20
+ s = Coach::Subscription.new(attributes)
21
+ s.set_client(client)
22
+ s
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ module Coach
2
+ module Finders
3
+ class UserFinder < Finder
4
+
5
+ # Find all users on server. Pass :eager option to return results eagerly (slow)
6
+ # Pass :search option to only include users matching the search query
7
+ def all(options={})
8
+ eager, search = options.values_at(:eager, :search)
9
+ response = client.get '/users', query: { start: 0, size: 10000, searchCriteria: search }
10
+ JSON.parse(response.body)['users'].map { |u| eager ? build(u).fetch : build(u) }
11
+ end
12
+
13
+ # Find user by username
14
+ def find(username)
15
+ response = client.get "/users/#{username}"
16
+ response.code == 200 ? build(JSON.parse(response.body)) : nil
17
+ end
18
+
19
+ # Check whether user exists
20
+ def exists?(username)
21
+ !!find(username)
22
+ end
23
+
24
+ def authenticated?(username, password)
25
+ authenticated(username, password) do
26
+ response = client.get '/authenticateduser'
27
+ response.code == 200 ? build(JSON.parse(response.body)) : nil
28
+ end
29
+ end
30
+
31
+ # Create new user
32
+ def create(username, attributes={})
33
+ response = client.put "/users/#{username}", body: attributes
34
+ [200, 201].include?(response.code) ? build(JSON.parse(response.body)) : nil
35
+ end
36
+
37
+ def find_or_create(username, attributes={})
38
+ u = find(username)
39
+ u || create(username, attributes)
40
+ end
41
+
42
+ def build(attributes={})
43
+ u = Coach::User.new(attributes)
44
+ u.set_client(client)
45
+ u
46
+ end
47
+ end
48
+ end
49
+ end
@@ -4,20 +4,31 @@ module Coach
4
4
  property :confirmed_by_user2, from: :userconfirmed2
5
5
  property :user1
6
6
  property :user2
7
+ property :subscriptions
7
8
 
8
9
  alias_method :old_user1, :user1
9
10
  alias_method :old_user2, :user2
11
+ alias_method :subscriptions_orig, :subscriptions
10
12
 
11
13
  def user1
12
- Coach::User.new(old_user1).fetch
14
+ client.users.build(old_user1).fetch
13
15
  end
14
16
 
15
17
  def user2
16
- Coach::User.new(old_user2).fetch
18
+ client.users.build(old_user2).fetch
17
19
  end
18
20
 
19
21
  def users
20
22
  [user1, user2]
21
23
  end
24
+
25
+ def subscriptions
26
+ (subscriptions_orig || []).map { |s| client.subscriptions.build(s).fetch }
27
+ end
28
+
29
+ def confirm
30
+ client.assert_authenticated!
31
+ client.put clean_uri
32
+ end
22
33
  end
23
34
  end
@@ -8,7 +8,11 @@ module Coach
8
8
  alias_method :old_user, :user
9
9
 
10
10
  def user
11
- Coach::User.new(old_user).fetch
11
+ client.users.build(old_user).fetch
12
+ end
13
+
14
+ def self.types
15
+ [:running, :cycling]
12
16
  end
13
17
  end
14
18
  end
data/lib/coach/user.rb CHANGED
@@ -5,63 +5,46 @@ module Coach
5
5
  property :password
6
6
  property :real_name, from: :realname
7
7
  property :email
8
- property :partnerships
9
- property :subscriptions
8
+ property :partnerships, default: []
9
+ property :subscriptions, default: []
10
10
 
11
- alias_method :old_partnerships, :partnerships
12
- alias_method :old_subscriptions, :subscriptions
11
+ alias_method :partnerships_orig, :partnerships
12
+ alias_method :subscriptions_orig, :subscriptions
13
13
 
14
- class << self
15
- # Find all users on server. Pass :eager option to return results eagerly (slow)
16
- # Pass :search option to only include users matching the search query
17
- def all(options={})
18
- eager, search = options.values_at(:eager, :search)
19
- response = get '/users', query: { start: 0, size: 10000, searchCriteria: search }
20
- JSON.parse(response.body)['users'].map { |u| eager ? Coach::User.new(u).fetch : Coach::User.new(u) }
21
- end
22
-
23
- # Find user by username
24
- def find(username)
25
- response = get "/users/#{username}", basic_auth: @auth
26
- response.code == 200 ? Coach::User.new(JSON.parse(response.body)) : nil
27
- end
28
-
29
- # Check whether user exists
30
- def exists?(username)
31
- !!find(username)
32
- end
33
-
34
- def authenticated?(username, password)
35
- authenticated(username, password) do
36
- response = get '/authenticateduser', basic_auth: @auth
37
- response.code == 200 ? Coach::User.new(JSON.parse(response.body)) : nil
38
- end
39
- end
14
+ def partnerships
15
+ (partnerships_orig || []).map { |p| client.partnerships.build(p).fetch }
16
+ end
40
17
 
41
- # Create new user
42
- def create(username, attributes={})
43
- response = put "/users/#{username}", body: attributes
44
- response.code == 201 ? Coach::User.new(JSON.parse(response.body)) : nil
45
- end
18
+ def subscriptions
19
+ (subscriptions_orig || []).map { |p| client.subscriptions.build(p).fetch }
20
+ end
46
21
 
47
- # Update user
48
- def update(username, attributes={})
49
- response = put "/users/#{username}", body: attributes, basic_auth: @auth
50
- response.code == 200 ? Coach::User.new(JSON.parse(response.body)) : nil
51
- end
22
+ def pending_partnerships
23
+ partnerships.select { |ps| ps.user2.username == self.username && !ps.confirmed_by_user2}
24
+ end
52
25
 
53
- # Delete user
54
- def delete(username)
55
- HTTParty::delete "/users/#{username}", basic_auth: @auth
56
- end
26
+ def confirm_partnership(ps)
27
+ ps.confirm
57
28
  end
58
29
 
59
- def partnerships
60
- (old_partnerships || []).map { |p| Coach::Partnership.new(p).fetch }
30
+ def subscribe_to(sport)
31
+ raise 'Can only subscribe to :running or :cycling' unless Coach::Subscription.types.include? sport.to_sym
32
+ client.subscriptions.create(self.username, sport, publicvisible: 2)
61
33
  end
62
34
 
63
- def subscriptions
64
- (old_subscriptions || []).map { |p| Coach::Subscription.new(p).fetch }
35
+ def destroy
36
+ destroy_partnerships
37
+ destroy_subscriptions
38
+ super
65
39
  end
40
+
41
+ private
42
+ def destroy_partnerships
43
+ partnerships.each(&:destroy)
44
+ end
45
+
46
+ def destroy_subscriptions
47
+ subscriptions.each(&:destroy)
48
+ end
66
49
  end
67
50
  end
data/lib/coach_assist.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  require 'httparty'
2
2
  require 'hashie'
3
- require 'active_support/all'
4
- require "coach_assist/version"
5
- require "coach/entity"
6
- require "coach/user"
7
- require "coach/subscription"
8
- require "coach/partnership"
9
-
10
3
 
4
+ require 'active_support/all'
5
+ require 'coach_assist/version'
6
+ require 'coach/entity'
7
+ require 'coach/user'
8
+ require 'coach/subscription'
9
+ require 'coach/partnership'
10
+ require 'coach/client'
11
+ require 'coach/finders/finder'
12
+ require 'coach/finders/user_finder'
13
+ require 'coach/finders/subscription_finder'
14
+ require 'coach/finders/partnership_finder'
@@ -1,3 +1,3 @@
1
1
  module CoachAssist
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coach_assist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Urs Gerber
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-20 00:00:00.000000000 Z
11
+ date: 2015-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -111,7 +111,12 @@ files:
111
111
  - bin/console
112
112
  - bin/setup
113
113
  - coach_assist.gemspec
114
+ - lib/coach/client.rb
114
115
  - lib/coach/entity.rb
116
+ - lib/coach/finders/finder.rb
117
+ - lib/coach/finders/partnership_finder.rb
118
+ - lib/coach/finders/subscription_finder.rb
119
+ - lib/coach/finders/user_finder.rb
115
120
  - lib/coach/partnership.rb
116
121
  - lib/coach/subscription.rb
117
122
  - lib/coach/user.rb