moodle-api 1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/Guardfile +70 -0
- data/LICENSE.txt +21 -0
- data/README.md +128 -0
- data/Rakefile +5 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/fixtures/vcr_cassettes/external_service/invalid_service.yml +48 -0
- data/fixtures/vcr_cassettes/external_service/token_service.yml +39 -0
- data/fixtures/vcr_cassettes/external_service/valid_service.yml +61 -0
- data/fixtures/vcr_cassettes/external_service/valid_service_empty_array_response.yml +46 -0
- data/fixtures/vcr_cassettes/external_service/valid_service_not_external.yml +59 -0
- data/fixtures/vcr_cassettes/external_service/valid_service_with_invalid_token.yml +47 -0
- data/fixtures/vcr_cassettes/token_service/error_invalid_service_token_service.yml +39 -0
- data/fixtures/vcr_cassettes/token_service/invalid_password_token_service.yml +49 -0
- data/fixtures/vcr_cassettes/token_service/invalid_permissions_token_service.yml +49 -0
- data/fixtures/vcr_cassettes/token_service/invalid_service_token_service.yml +48 -0
- data/fixtures/vcr_cassettes/token_service/invalid_user_token_service.yml +49 -0
- data/fixtures/vcr_cassettes/token_service/invalid_username_token_service.yml +49 -0
- data/fixtures/vcr_cassettes/token_service/token_service.yml +47 -0
- data/lib/moodle.rb +1 -0
- data/lib/moodle/api.rb +34 -0
- data/lib/moodle/api/client.rb +40 -0
- data/lib/moodle/api/configuration.rb +55 -0
- data/lib/moodle/api/errors.rb +5 -0
- data/lib/moodle/api/request.rb +45 -0
- data/lib/moodle/api/token_generator.rb +37 -0
- data/lib/moodle/api/version.rb +5 -0
- data/moodle-api.gemspec +38 -0
- metadata +175 -0
data/lib/moodle.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'moodle/api'
|
data/lib/moodle/api.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'moodle/api/version'
|
2
|
+
require 'moodle/api/configuration'
|
3
|
+
require 'moodle/api/client'
|
4
|
+
require 'moodle/api/errors'
|
5
|
+
require 'moodle/api/token_generator'
|
6
|
+
require 'moodle/api/request'
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'pry'
|
10
|
+
rescue
|
11
|
+
LoadError
|
12
|
+
end
|
13
|
+
|
14
|
+
module Moodle
|
15
|
+
module Api
|
16
|
+
class << self
|
17
|
+
def method_missing method, *args, &block
|
18
|
+
if client.respond_to?(method)
|
19
|
+
client.send(method, *args, &block)
|
20
|
+
else
|
21
|
+
client.make_request(method, args.first) # assume method name is moodle external service
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def respond_to?(method, include_all=false)
|
26
|
+
return client.respond_to?(method, include_all) || super
|
27
|
+
end
|
28
|
+
|
29
|
+
def client
|
30
|
+
@client ||= Moodle::Api::Client.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Moodle
|
2
|
+
module Api
|
3
|
+
class Client
|
4
|
+
attr_reader :web_service_name, :filter_params
|
5
|
+
attr_writer :token_service
|
6
|
+
|
7
|
+
def initialize options = {}
|
8
|
+
configure(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_request web_service_name, filter_params = {}
|
12
|
+
@web_service_name = web_service_name
|
13
|
+
@filter_params = filter_params
|
14
|
+
|
15
|
+
Request.new.post(configuration.web_service_api_url, request_params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def request_params
|
19
|
+
{
|
20
|
+
params: filter_params.merge!({ moodlewsrestformat: configuration.format,
|
21
|
+
wsfunction: web_service_name,
|
22
|
+
wstoken: configuration.token }),
|
23
|
+
headers: { 'Accept' => 'json' }
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def configure options = {}, &block
|
28
|
+
configuration.configure(options, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset_configuration
|
32
|
+
configuration.reset
|
33
|
+
end
|
34
|
+
|
35
|
+
def configuration
|
36
|
+
@configuration ||= Configuration.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Moodle
|
2
|
+
module Api
|
3
|
+
class Configuration
|
4
|
+
attr_writer :token_service
|
5
|
+
attr_accessor :host,
|
6
|
+
:username,
|
7
|
+
:password,
|
8
|
+
:service,
|
9
|
+
:token,
|
10
|
+
:format
|
11
|
+
|
12
|
+
DEFAULT_FORMAT = :json
|
13
|
+
|
14
|
+
DEFAULT_WEB_SERVICE_API_URL = '/webservice/rest/server.php'
|
15
|
+
|
16
|
+
DEFAULT_TOKEN_API_URL = '/login/token.php'
|
17
|
+
|
18
|
+
def initialize options = {}
|
19
|
+
@format = DEFAULT_FORMAT
|
20
|
+
|
21
|
+
configure(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def reset
|
25
|
+
@host = nil
|
26
|
+
@username = nil
|
27
|
+
@password = nil
|
28
|
+
@service = nil
|
29
|
+
@token = nil
|
30
|
+
@format = DEFAULT_FORMAT
|
31
|
+
end
|
32
|
+
|
33
|
+
def web_service_api_url
|
34
|
+
"#{host}#{DEFAULT_WEB_SERVICE_API_URL}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def token_api_url
|
38
|
+
"#{host}#{DEFAULT_TOKEN_API_URL}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def configure options = {}, &block
|
42
|
+
options.each { |key, value| instance_variable_set("@#{key}", value) }
|
43
|
+
block.call(self) if block_given?
|
44
|
+
end
|
45
|
+
|
46
|
+
def token
|
47
|
+
@token ||= token_service.call # if not set use token service
|
48
|
+
end
|
49
|
+
|
50
|
+
def token_service
|
51
|
+
@token_service ||= TokenGenerator.new(self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Moodle
|
5
|
+
module Api
|
6
|
+
class Request
|
7
|
+
attr_reader :response
|
8
|
+
|
9
|
+
def post path, options = {}
|
10
|
+
@response = Typhoeus.post(path, options)
|
11
|
+
resolve_response if response.success?
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def resolve_response
|
17
|
+
response_body unless request_raised_exception?
|
18
|
+
end
|
19
|
+
|
20
|
+
def request_raised_exception?
|
21
|
+
if external_services_api_exception?
|
22
|
+
raise MoodleError, response_body["message"]
|
23
|
+
elsif token_service_api_exception?
|
24
|
+
raise MoodleError, response_body["error"]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def exception_raised?
|
29
|
+
external_services_api_exception? && token_service_api_exception?
|
30
|
+
end
|
31
|
+
|
32
|
+
def external_services_api_exception?
|
33
|
+
response_body.is_a?(Hash) && response_body['exception']
|
34
|
+
end
|
35
|
+
|
36
|
+
def token_service_api_exception?
|
37
|
+
response_body.is_a?(Hash) && response_body['error']
|
38
|
+
end
|
39
|
+
|
40
|
+
def response_body
|
41
|
+
JSON.parse(response.body)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Moodle
|
2
|
+
module Api
|
3
|
+
class TokenGenerator
|
4
|
+
attr_reader :configuration
|
5
|
+
|
6
|
+
def initialize configuration
|
7
|
+
@configuration = configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
raise ArgumentError, 'Username and password are required to generate a token' if raise_token_exception?
|
12
|
+
generate_token
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def generate_token
|
18
|
+
response = Request.new.post(configuration.token_api_url,
|
19
|
+
params: request_params,
|
20
|
+
headers: { 'Accept' => "json" })
|
21
|
+
response['token']
|
22
|
+
end
|
23
|
+
|
24
|
+
def raise_token_exception?
|
25
|
+
configuration.username.nil? || configuration.password.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
def request_params
|
29
|
+
{
|
30
|
+
username: configuration.username,
|
31
|
+
password: configuration.password,
|
32
|
+
service: configuration.service
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/moodle-api.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'moodle/api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "moodle-api"
|
8
|
+
spec.version = Moodle::Api::VERSION
|
9
|
+
spec.authors = ["Ryan-Neal Mes"]
|
10
|
+
spec.email = ["ryan.mes@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Moodle web service API wrapper.}
|
13
|
+
spec.description = %q{Wraps Moodle API and exposes web services that have been made external.}
|
14
|
+
spec.homepage = "https://github.com/get-smarter/moodle-api"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
|
+
# delete this section to allow pushing this gem to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
21
|
+
else
|
22
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
+
spec.bindir = "exe"
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ["lib"]
|
29
|
+
|
30
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
31
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
32
|
+
spec.add_development_dependency 'rspec'
|
33
|
+
spec.add_development_dependency 'guard-rspec'
|
34
|
+
spec.add_development_dependency 'pry'
|
35
|
+
spec.add_development_dependency 'vcr'
|
36
|
+
|
37
|
+
spec.add_dependency 'typhoeus'
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: moodle-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.2'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan-Neal Mes
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard-rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: vcr
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: typhoeus
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Wraps Moodle API and exposes web services that have been made external.
|
112
|
+
email:
|
113
|
+
- ryan.mes@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- ".rspec"
|
120
|
+
- ".ruby-version"
|
121
|
+
- Gemfile
|
122
|
+
- Guardfile
|
123
|
+
- LICENSE.txt
|
124
|
+
- README.md
|
125
|
+
- Rakefile
|
126
|
+
- bin/console
|
127
|
+
- bin/setup
|
128
|
+
- fixtures/vcr_cassettes/external_service/invalid_service.yml
|
129
|
+
- fixtures/vcr_cassettes/external_service/token_service.yml
|
130
|
+
- fixtures/vcr_cassettes/external_service/valid_service.yml
|
131
|
+
- fixtures/vcr_cassettes/external_service/valid_service_empty_array_response.yml
|
132
|
+
- fixtures/vcr_cassettes/external_service/valid_service_not_external.yml
|
133
|
+
- fixtures/vcr_cassettes/external_service/valid_service_with_invalid_token.yml
|
134
|
+
- fixtures/vcr_cassettes/token_service/error_invalid_service_token_service.yml
|
135
|
+
- fixtures/vcr_cassettes/token_service/invalid_password_token_service.yml
|
136
|
+
- fixtures/vcr_cassettes/token_service/invalid_permissions_token_service.yml
|
137
|
+
- fixtures/vcr_cassettes/token_service/invalid_service_token_service.yml
|
138
|
+
- fixtures/vcr_cassettes/token_service/invalid_user_token_service.yml
|
139
|
+
- fixtures/vcr_cassettes/token_service/invalid_username_token_service.yml
|
140
|
+
- fixtures/vcr_cassettes/token_service/token_service.yml
|
141
|
+
- lib/moodle.rb
|
142
|
+
- lib/moodle/api.rb
|
143
|
+
- lib/moodle/api/client.rb
|
144
|
+
- lib/moodle/api/configuration.rb
|
145
|
+
- lib/moodle/api/errors.rb
|
146
|
+
- lib/moodle/api/request.rb
|
147
|
+
- lib/moodle/api/token_generator.rb
|
148
|
+
- lib/moodle/api/version.rb
|
149
|
+
- moodle-api.gemspec
|
150
|
+
homepage: https://github.com/get-smarter/moodle-api
|
151
|
+
licenses:
|
152
|
+
- MIT
|
153
|
+
metadata:
|
154
|
+
allowed_push_host: https://rubygems.org
|
155
|
+
post_install_message:
|
156
|
+
rdoc_options: []
|
157
|
+
require_paths:
|
158
|
+
- lib
|
159
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
requirements: []
|
170
|
+
rubyforge_project:
|
171
|
+
rubygems_version: 2.4.6
|
172
|
+
signing_key:
|
173
|
+
specification_version: 4
|
174
|
+
summary: Moodle web service API wrapper.
|
175
|
+
test_files: []
|