adobe_connect 0.0.1
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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +7 -0
- data/adobe_connect.gemspec +27 -0
- data/bin/adobe_connect_console +4 -0
- data/lib/adobe_connect/config.rb +31 -0
- data/lib/adobe_connect/meeting_folder.rb +28 -0
- data/lib/adobe_connect/param_formatter.rb +16 -0
- data/lib/adobe_connect/response.rb +23 -0
- data/lib/adobe_connect/service.rb +55 -0
- data/lib/adobe_connect/session.rb +19 -0
- data/lib/adobe_connect/user.rb +55 -0
- data/lib/adobe_connect/version.rb +3 -0
- data/lib/adobe_connect.rb +14 -0
- data/test/fixtures/folder_contents.xml +76 -0
- data/test/fixtures/folder_success.xml +15 -0
- data/test/fixtures/log_in_fail.xml +4 -0
- data/test/fixtures/log_in_success.xml +4 -0
- data/test/fixtures/user_find_error.xml +5 -0
- data/test/fixtures/user_find_success.xml +12 -0
- data/test/fixtures/user_save_error.xml +8 -0
- data/test/fixtures/user_save_success.xml +9 -0
- data/test/lib/adobe_connect/config_test.rb +36 -0
- data/test/lib/adobe_connect/meeting_folder_test.rb +61 -0
- data/test/lib/adobe_connect/param_formatter_test.rb +33 -0
- data/test/lib/adobe_connect/response_test.rb +44 -0
- data/test/lib/adobe_connect/service_test.rb +62 -0
- data/test/lib/adobe_connect/user_test.rb +103 -0
- data/test/test_helper.rb +5 -0
- metadata +188 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Zach Pendleton
|
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,58 @@
|
|
1
|
+
# AdobeConnect
|
2
|
+
|
3
|
+
This gem provides a wrapper for interacting with the Adobe Connect API that
|
4
|
+
(hopefully) sucks less than interacting with the Adobe Connect API by itself.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'adobe_connect', '0.0.1'
|
11
|
+
|
12
|
+
And then run:
|
13
|
+
|
14
|
+
$ bundle install
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install adobe_connect
|
19
|
+
|
20
|
+
## Get started
|
21
|
+
|
22
|
+
You can get started by running `adobe_connect_console` in your terminal. This
|
23
|
+
will open up a new Pry session with all of the Connect classes loaded.
|
24
|
+
|
25
|
+
# start by configuring it with a username, password, and domain.
|
26
|
+
AdobeConnect::Config.declare do
|
27
|
+
username 'test@example.com'
|
28
|
+
password 'password'
|
29
|
+
domain 'http://connect.example.com'
|
30
|
+
end
|
31
|
+
|
32
|
+
connect = AdobeConnect::Service.new
|
33
|
+
|
34
|
+
# log in so you have a session
|
35
|
+
connect.log_in #=> true
|
36
|
+
|
37
|
+
# get crazy with your bad self
|
38
|
+
connect.principal_list(filter_login: 'test@example.com')
|
39
|
+
connect.sco_contents_by_url(url_path: '/whatever/')
|
40
|
+
|
41
|
+
## Details
|
42
|
+
|
43
|
+
Once you've instantiated a Service instance, it has methods for all of the API
|
44
|
+
calls that Connect supports. Just replace your Connect action and parameter
|
45
|
+
name dashes with underscores. e.g. `principal-update` becomes
|
46
|
+
`principal_update` and `first-name` becomes `first_name`.
|
47
|
+
|
48
|
+
Responses are AdobeConnect::Response objects, and respond to normal Nokogiri
|
49
|
+
methods for querying XML. They also have a `fetch()` method for getting headers
|
50
|
+
and a `status` method for getting back the status code of your request.
|
51
|
+
|
52
|
+
## Contributing
|
53
|
+
|
54
|
+
1. Fork it
|
55
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
56
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
57
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
58
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'adobe_connect/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'adobe_connect'
|
8
|
+
gem.version = AdobeConnect::VERSION
|
9
|
+
gem.authors = ['Zach Pendleton']
|
10
|
+
gem.email = ['zachpendleton@gmail.com']
|
11
|
+
gem.description = %q{An API wrapper for interacting with Adobe Connect services.}
|
12
|
+
gem.summary = %q{An API wrapper for Adobe Connect services.}
|
13
|
+
gem.homepage = 'https://github.com/zachpendleton/adobe_connect'
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
|
20
|
+
gem.add_dependency 'activesupport', '>= 2.3.16'
|
21
|
+
gem.add_dependency 'nokogiri', '~> 1.5.6'
|
22
|
+
gem.add_dependency 'pry', '>= 0.9.11.4'
|
23
|
+
gem.add_dependency 'rake', '~> 10.0.3'
|
24
|
+
|
25
|
+
gem.add_development_dependency 'minitest', '~> 4.6.0'
|
26
|
+
gem.add_development_dependency 'mocha', '~> 0.13.2'
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
module Config
|
3
|
+
|
4
|
+
@settings = Hash.new
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def merge(settings)
|
8
|
+
@settings.merge(settings)
|
9
|
+
end
|
10
|
+
|
11
|
+
def declare(&block)
|
12
|
+
instance_eval(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](key)
|
16
|
+
@settings[key]
|
17
|
+
end
|
18
|
+
|
19
|
+
def []=(key, value)
|
20
|
+
@settings[key] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def settings; @settings; end
|
24
|
+
|
25
|
+
private
|
26
|
+
[:username, :password, :domain].each do |method|
|
27
|
+
define_method(method) { |value| @settings[method] = value }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class MeetingFolder
|
3
|
+
attr_reader :name, :id, :service, :url
|
4
|
+
|
5
|
+
def initialize(id, name, url, service = AdobeConnect::Service.new)
|
6
|
+
@name = name
|
7
|
+
@id = id
|
8
|
+
@service = service
|
9
|
+
@url = url
|
10
|
+
end
|
11
|
+
|
12
|
+
def contents
|
13
|
+
service.sco_contents(sco_id: id)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.find(name, service = AdobeConnect::Service.new)
|
17
|
+
response = service.sco_search_by_field(
|
18
|
+
query: name,
|
19
|
+
filter_type: 'folder',
|
20
|
+
field: 'name')
|
21
|
+
|
22
|
+
MeetingFolder.new(response.at_xpath('//sco').attr('sco-id'),
|
23
|
+
response.at_xpath('//name').text,
|
24
|
+
response.at_xpath('//url-path').text,
|
25
|
+
service)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class ParamFormatter
|
3
|
+
attr_reader :params
|
4
|
+
|
5
|
+
def initialize(params)
|
6
|
+
@params = params
|
7
|
+
end
|
8
|
+
|
9
|
+
def format
|
10
|
+
params.inject(['']) do |array, param|
|
11
|
+
key, value = param.map { |p| ERB::Util.url_encode(p) }
|
12
|
+
array << "#{key.dasherize}=#{value}"
|
13
|
+
end.join('&')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class Response
|
3
|
+
attr_reader :status, :body
|
4
|
+
|
5
|
+
def initialize(response)
|
6
|
+
@response = response
|
7
|
+
@status = response.status
|
8
|
+
@body = Nokogiri::XML(response.body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch(header)
|
12
|
+
@response.fetch(header)
|
13
|
+
end
|
14
|
+
|
15
|
+
def xpath(*args)
|
16
|
+
@body.xpath(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def at_xpath(*args)
|
20
|
+
@body.at_xpath(*args)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class Service
|
3
|
+
attr_reader :username, :domain, :session
|
4
|
+
|
5
|
+
def initialize(options = AdobeConnect::Config)
|
6
|
+
@username = options[:username]
|
7
|
+
@password = options[:password]
|
8
|
+
@domain = URI.parse(options[:domain])
|
9
|
+
@authenticated = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def log_in
|
13
|
+
response = request('login', { login: username, password: password }, false)
|
14
|
+
if response.at_xpath('//status').attr('code') == 'ok'
|
15
|
+
@session = response.fetch('set-cookie').match(/(?<=BREEZESESSION=)[^;]+/)[0]
|
16
|
+
@authenticated = true
|
17
|
+
else
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def authenticated?
|
23
|
+
@authenticated
|
24
|
+
end
|
25
|
+
|
26
|
+
def client
|
27
|
+
if @client.nil?
|
28
|
+
@client = Net::HTTP.new(domain.host, domain.port)
|
29
|
+
@client.use_ssl = (domain.scheme == 'https')
|
30
|
+
end
|
31
|
+
|
32
|
+
@client
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(method, *args)
|
36
|
+
action = method.to_s.dasherize
|
37
|
+
params = args.first
|
38
|
+
|
39
|
+
request(action, params)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
attr_reader :password
|
44
|
+
|
45
|
+
def request(action, params, use_session = true)
|
46
|
+
if use_session
|
47
|
+
log_in unless authenticated?
|
48
|
+
params[:session] = session
|
49
|
+
end
|
50
|
+
|
51
|
+
query_string = ParamFormatter.new(params).format
|
52
|
+
client.get("/api/xml?action=#{action}#{query_string}")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class Session
|
3
|
+
attr_reader :service, :user
|
4
|
+
|
5
|
+
def initialize(user, service = Service.new)
|
6
|
+
@user = user
|
7
|
+
@service = service
|
8
|
+
end
|
9
|
+
|
10
|
+
def key
|
11
|
+
unless key
|
12
|
+
service.log_in
|
13
|
+
@key = service.session
|
14
|
+
end
|
15
|
+
|
16
|
+
key
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
class User
|
3
|
+
attr_reader :id, :canvas_user, :service, :errors
|
4
|
+
|
5
|
+
def initialize(canvas_user, service = Service.new)
|
6
|
+
@canvas_user = canvas_user
|
7
|
+
@service = service
|
8
|
+
@errors = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def username
|
12
|
+
canvas_user.email
|
13
|
+
end
|
14
|
+
|
15
|
+
def password
|
16
|
+
Digest::MD5.hexdigest(@canvas_user.uuid)[0..9]
|
17
|
+
end
|
18
|
+
|
19
|
+
def save
|
20
|
+
response = service.principal_update(first_name: canvas_user.first_name,
|
21
|
+
last_name: canvas_user.last_name, login: canvas_user.email,
|
22
|
+
password: password, type: 'user', has_children: 0,
|
23
|
+
email: canvas_user.email)
|
24
|
+
|
25
|
+
if response.at_xpath('//status').attr('code') == 'ok'
|
26
|
+
true
|
27
|
+
else
|
28
|
+
save_errors(response)
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create(canvas_user)
|
34
|
+
user = AdobeConnect::User.new(canvas_user)
|
35
|
+
user.save
|
36
|
+
|
37
|
+
user
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.find(canvas_user)
|
41
|
+
user = AdobeConnect::User.new(canvas_user)
|
42
|
+
response = user.service.principal_list(filter_login: user.username)
|
43
|
+
|
44
|
+
if principal = response.at_xpath('//principal')
|
45
|
+
user.instance_variable_set(:@id, principal.attr('principal-id'))
|
46
|
+
user
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def save_errors(response)
|
52
|
+
@errors = response.xpath('//invalid').map(&:attributes)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
require 'erb'
|
3
|
+
require 'net/https'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
6
|
+
require 'adobe_connect/config'
|
7
|
+
require 'adobe_connect/response'
|
8
|
+
require 'adobe_connect/session'
|
9
|
+
require 'adobe_connect/service'
|
10
|
+
require 'adobe_connect/param_formatter'
|
11
|
+
require 'adobe_connect/meeting_folder'
|
12
|
+
require 'adobe_connect/user'
|
13
|
+
|
14
|
+
module AdobeConnect; end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<results>
|
3
|
+
<status code="ok"/>
|
4
|
+
<scos>
|
5
|
+
<sco sco-id="26013" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
6
|
+
<name>BIG-001: Course Conference [12]</name>
|
7
|
+
<url-path>/canvas-meeting-12/</url-path>
|
8
|
+
<date-begin>2013-01-18T10:37:21.000-07:00</date-begin>
|
9
|
+
<date-created>2013-01-18T10:37:29.133-07:00</date-created>
|
10
|
+
<date-modified>2013-01-18T10:46:37.187-07:00</date-modified>
|
11
|
+
</sco>
|
12
|
+
<sco sco-id="26102" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
13
|
+
<name>BIOL 1550 E01: Course Conference [45]</name>
|
14
|
+
<url-path>/canvas-meeting-45/</url-path>
|
15
|
+
<date-begin>2013-01-25T14:15:19.000-07:00</date-begin>
|
16
|
+
<date-created>2013-01-25T14:15:26.890-07:00</date-created>
|
17
|
+
<date-modified>2013-01-25T14:28:36.350-07:00</date-modified>
|
18
|
+
</sco>
|
19
|
+
<sco sco-id="25917" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
20
|
+
<name>Discussion Copy 1: Adobe connect conference [18847]</name>
|
21
|
+
<url-path>/canvas-meeting-18847/</url-path>
|
22
|
+
<date-begin>2013-01-15T12:22:03.000-07:00</date-begin>
|
23
|
+
<date-created>2013-01-15T12:22:06.977-07:00</date-created>
|
24
|
+
<date-modified>2013-01-15T12:31:13.053-07:00</date-modified>
|
25
|
+
</sco>
|
26
|
+
<sco sco-id="26109" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
27
|
+
<name>ENGL 2600 E01: Course Conference [46]</name>
|
28
|
+
<url-path>/canvas-meeting-46/</url-path>
|
29
|
+
<date-begin>2013-01-25T14:15:39.000-07:00</date-begin>
|
30
|
+
<date-created>2013-01-25T14:15:47.287-07:00</date-created>
|
31
|
+
<date-modified>2013-01-25T14:27:59.050-07:00</date-modified>
|
32
|
+
</sco>
|
33
|
+
<sco sco-id="26156" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
34
|
+
<name>ENGL-2100: Course Conference [27]</name>
|
35
|
+
<url-path>/canvas-meeting-27/</url-path>
|
36
|
+
<date-begin>2013-01-31T15:04:53.000-07:00</date-begin>
|
37
|
+
<date-created>2013-01-31T15:05:00.680-07:00</date-created>
|
38
|
+
<date-modified>2013-01-31T15:14:11.273-07:00</date-modified>
|
39
|
+
</sco>
|
40
|
+
<sco sco-id="25924" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
41
|
+
<name>IE9 1/26: Course Conference [18848]</name>
|
42
|
+
<url-path>/canvas-meeting-18848/</url-path>
|
43
|
+
<date-begin>2013-01-15T12:52:08.000-07:00</date-begin>
|
44
|
+
<date-created>2013-01-15T12:52:12.113-07:00</date-created>
|
45
|
+
<date-modified>2013-01-15T12:52:12.113-07:00</date-modified>
|
46
|
+
</sco>
|
47
|
+
<sco sco-id="25930" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
48
|
+
<name>IE9 1/26: Group Conference [18849]</name>
|
49
|
+
<url-path>/canvas-meeting-18849/</url-path>
|
50
|
+
<date-begin>2013-01-15T14:04:35.000-07:00</date-begin>
|
51
|
+
<date-created>2013-01-15T14:04:39.303-07:00</date-created>
|
52
|
+
<date-modified>2013-01-15T14:16:56.483-07:00</date-modified>
|
53
|
+
</sco>
|
54
|
+
<sco sco-id="26096" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
55
|
+
<name>LTIDemo: Course Conference [44]</name>
|
56
|
+
<url-path>/canvas-meeting-44/</url-path>
|
57
|
+
<date-begin>2013-01-25T14:15:03.000-07:00</date-begin>
|
58
|
+
<date-created>2013-01-25T14:15:11.373-07:00</date-created>
|
59
|
+
<date-modified>2013-01-25T14:26:22.120-07:00</date-modified>
|
60
|
+
</sco>
|
61
|
+
<sco sco-id="26122" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
62
|
+
<name>LTIDemo: Course Conference [47]</name>
|
63
|
+
<url-path>/canvas-meeting-47/</url-path>
|
64
|
+
<date-begin>2013-01-25T14:17:59.000-07:00</date-begin>
|
65
|
+
<date-created>2013-01-25T14:18:06.710-07:00</date-created>
|
66
|
+
<date-modified>2013-01-25T14:29:11.300-07:00</date-modified>
|
67
|
+
</sco>
|
68
|
+
<sco sco-id="26087" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
|
69
|
+
<name>STC: Course Conference [19114]</name>
|
70
|
+
<url-path>/canvas-meeting-19114/</url-path>
|
71
|
+
<date-begin>2013-01-25T10:16:36.000-07:00</date-begin>
|
72
|
+
<date-created>2013-01-25T10:16:44.260-07:00</date-created>
|
73
|
+
<date-modified>2013-01-25T10:38:59.190-07:00</date-modified>
|
74
|
+
</sco>
|
75
|
+
</scos>
|
76
|
+
</results>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<results>
|
3
|
+
<status code="ok"/>
|
4
|
+
<sco-search-by-field-info>
|
5
|
+
<sco sco-id="25915" account-id="7" folder-id="11004" type="folder" icon="folder" max-retries="" lang="en" display-seq="0" source-sco-id="" version="0" parent-type="-2" tree-type="6" grand-parent="7">
|
6
|
+
<name>canvas_meetings</name>
|
7
|
+
<url-path>/meeting-path/</url-path>
|
8
|
+
<date-created>2013-01-15T12:21:42.243-07:00</date-created>
|
9
|
+
<date-modified>2013-01-15T12:21:42.243-07:00</date-modified>
|
10
|
+
<recordcreated>2013-01-15T05:21:42.463-07:00</recordcreated>
|
11
|
+
<principal-name>Zach Pendleton</principal-name>
|
12
|
+
<folder-name>User Meetings</folder-name>
|
13
|
+
</sco>
|
14
|
+
</sco-search-by-field-info>
|
15
|
+
</results>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<results>
|
3
|
+
<status code="ok"/>
|
4
|
+
<principal-list>
|
5
|
+
<principal principal-id="26243" account-id="7" type="user" has-children="false" is-primary="false" is-hidden="false" training-group-id="">
|
6
|
+
<name>Test User</name>
|
7
|
+
<login>test@example.com</login>
|
8
|
+
<email>test@example.com</email>
|
9
|
+
<display-uid>test@example.com</display-uid>
|
10
|
+
</principal>
|
11
|
+
</principal-list>
|
12
|
+
</results>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<results>
|
3
|
+
<status code="invalid">
|
4
|
+
<invalid field="login" type="string" subcode="range" min="1" max="60"/>
|
5
|
+
<invalid field="login" type="string" subcode="missing"/>
|
6
|
+
<invalid field="first-name" type="string" subcode="range" min="1" max="254"/>
|
7
|
+
</status>
|
8
|
+
</results>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<results>
|
3
|
+
<status code="ok"/>
|
4
|
+
<principal has-children="0" type="user" account-id="7" principal-id="26243">
|
5
|
+
<ext-login>testinguser@example.com</ext-login>
|
6
|
+
<name>Testing User</name>
|
7
|
+
<login>testinguser@example.com</login>
|
8
|
+
</principal>
|
9
|
+
</results>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class ConfigTest < MiniTest::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@config = AdobeConnect::Config
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_bracket_notation_stores_settings
|
9
|
+
@config[:test] = true
|
10
|
+
assert @config.instance_variable_get(:@settings)[:test]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_bracket_notation_returns_settings
|
14
|
+
@config[:test] = '123'
|
15
|
+
assert_equal '123', @config[:test]
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_declare_stores_a_username
|
19
|
+
@config.declare { username 'test@example.com' }
|
20
|
+
assert_equal 'test@example.com', @config[:username]
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_declare_stores_a_password
|
24
|
+
@config.declare { password 'password' }
|
25
|
+
assert_equal 'password', @config[:password]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_declare_stores_a_domain
|
29
|
+
@config.declare { domain 'http://example.com' }
|
30
|
+
assert_equal 'http://example.com', @config[:domain]
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_settings_returns_a_hash
|
34
|
+
assert_instance_of Hash, @config.settings
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class AdobeConnectMeetingFolderTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
AdobeConnect::Config.declare do
|
6
|
+
username 'test@example.com'
|
7
|
+
password 'pwd'
|
8
|
+
domain 'http://example.com'
|
9
|
+
end
|
10
|
+
|
11
|
+
FOLDER_SUCCESS = File.read('test/fixtures/folder_success.xml')
|
12
|
+
FOLDER_CONTENTS = File.read('test/fixtures/folder_contents.xml')
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@folder = AdobeConnect::MeetingFolder.new('1', 'test folder', '/test-meeting/')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialize_takes_a_name
|
19
|
+
assert_equal @folder.name, 'test folder'
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialize_takes_an_id
|
23
|
+
assert_equal @folder.id, '1'
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_initialize_takes_a_url
|
27
|
+
assert_equal @folder.url, '/test-meeting/'
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_initialize_defaults_to_a_new_service
|
31
|
+
assert_instance_of AdobeConnect::Service, @folder.service
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_find_returns_a_new_folder
|
35
|
+
response = mock(status: 200)
|
36
|
+
response.expects(:body).returns(FOLDER_SUCCESS)
|
37
|
+
ac_response = AdobeConnect::Response.new(response)
|
38
|
+
|
39
|
+
AdobeConnect::Service.any_instance.
|
40
|
+
expects(:request).
|
41
|
+
with('sco-search-by-field', query: 'canvas_meetings',
|
42
|
+
filter_type: 'folder', field: 'name').
|
43
|
+
returns(ac_response)
|
44
|
+
|
45
|
+
folder = AdobeConnect::MeetingFolder.find('canvas_meetings')
|
46
|
+
|
47
|
+
assert_instance_of AdobeConnect::MeetingFolder, folder
|
48
|
+
assert_equal folder.name, 'canvas_meetings'
|
49
|
+
assert_equal folder.id, '25915'
|
50
|
+
assert_equal folder.url, '/meeting-path/'
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_contents_returns_folder_contents
|
54
|
+
response = mock(status: 200)
|
55
|
+
response.expects(:body).returns(FOLDER_CONTENTS)
|
56
|
+
ac_response = AdobeConnect::Response.new(response)
|
57
|
+
@folder.service.expects(:sco_contents).returns(ac_response)
|
58
|
+
|
59
|
+
assert_equal @folder.contents.xpath('//sco').length, 10
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class AdobeConnectParamFormatterTest < MiniTest::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
params = { a: 1, b: 'param value', 'dashed_value' => 3 }
|
6
|
+
@formatter = AdobeConnect::ParamFormatter.new(params)
|
7
|
+
@query_string = @formatter.format
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_it_should_format_params_hash_to_a_string
|
11
|
+
assert_instance_of String, @query_string
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_it_should_include_basic_params
|
15
|
+
assert_match Regexp.new('a=1'), @query_string
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_it_should_escape_params
|
19
|
+
assert_match Regexp.new('b=param%20value'), @query_string
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_it_should_dasherize_underscored_keys
|
23
|
+
assert_match Regexp.new('dashed-value'), @query_string
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_it_should_include_a_leading_ampersand
|
27
|
+
assert_match Regexp.new('^&'), @query_string
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_an_empty_hash_should_return_an_empty_string
|
31
|
+
assert_equal AdobeConnect::ParamFormatter.new({}).format, ''
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class AdobeConnectResponseTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
TEST_HEADERS = { 'Accept' => 'application/json' }
|
6
|
+
TEST_BODY = <<-END
|
7
|
+
<?xml version="1.0" encoding="utf-8"?>
|
8
|
+
<response>
|
9
|
+
<name>Test</name>
|
10
|
+
</response>
|
11
|
+
END
|
12
|
+
|
13
|
+
def setup
|
14
|
+
response = stub(status: 200, headers: TEST_HEADERS, body: TEST_BODY)
|
15
|
+
@response = AdobeConnect::Response.new(response)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialize_takes_a_net_http_response
|
19
|
+
assert @response.instance_variable_get(:@response)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialize_creates_a_nokogiri_wrapped_body
|
23
|
+
assert_instance_of Nokogiri::XML::Document, @response.body
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_response_has_a_status
|
27
|
+
assert_equal 200, @response.status
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_fetch_delegates_to_response
|
31
|
+
@response.instance_variable_get(:@response).expects(:fetch).with('Accept')
|
32
|
+
@response.fetch('Accept')
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_xpath_delegates_to_body
|
36
|
+
@response.body.expects(:xpath).with('//name')
|
37
|
+
@response.xpath('//name')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_at_xpath_delegates_to_body
|
41
|
+
@response.body.expects(:at_xpath).with('//name')
|
42
|
+
@response.at_xpath('//name')
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class AdobeConnectServiceTest < MiniTest::Unit::TestCase
|
4
|
+
LOGIN_SUCCESS = File.read('test/fixtures/log_in_success.xml')
|
5
|
+
LOGIN_FAIL = File.read('test/fixtures/log_in_fail.xml')
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@service = AdobeConnect::Service.new(username: 'name', password: 'password',
|
9
|
+
domain: 'http://example.com')
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_initialize_takes_a_config_hash
|
13
|
+
assert_equal @service.username, 'name'
|
14
|
+
assert_equal @service.domain, URI.parse('http://example.com')
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_password_is_not_be_public
|
18
|
+
assert_raises(NoMethodError) { @service.password }
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_authenticated_defaults_to_false
|
22
|
+
assert_equal @service.authenticated?, false
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_log_in_authenticates
|
26
|
+
response = mock(status: 200)
|
27
|
+
response.expects(:fetch).returns('BREEZESESSION=12345')
|
28
|
+
response.expects(:body).returns(LOGIN_SUCCESS)
|
29
|
+
ac_response = AdobeConnect::Response.new(response)
|
30
|
+
@service.client.stubs(:get).returns(ac_response)
|
31
|
+
|
32
|
+
@service.log_in
|
33
|
+
assert @service.authenticated?
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_log_in_creates_a_session
|
37
|
+
response = mock(status: 200)
|
38
|
+
response.expects(:fetch).with('set-cookie').returns('BREEZESESSION=12345;HttpOnly;path=/')
|
39
|
+
response.expects(:body).returns(LOGIN_SUCCESS)
|
40
|
+
ac_response = AdobeConnect::Response.new(response)
|
41
|
+
@service.client.stubs(:get).
|
42
|
+
with("/api/xml?action=login&login=name&password=password").
|
43
|
+
returns(ac_response)
|
44
|
+
|
45
|
+
@service.log_in
|
46
|
+
assert_equal @service.session, '12345'
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_log_in_returns_false_on_failure
|
50
|
+
response = mock(status: 200)
|
51
|
+
response.expects(:body).returns(LOGIN_FAIL)
|
52
|
+
ac_response = AdobeConnect::Response.new(response)
|
53
|
+
@service.client.stubs(:get).returns(ac_response)
|
54
|
+
|
55
|
+
refute @service.log_in
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_unknown_methods_are_proxied_to_the_connect_service
|
59
|
+
@service.expects(:request).with('method-name', a: 1)
|
60
|
+
@service.method_name(a: 1)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class AdobeConnectUserTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
AdobeConnect::Config.declare do
|
6
|
+
username 'test@example.com'
|
7
|
+
password 'pwd'
|
8
|
+
domain 'http://example.com'
|
9
|
+
end
|
10
|
+
|
11
|
+
SAVE_SUCCESS = File.read('test/fixtures/user_save_success.xml')
|
12
|
+
SAVE_ERROR = File.read('test/fixtures/user_save_error.xml')
|
13
|
+
FIND_SUCCESS = File.read('test/fixtures/user_find_success.xml')
|
14
|
+
FIND_ERROR = File.read('test/fixtures/user_find_error.xml')
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@canvas_user = stub(first_name: 'Don', last_name: 'Draper',
|
18
|
+
email: 'test@example.com', uuid: '12345')
|
19
|
+
@connect_user = AdobeConnect::User.new(@canvas_user)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialize_should_take_a_user
|
23
|
+
assert_equal @connect_user.canvas_user, @canvas_user
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_username_should_be_canvas_user_email
|
27
|
+
assert_equal @connect_user.username, @canvas_user.email
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_password_should_create_a_unique_password
|
31
|
+
assert_equal @connect_user.password, @connect_user.password
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_password_should_be_ten_characters_long
|
35
|
+
assert_equal @connect_user.password.length, 10
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_save_persists_user_to_connect_server
|
39
|
+
response = mock(status: 200)
|
40
|
+
response.expects(:body).returns(SAVE_SUCCESS)
|
41
|
+
ac_response = AdobeConnect::Response.new(response)
|
42
|
+
|
43
|
+
@connect_user.service.expects(:principal_update).
|
44
|
+
with(first_name: @canvas_user.first_name,
|
45
|
+
last_name: @canvas_user.last_name, login: @connect_user.username,
|
46
|
+
password: @connect_user.password, type: 'user', has_children: 0,
|
47
|
+
email: @canvas_user.email).
|
48
|
+
returns(ac_response)
|
49
|
+
|
50
|
+
assert @connect_user.save
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_save_returns_false_on_failure
|
54
|
+
response = mock(status: 200)
|
55
|
+
response.expects(:body).returns(SAVE_ERROR)
|
56
|
+
ac_response = AdobeConnect::Response.new(response)
|
57
|
+
|
58
|
+
@connect_user.service.expects(:principal_update).returns(ac_response)
|
59
|
+
refute @connect_user.save
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_save_stores_errors_on_failure
|
63
|
+
response = mock(status: 200)
|
64
|
+
response.expects(:body).returns(SAVE_ERROR)
|
65
|
+
ac_response = AdobeConnect::Response.new(response)
|
66
|
+
|
67
|
+
@connect_user.service.expects(:principal_update).returns(ac_response)
|
68
|
+
@connect_user.save
|
69
|
+
assert_equal 3, @connect_user.errors.length
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_create_should_return_a_new_user
|
73
|
+
AdobeConnect::User.any_instance.expects(:save).returns(true)
|
74
|
+
|
75
|
+
connect_user = AdobeConnect::User.create(@canvas_user)
|
76
|
+
assert_instance_of AdobeConnect::User, connect_user
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_find_should_return_an_existing_user
|
80
|
+
response = mock(status: 200)
|
81
|
+
response.expects(:body).returns(FIND_SUCCESS)
|
82
|
+
ac_response = AdobeConnect::Response.new(response)
|
83
|
+
AdobeConnect::Service.any_instance.expects(:principal_list).
|
84
|
+
with(filter_login: 'test@example.com').
|
85
|
+
returns(ac_response)
|
86
|
+
|
87
|
+
canvas_user = stub(email: 'test@example.com')
|
88
|
+
connect_user = AdobeConnect::User.find(canvas_user)
|
89
|
+
assert_instance_of AdobeConnect::User, connect_user
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_find_should_set_user_attributes
|
93
|
+
response = mock(status: 200)
|
94
|
+
response.expects(:body).returns(FIND_ERROR)
|
95
|
+
ac_response = AdobeConnect::Response.new(response)
|
96
|
+
AdobeConnect::Service.any_instance.expects(:principal_list).
|
97
|
+
returns(ac_response)
|
98
|
+
|
99
|
+
canvas_user = stub(email: 'notfound@example.com')
|
100
|
+
connect_user = AdobeConnect::User.find(canvas_user)
|
101
|
+
assert_nil connect_user
|
102
|
+
end
|
103
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adobe_connect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Zach Pendleton
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.3.16
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.3.16
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: nokogiri
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.5.6
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.5.6
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: pry
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.11.4
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.11.4
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 10.0.3
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 10.0.3
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: minitest
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 4.6.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 4.6.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: mocha
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.13.2
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.13.2
|
110
|
+
description: An API wrapper for interacting with Adobe Connect services.
|
111
|
+
email:
|
112
|
+
- zachpendleton@gmail.com
|
113
|
+
executables:
|
114
|
+
- adobe_connect_console
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- adobe_connect.gemspec
|
124
|
+
- bin/adobe_connect_console
|
125
|
+
- lib/adobe_connect.rb
|
126
|
+
- lib/adobe_connect/config.rb
|
127
|
+
- lib/adobe_connect/meeting_folder.rb
|
128
|
+
- lib/adobe_connect/param_formatter.rb
|
129
|
+
- lib/adobe_connect/response.rb
|
130
|
+
- lib/adobe_connect/service.rb
|
131
|
+
- lib/adobe_connect/session.rb
|
132
|
+
- lib/adobe_connect/user.rb
|
133
|
+
- lib/adobe_connect/version.rb
|
134
|
+
- test/fixtures/folder_contents.xml
|
135
|
+
- test/fixtures/folder_success.xml
|
136
|
+
- test/fixtures/log_in_fail.xml
|
137
|
+
- test/fixtures/log_in_success.xml
|
138
|
+
- test/fixtures/user_find_error.xml
|
139
|
+
- test/fixtures/user_find_success.xml
|
140
|
+
- test/fixtures/user_save_error.xml
|
141
|
+
- test/fixtures/user_save_success.xml
|
142
|
+
- test/lib/adobe_connect/config_test.rb
|
143
|
+
- test/lib/adobe_connect/meeting_folder_test.rb
|
144
|
+
- test/lib/adobe_connect/param_formatter_test.rb
|
145
|
+
- test/lib/adobe_connect/response_test.rb
|
146
|
+
- test/lib/adobe_connect/service_test.rb
|
147
|
+
- test/lib/adobe_connect/user_test.rb
|
148
|
+
- test/test_helper.rb
|
149
|
+
homepage: https://github.com/zachpendleton/adobe_connect
|
150
|
+
licenses: []
|
151
|
+
post_install_message:
|
152
|
+
rdoc_options: []
|
153
|
+
require_paths:
|
154
|
+
- lib
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
requirements: []
|
168
|
+
rubyforge_project:
|
169
|
+
rubygems_version: 1.8.25
|
170
|
+
signing_key:
|
171
|
+
specification_version: 3
|
172
|
+
summary: An API wrapper for Adobe Connect services.
|
173
|
+
test_files:
|
174
|
+
- test/fixtures/folder_contents.xml
|
175
|
+
- test/fixtures/folder_success.xml
|
176
|
+
- test/fixtures/log_in_fail.xml
|
177
|
+
- test/fixtures/log_in_success.xml
|
178
|
+
- test/fixtures/user_find_error.xml
|
179
|
+
- test/fixtures/user_find_success.xml
|
180
|
+
- test/fixtures/user_save_error.xml
|
181
|
+
- test/fixtures/user_save_success.xml
|
182
|
+
- test/lib/adobe_connect/config_test.rb
|
183
|
+
- test/lib/adobe_connect/meeting_folder_test.rb
|
184
|
+
- test/lib/adobe_connect/param_formatter_test.rb
|
185
|
+
- test/lib/adobe_connect/response_test.rb
|
186
|
+
- test/lib/adobe_connect/service_test.rb
|
187
|
+
- test/lib/adobe_connect/user_test.rb
|
188
|
+
- test/test_helper.rb
|