adobe_connect 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|