citrix 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -0
  3. data/CHANGELOG.md +5 -0
  4. data/CONTRIBUITING.md +40 -0
  5. data/README.md +106 -1
  6. data/citrix.gemspec +5 -0
  7. data/lib/citrix.rb +1 -0
  8. data/lib/citrix/training.rb +22 -0
  9. data/lib/citrix/training/client.rb +38 -0
  10. data/lib/citrix/training/credentials.rb +27 -0
  11. data/lib/citrix/training/helpers/http_client.rb +33 -0
  12. data/lib/citrix/training/helpers/initializer.rb +13 -0
  13. data/lib/citrix/training/namespace/registrants.rb +107 -0
  14. data/lib/citrix/training/namespace/trainings.rb +91 -0
  15. data/lib/citrix/training/resource/registrant.rb +60 -0
  16. data/lib/citrix/training/resource/training.rb +67 -0
  17. data/lib/citrix/training/resource/training_date.rb +25 -0
  18. data/lib/citrix/training/serializer/registrant.rb +32 -0
  19. data/lib/citrix/training/serializer/training.rb +49 -0
  20. data/lib/citrix/training/serializer/training_date.rb +19 -0
  21. data/lib/citrix/version.rb +1 -1
  22. data/spec/citrix/training/client_spec.rb +22 -0
  23. data/spec/citrix/training/credentials_spec.rb +31 -0
  24. data/spec/citrix/training/helpers/http_client_spec.rb +54 -0
  25. data/spec/citrix/training/helpers/initializer_spec.rb +15 -0
  26. data/spec/citrix/training/namespace/registrants_spec.rb +94 -0
  27. data/spec/citrix/training/namespace/trainings_spec.rb +85 -0
  28. data/spec/citrix/training/resource/registrant_spec.rb +11 -0
  29. data/spec/citrix/training/resource/training_spec.rb +11 -0
  30. data/spec/citrix/training/serializer/registrant_spec.rb +50 -0
  31. data/spec/citrix/training/serializer/training_date_spec.rb +21 -0
  32. data/spec/citrix/training/serializer/training_spec.rb +79 -0
  33. data/spec/fixtures/register.json +5 -0
  34. data/spec/fixtures/registrant.json +10 -0
  35. data/spec/fixtures/registrants.json +31 -0
  36. data/spec/fixtures/training.json +24 -0
  37. data/spec/fixtures/trainings.json +26 -0
  38. data/spec/spec_helper.rb +94 -0
  39. metadata +103 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 110512ea1f5aeb8316a68ab64f6f3d795bebf5ac
4
- data.tar.gz: 1fd799d1a1990a5d0e2fbf9f2d0c246705bb1d81
3
+ metadata.gz: a5a06b3c6f0dc327a0bcbcd906dd5348a55dd998
4
+ data.tar.gz: 32d47b27842f60d00284619696f908da9df02e9a
5
5
  SHA512:
6
- metadata.gz: 44572a055ba74f874400f883dfc850c7ee9454e7d623c983873ae117b54023bf64ceb52a4c1fd2e32c8f561e9d9fd0852eab739f9f3b5955b27278a1b9aad672
7
- data.tar.gz: 59c82e761b0f4b88dd7670ebdb580361d63d59c9871b8c6882fac5f139e9193cc1285910de662cfe4b74a1a4dedba389896c6cbf98b2f6036e5acf4a50394ae4
6
+ metadata.gz: 3406b08706191fde2506c2fd55d95fcb59111627ea91031fa82190b59a44a5a1a7b776a43a8f27edcdda47eb0188378e937b4ba560876012d6b1079d90e2204f
7
+ data.tar.gz: a42202ff1e877baea7d5da52558eaf54184da3524d595865f12e197a14d3c019415c69a119137544256461e7a8de0afbb476a7e1ef860a5826d10c13b863671c
data/.travis.yml CHANGED
@@ -6,3 +6,7 @@ rvm:
6
6
 
7
7
  gemfile:
8
8
  - Gemfile
9
+
10
+ addons:
11
+ code_climate:
12
+ repo_token: 36d1b2992ebb12fef1167de97f900d332f01e75f0b2bc90b3159621585a9ed1e
data/CHANGELOG.md CHANGED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## v0.1.0
4
+
5
+ - Initial release
data/CONTRIBUITING.md CHANGED
@@ -0,0 +1,40 @@
1
+ # Contributing
2
+
3
+ ## Issues
4
+
5
+ If you want to request a feature or report a bug, please use the following template.
6
+
7
+ ```markdown
8
+ ## Description
9
+
10
+ [Add feature/bug description here]
11
+
12
+ ## How to reproduce
13
+
14
+ [Add steps on how to reproduce this issue]
15
+
16
+ ## What do you expect
17
+
18
+ [Describe what do you expect to happen]
19
+
20
+ ## What happened instead
21
+
22
+ [Describe the actual results]
23
+
24
+ ## Gem version:
25
+
26
+ Citrix version: [Add citrix gem version here]
27
+ ```
28
+
29
+ ## Writing code
30
+
31
+ Once you've made your great commits (include tests, please):
32
+
33
+ 1. [Fork](http://help.github.com/forking/) citrix
34
+ 2. Create a topic branch - `git checkout -b my_branch`
35
+ 3. Push to your branch - `git push origin my_branch`
36
+ 4. [Create an Issue](http://github.com/fnando/citrix/issues) with a link to your branch
37
+ 5. That's it!
38
+
39
+ Please respect the indentation rules and code style.
40
+ And don't touch the versioning thing.
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Citrix
2
2
 
3
+ [![Build Status](https://travis-ci.org/fnando/citrix.svg)](https://travis-ci.org/fnando/citrix)
4
+ [![Code Climate](https://codeclimate.com/github/fnando/citrix/badges/gpa.svg)](https://codeclimate.com/github/fnando/citrix)
5
+ [![Test Coverage](https://codeclimate.com/github/fnando/citrix/badges/coverage.svg)](https://codeclimate.com/github/fnando/citrix)
6
+
7
+ API wrappers for Citrix services like GoToTraining. It includes partial API mapping for GoToTraining.
8
+
3
9
  ## Installation
4
10
 
5
11
  Add this line to your application's Gemfile:
@@ -16,7 +22,106 @@ Or install it yourself as:
16
22
 
17
23
  ## Usage
18
24
 
19
- TODO: Write usage instructions here
25
+ ### GoToTraining
26
+
27
+ #### Create client
28
+
29
+ Initialize a client with provided credentials.
30
+ The credentials must be a instance of or
31
+ a Hash accepted by `Citrix::Training::Credentials`.
32
+
33
+ ```ruby
34
+ client = Citrix::Training::Client.build(
35
+ oauth_token: ENV.fetch('CITRIX_OAUTH_TOKEN'),
36
+ organizer_key: ENV.fetch('CITRIX_ORGANIZER_KEY'),
37
+ account_key: ENV.fetch('CITRIX_ACCOUNT_KEY')
38
+ )
39
+ ```
40
+
41
+ #### Create training
42
+
43
+ ```ruby
44
+ response, training = client.trainings.create({
45
+ name: 'Ruby on Rails',
46
+ description: 'Getting started with Ruby on Rails',
47
+ timezone: 'America/Sao_Paulo',
48
+ dates: [date],
49
+ web_registration: false,
50
+ confirmation_email: false,
51
+ organizers: [organizer]
52
+ })
53
+
54
+ if response.ok?
55
+ # Training successfully created!
56
+ else
57
+ p response.json
58
+ end
59
+ ```
60
+
61
+ #### Get all trainings
62
+
63
+ Retrieve information on all scheduled trainings for a given organizer.
64
+
65
+ ```ruby
66
+ response, trainings = client.trainings.all
67
+
68
+ if trainings
69
+ # Retrieved all trainings
70
+ else
71
+ p response.json
72
+ end
73
+ ```
74
+
75
+ #### Remove a training
76
+
77
+ Deletes a scheduled or completed training.
78
+
79
+ ```ruby
80
+ response = client.trainings.remove(training)
81
+ response.ok? #=> successfully removed
82
+ ```
83
+
84
+ #### Add registrant
85
+
86
+ Register one person, identified by a unique email address, for a training.
87
+
88
+ ```ruby
89
+ response, registrant = client.registrants(training).create({
90
+ first_name: 'John',
91
+ last_name: 'Doe',
92
+ email: 'john@example.com'
93
+ })
94
+
95
+ if response.ok?
96
+ # Do something with registrant
97
+ else
98
+ p response.json
99
+ end
100
+ ```
101
+
102
+ #### Get all registrants
103
+
104
+ Retrieve details on all registrants for a specific training.
105
+
106
+ ```ruby
107
+ response, registrants = client.registrants(training).all
108
+
109
+ if response.ok?
110
+ # Do something with registrants
111
+ else
112
+ p response.json
113
+ end
114
+ ```
115
+
116
+ #### Remove registrant
117
+
118
+ This call cancels a registration in a scheduled training for a
119
+ specific registrant.
120
+
121
+ ```ruby
122
+ response = client.registrants(training).remove(registrant)
123
+ response.ok? #=> successfully removed
124
+ ```
20
125
 
21
126
  ## Contributing
22
127
 
data/citrix.gemspec CHANGED
@@ -15,7 +15,12 @@ Gem::Specification.new do |spec|
15
15
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
16
  spec.require_paths = ['lib']
17
17
 
18
+ spec.add_dependency 'aitch'
19
+
18
20
  spec.add_development_dependency 'bundler', '~> 1.6'
19
21
  spec.add_development_dependency 'rake'
20
22
  spec.add_development_dependency 'rspec'
23
+ spec.add_development_dependency 'codeclimate-test-reporter'
24
+ spec.add_development_dependency 'webmock'
25
+ spec.add_development_dependency 'pry-meta'
21
26
  end
data/lib/citrix.rb CHANGED
@@ -1 +1,2 @@
1
1
  require 'citrix/version'
2
+ require 'citrix/training'
@@ -0,0 +1,22 @@
1
+ require 'time'
2
+
3
+ require 'aitch'
4
+
5
+ require 'citrix/training/helpers/initializer'
6
+ require 'citrix/training/helpers/http_client'
7
+ require 'citrix/training/credentials'
8
+ require 'citrix/training/client'
9
+ require 'citrix/training/namespace/trainings'
10
+ require 'citrix/training/namespace/registrants'
11
+ require 'citrix/training/resource/training'
12
+ require 'citrix/training/resource/registrant'
13
+ require 'citrix/training/serializer/training'
14
+ require 'citrix/training/serializer/registrant'
15
+ require 'citrix/training/resource/training_date'
16
+ require 'citrix/training/serializer/training_date'
17
+
18
+ module Citrix
19
+ module Training
20
+ API_ENDPOINT = 'https://api.citrixonline.com/G2T/rest'
21
+ end
22
+ end
@@ -0,0 +1,38 @@
1
+ module Citrix
2
+ module Training
3
+ class Client
4
+ include Helpers::Initializer
5
+
6
+ # Set credentials.
7
+ attr_accessor :credentials
8
+
9
+ # Initialize a client with provided credentials.
10
+ # The credentials must be a instance of or
11
+ # a Hash accepted by `Citrix::Training::Credentials`.
12
+ #
13
+ # client = Citrix::Training::Client.build(
14
+ # oauth_token: ENV.fetch('CITRIX_OAUTH_TOKEN'),
15
+ # organizer_key: ENV.fetch('CITRIX_ORGANIZER_KEY'),
16
+ # account_key: ENV.fetch('CITRIX_ACCOUNT_KEY')
17
+ # )
18
+ #
19
+ def self.build(credentials)
20
+ new(credentials: Credentials.build(credentials))
21
+ end
22
+
23
+ # Return the training namespace, which include methods for creating and
24
+ # finding trainings. For additional info, check
25
+ # `Citrix::Training::Namespace::Trainings`.
26
+ def trainings
27
+ Namespace::Trainings.new(credentials: credentials)
28
+ end
29
+
30
+ # Return the registrants namespace, which include methods for creating
31
+ # registrants. It requires an existing training.
32
+ # For additional info, check `Citrix::Training::Namespace::Registrants`.
33
+ def registrants(training)
34
+ Namespace::Registrants.new(credentials: credentials, training: training)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module Citrix
2
+ module Training
3
+ class Credentials
4
+ include Helpers::Initializer
5
+
6
+ # Set the OAuth token.
7
+ # You can use the [Omniauth::Citrix](http://github.com/fnando/omniauth-citrix)
8
+ # for OAuth2 authentication on Rack-based applications.
9
+ attr_accessor :oauth_token
10
+
11
+ # Set the organizer key.
12
+ attr_accessor :organizer_key
13
+
14
+ # Set the account key.
15
+ attr_accessor :account_key
16
+
17
+ # Initialize a `Citrix::Training::Credentials` instance.
18
+ def self.build(credentials)
19
+ if credentials.kind_of?(self)
20
+ credentials
21
+ else
22
+ new(credentials)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ module Citrix
2
+ module Training
3
+ module Helpers
4
+ module HttpClient
5
+ def json_parser
6
+ http_client.configuration.json_parser
7
+ end
8
+
9
+ def url_for(*args)
10
+ File.join(API_ENDPOINT, *args.map(&:to_s))
11
+ end
12
+
13
+ def http_client
14
+ @http_client ||= Aitch::Namespace.new.tap do |ns|
15
+ ns.configure do |config|
16
+ if $DEBUG
17
+ require 'logger'
18
+ config.logger = Logger.new($stdout)
19
+ end
20
+
21
+ config.user_agent = "Citrix::Rubygems/#{Citrix::VERSION}"
22
+ config.default_headers = {
23
+ 'Authorization' => -> { "OAuth oauth_token=#{credentials.oauth_token}" },
24
+ 'Accept' => 'application/json',
25
+ 'Content-Type' => 'application/json'
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ module Citrix
2
+ module Training
3
+ module Helpers
4
+ module Initializer
5
+ def initialize(attributes = {})
6
+ attributes.each do |name, value|
7
+ public_send "#{name}=", value
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,107 @@
1
+ module Citrix
2
+ module Training
3
+ module Namespace
4
+ class Registrants
5
+ include Helpers::Initializer
6
+ include Helpers::HttpClient
7
+
8
+ # Set the credentials.
9
+ attr_accessor :credentials
10
+
11
+ # Set the training.
12
+ attr_accessor :training
13
+
14
+ # Register one person, identified by a unique email address, for a training.
15
+ #
16
+ # Approval is automatic unless payment or approval is required. The
17
+ # response contains the Confirmation page URL and Join URL for the
18
+ # registrant.
19
+ #
20
+ # NOTE: If some registrants do not receive a confirmation email, the
21
+ # emails could be getting blocked by their email server due to spam
22
+ # filtering or a grey-listing setting.
23
+ #
24
+ # response, registrant = client.registrants(training).create({
25
+ # first_name: 'John',
26
+ # last_name: 'Doe',
27
+ # email: 'john@example.com'
28
+ # })
29
+ #
30
+ # if response.ok?
31
+ # # Do something with registrant
32
+ # end
33
+ #
34
+ # Options:
35
+ #
36
+ # - `first_name`: First name of user. Required.
37
+ # - `last_name`: Last name of user. Required.
38
+ # - `email`: Email of registrant. Required.
39
+ #
40
+ # Endpoint: https://developer.citrixonline.com/api/gototraining-rest-api/apimethod/register-training-0
41
+ #
42
+ def create(attributes)
43
+ registrant = Resource::Registrant.new(attributes)
44
+
45
+ url = url_for('organizers', credentials.organizer_key, 'trainings', training.key, 'registrants')
46
+ response = http_client.post(url, registrant.serialize)
47
+
48
+ if response.ok?
49
+ additional_attributes = Serializer::Registrant.new(attributes: response.json).deserialize
50
+ additional_attributes.each do |key, value|
51
+ registrant.public_send("#{key}=", value) if value
52
+ end
53
+ end
54
+
55
+ [response, registrant]
56
+ end
57
+
58
+ # Retrieve details on all registrants for a specific training.
59
+ #
60
+ # Registrants can be:
61
+ #
62
+ # - UNREGISTERED: registrant withdrew their registration but didn't
63
+ # opt-out of receiving more training or webinar information
64
+ # - DELETED: registrant withdrew their registration and opted-out of
65
+ # receiving more information about the training or webinar
66
+ # - WAITING: registrant registered and is awaiting approval (where
67
+ # organizer has required approval)
68
+ # - APPROVED: registrant registered and is approved
69
+ # - DENIED - registrant registered and was not approved.
70
+ #
71
+ # IMPORTANT: The registrant data caches are typically updated
72
+ # immediately and the data will be returned in the response. However,
73
+ # the update can take as long as two hours.
74
+ #
75
+ # Endpoint: https://developer.citrixonline.com/api/gototraining-rest-api/apimethod/get-training-registrants-0
76
+ #
77
+ def all
78
+ url = url_for('organizers', credentials.organizer_key, 'trainings', training.key, 'registrants')
79
+ response = http_client.get(url)
80
+
81
+ if response.ok?
82
+ registrants = response.json.map do |attrs|
83
+ Resource::Registrant.new Resource::Registrant.deserialize(attrs)
84
+ end
85
+ end
86
+
87
+ [response, registrants]
88
+ end
89
+
90
+ # This call cancels a registration in a scheduled training for a
91
+ # specific registrant.
92
+ #
93
+ # If the registrant has paid for the training, a cancellation cannot be
94
+ # completed with this method; it must be completed on the Citrix
95
+ # external admin site. No notification is sent to the registrant or
96
+ # the organizer by default. The registrant can re-register if needed.
97
+ #
98
+ # Endpoint: https://developer.citrixonline.com/api/gototraining-rest-api/apimethod/cancel-registration-0
99
+ #
100
+ def remove(registrant)
101
+ url = url_for('organizers', credentials.organizer_key, 'trainings', training.key, 'registrants', registrant.key)
102
+ http_client.delete(url)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end