regis 0.0.2 → 0.0.3
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 +8 -8
- data/.gitignore +4 -3
- data/Gemfile +4 -0
- data/README.md +29 -3
- data/Rakefile +4 -0
- data/config/initializers/regis.rb +10 -0
- data/config/regis_api.example.yml +3 -0
- data/features/config/test_values.example.yml +2 -0
- data/features/regis_api.feature +22 -0
- data/features/step_definitions/api_steps.rb +32 -0
- data/features/support/env.rb +8 -0
- data/lib/regis.rb +11 -0
- data/lib/regis/cache.rb +21 -0
- data/lib/regis/client.rb +78 -0
- data/lib/regis/configuration.rb +8 -0
- data/lib/regis/endpoint/section.rb +17 -0
- data/lib/regis/endpoint/sections.rb +17 -0
- data/lib/regis/responses/base.rb +21 -0
- data/lib/regis/responses/models/section.rb +40 -0
- data/lib/regis/responses/section.rb +14 -0
- data/lib/regis/responses/sections.rb +16 -0
- data/lib/regis/version.rb +3 -0
- data/regis.gemspec +28 -0
- metadata +86 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzMxNTA1YmRmMzkwNGIxZmRkNzUzMTA3YTdiZTBhMGE4ZDdjZWYyNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTBmZTAxYmE1ZmYxYmExNTdlYzkzZjVlMDY4NDgxNDI1MjY1ODlhZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDJiMTBhODY3ZDJjYzk4Y2QyZDFmZTZjZjFiNWNlOTJiOWJkYzYyODk0OWM0
|
10
|
+
MmZmZWVkZjQ1NDUxYWNjYjFlZTBkZjJiNjg5Y2FjYTUwZDU3OGNmYzZmMWEy
|
11
|
+
MzA5N2I0MzU4ZjlkZWJlZDQ4NGFmMTJlMzQ3OGE5MWRlZWZmYWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2ZmMzk2OGJmYjU5ZjhjYzEzMTk0MjI3Njk4YzRjYWQyYmQzZmI5ZjBkMzRi
|
14
|
+
ZDg2Zjg2YTVjYzRhZGRmMmQ1MmMwZTVlYzE4OWFiYTI1N2VkMTA2ODVkNWJi
|
15
|
+
MDdiNzVmOWM0YTFmYmI4OGU4YzQ3ZTBjMzAzZDNiZDdlNGJmOWU=
|
data/.gitignore
CHANGED
@@ -31,9 +31,10 @@ build/
|
|
31
31
|
|
32
32
|
# for a library or gem, you might want to ignore these files since the code is
|
33
33
|
# intended to run in multiple environments; otherwise, check them in:
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
Gemfile.lock
|
35
|
+
.ruby-version
|
36
|
+
.ruby-gemset
|
37
37
|
|
38
38
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
39
39
|
.rvmrc
|
40
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -16,11 +16,37 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install regis
|
18
18
|
|
19
|
-
|
19
|
+
Responses are cached with Dalli which requires memcached
|
20
|
+
|
21
|
+
$ apt-get install memcached
|
22
|
+
|
23
|
+
## Configuration
|
20
24
|
|
21
25
|
Set config/regis_api.yml
|
22
|
-
|
26
|
+
|
27
|
+
```
|
28
|
+
require 'regis'
|
29
|
+
|
30
|
+
$REGIS_API = YAML.load_file("config/regis_api.yml")
|
31
|
+
|
32
|
+
Regis.client.configure do |config|
|
33
|
+
config.url = $REGIS_API['url']
|
34
|
+
config.username = $REGIS_API['username']
|
35
|
+
config.password = $REGIS_API['password']
|
36
|
+
config.cache = Regis::Cache.new(Dalli::Client.new('localhost:11211', { :namespace => "regis", :compress => true, :expires_in => 3600 }))
|
37
|
+
end
|
38
|
+
```
|
23
39
|
|
24
40
|
## Usage
|
25
41
|
|
26
|
-
See features/step_definitions/api_steps
|
42
|
+
See features/step_definitions/api_steps
|
43
|
+
|
44
|
+
## Caching
|
45
|
+
|
46
|
+
All responses are cached based on the request URL. So, all endpoints must include variables in the URL itself.
|
47
|
+
|
48
|
+
## Testing
|
49
|
+
|
50
|
+
Set features/config/test_values.yml
|
51
|
+
|
52
|
+
$ cucumber
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'regis'
|
2
|
+
|
3
|
+
$REGIS_API = YAML.load_file("config/regis_api.yml")
|
4
|
+
|
5
|
+
Regis.client.configure do |config|
|
6
|
+
config.url = $REGIS_API['url']
|
7
|
+
config.username = $REGIS_API['username']
|
8
|
+
config.password = $REGIS_API['password']
|
9
|
+
config.cache = Regis::Cache.new(Dalli::Client.new('localhost:11211', { :namespace => "regis", :compress => true, :expires_in => 3600 }))
|
10
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: regis api can connect
|
2
|
+
In order to use the REGIS api
|
3
|
+
I want to be able to connect
|
4
|
+
|
5
|
+
Scenario: search sections
|
6
|
+
When I search for sections
|
7
|
+
Then I should receive a list of sections
|
8
|
+
|
9
|
+
Scenario: retrieve section
|
10
|
+
When I ask for a section
|
11
|
+
Then I should receive the section I asked for
|
12
|
+
|
13
|
+
Scenario: section values are populated
|
14
|
+
When I ask for a section
|
15
|
+
Then I should have populated section values
|
16
|
+
|
17
|
+
Scenario: api is cached
|
18
|
+
When I reset the section cache
|
19
|
+
And I ask for a section
|
20
|
+
Then I should receive the section I asked for
|
21
|
+
When I ask for a section
|
22
|
+
Then I should have a cached response
|
@@ -0,0 +1,32 @@
|
|
1
|
+
When /^I search for sections$/ do
|
2
|
+
@response = Regis.client.sections_get_by_reporting_term($REGIS_TEST_VALUES['reporting_term'])
|
3
|
+
end
|
4
|
+
|
5
|
+
Then /^I should receive a list of sections$/ do
|
6
|
+
expect(@response.sections.count > 0).to be true
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^I reset the section cache$/ do
|
10
|
+
Regis.client.configuration.cache.delete("/Section/Admin/#{$REGIS_TEST_VALUES['section_uuid']}?format=json")
|
11
|
+
end
|
12
|
+
|
13
|
+
When /^I ask for a section$/ do
|
14
|
+
@response = Regis.client.section_get_by_uuid($REGIS_TEST_VALUES['section_uuid'])
|
15
|
+
end
|
16
|
+
|
17
|
+
Then /^I should receive the section I asked for$/ do
|
18
|
+
expect(@response.section.uuid == $REGIS_TEST_VALUES['section_uuid']).to be true
|
19
|
+
end
|
20
|
+
|
21
|
+
Then /^I should have populated section values$/ do
|
22
|
+
expect(@response.section.uuid).not_to be_empty
|
23
|
+
expect(@response.section.reporting_term).not_to be_empty
|
24
|
+
expect(@response.section.course_name).not_to be_empty
|
25
|
+
expect(@response.section.title).not_to be_empty
|
26
|
+
expect(@response.section.min_credits).to be > 0
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^I should have a cached response$/ do
|
30
|
+
response = Regis.client.configuration.cache.read("/Section/Admin/#{$REGIS_TEST_VALUES['section_uuid']}?format=json")
|
31
|
+
expect(response).to be_instance_of(Faraday::Response)
|
32
|
+
end
|
data/lib/regis.rb
ADDED
data/lib/regis/cache.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Regis
|
2
|
+
class Cache
|
3
|
+
attr_accessor :store
|
4
|
+
|
5
|
+
def initialize(store)
|
6
|
+
@store = store
|
7
|
+
end
|
8
|
+
|
9
|
+
def write(key, value)
|
10
|
+
@store.set(key, value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def read(key)
|
14
|
+
@store.get(key)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete(key)
|
18
|
+
@store.delete(key)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/regis/client.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'faraday-cookie_jar'
|
4
|
+
|
5
|
+
require 'dalli'
|
6
|
+
|
7
|
+
require 'regis/cache'
|
8
|
+
require 'regis/configuration'
|
9
|
+
require 'regis/endpoint/section'
|
10
|
+
require 'regis/endpoint/sections'
|
11
|
+
|
12
|
+
module Regis
|
13
|
+
class Client
|
14
|
+
REQUEST_CLASSES = [ Regis::Endpoint::Section, Regis::Endpoint::Sections ]
|
15
|
+
|
16
|
+
attr_reader :configuration
|
17
|
+
|
18
|
+
def initialize(options = nil)
|
19
|
+
@configuration = nil
|
20
|
+
define_request_methods
|
21
|
+
|
22
|
+
unless options.nil?
|
23
|
+
@configuration = Configuration.new(options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def configure
|
28
|
+
@configuration = Configuration.new
|
29
|
+
yield(@configuration)
|
30
|
+
end
|
31
|
+
|
32
|
+
def connection
|
33
|
+
return @connection if instance_variable_defined?(:@connection)
|
34
|
+
@connection = Faraday.new(@configuration.url, :ssl => {:verify => false}) do |faraday|
|
35
|
+
faraday.basic_auth(@configuration.username, @configuration.password)
|
36
|
+
faraday.request :json
|
37
|
+
|
38
|
+
faraday.response :json, :content_type => /\bjson$/
|
39
|
+
#faraday.response :logger
|
40
|
+
|
41
|
+
faraday.response :caching do
|
42
|
+
@configuration.cache
|
43
|
+
end
|
44
|
+
|
45
|
+
faraday.use :cookie_jar #preserve the servicestack session
|
46
|
+
faraday.adapter Faraday.default_adapter
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# This goes through each endpoint class and creates singletone methods
|
53
|
+
# on the client that query those classes. We do this to avoid possible
|
54
|
+
# namespace collisions in the future when adding new classes
|
55
|
+
def define_request_methods
|
56
|
+
REQUEST_CLASSES.each do |request_class|
|
57
|
+
endpoint_instance = request_class.new(self)
|
58
|
+
create_methods_from_instance(endpoint_instance)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Loop through all of the endpoint instances' public singleton methods to
|
63
|
+
# add the method to client
|
64
|
+
def create_methods_from_instance(instance)
|
65
|
+
instance.public_methods(false).each do |method_name|
|
66
|
+
add_method(instance, method_name)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Define the method on the client and send it to the endpoint instance
|
71
|
+
# with the args passed in
|
72
|
+
def add_method(instance, method_name)
|
73
|
+
define_singleton_method(method_name) do |*args|
|
74
|
+
instance.public_send(method_name, *args)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'regis/responses/section'
|
3
|
+
|
4
|
+
module Regis
|
5
|
+
module Endpoint
|
6
|
+
class Section
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
def section_get_by_uuid(uuid)
|
12
|
+
response = @client.connection.get "/Section/Admin/#{uuid}", { :format => 'json' }
|
13
|
+
Response::Section.new(response.body)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'regis/responses/sections'
|
3
|
+
|
4
|
+
module Regis
|
5
|
+
module Endpoint
|
6
|
+
class Sections
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
def sections_get_by_reporting_term(reporting_term)
|
12
|
+
response = @client.connection.get "/Sections/Admin/#{reporting_term}", { :format => 'json' }
|
13
|
+
Response::Sections.new(response.body)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Regis
|
2
|
+
module Response
|
3
|
+
class Base
|
4
|
+
def initialize(json)
|
5
|
+
return if json.nil?
|
6
|
+
|
7
|
+
json.each do |key, value|
|
8
|
+
instance_variable_set("@#{key}", value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse(json, klass)
|
15
|
+
return json.collect { |j| klass.new(j) } if json.is_a?(Array)
|
16
|
+
return klass.new(json) if json
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'regis/responses/base'
|
2
|
+
|
3
|
+
module Regis
|
4
|
+
module Response
|
5
|
+
module Model
|
6
|
+
class Section < Response::Base
|
7
|
+
attr_reader :uuid
|
8
|
+
attr_reader :course_name
|
9
|
+
attr_reader :title
|
10
|
+
attr_reader :location
|
11
|
+
attr_reader :room
|
12
|
+
|
13
|
+
attr_reader :is_audio
|
14
|
+
attr_reader :is_oncampus
|
15
|
+
|
16
|
+
attr_reader :start_date
|
17
|
+
attr_reader :end_date
|
18
|
+
attr_reader :meeting_days
|
19
|
+
attr_reader :start_times
|
20
|
+
attr_reader :end_times
|
21
|
+
|
22
|
+
attr_reader :is_weekend
|
23
|
+
attr_reader :is_weekday
|
24
|
+
attr_reader :is_evening
|
25
|
+
attr_reader :is_waitlist
|
26
|
+
|
27
|
+
attr_reader :is_unlisted
|
28
|
+
|
29
|
+
attr_reader :reporting_term
|
30
|
+
attr_reader :min_credits
|
31
|
+
attr_reader :max_credits
|
32
|
+
attr_reader :is_pass_fail
|
33
|
+
|
34
|
+
def initialize(json)
|
35
|
+
super(json)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'regis/responses/base'
|
2
|
+
require 'regis/responses/models/section'
|
3
|
+
|
4
|
+
module Regis
|
5
|
+
module Response
|
6
|
+
class Sections < Base
|
7
|
+
attr_reader :sections
|
8
|
+
|
9
|
+
def initialize(json)
|
10
|
+
super(json)
|
11
|
+
|
12
|
+
@sections = parse(@sections, Model::Section)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/regis.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'regis/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'regis'
|
8
|
+
s.required_ruby_version = '>= 1.9.3'
|
9
|
+
s.add_runtime_dependency 'faraday', '~> 0.8', '>= 0.8.0'
|
10
|
+
s.add_runtime_dependency 'faraday_middleware', '~> 0.8', '>= 0.8.0'
|
11
|
+
s.add_runtime_dependency 'faraday-cookie_jar', '~> 0.0.6', '>= 0.0.6'
|
12
|
+
s.add_runtime_dependency 'faraday-http-cache', '~> 1.2', '>= 1.2.2'
|
13
|
+
s.add_runtime_dependency 'dalli', '~> 2.7', '>= 2.7.0'
|
14
|
+
s.add_development_dependency 'cucumber', '~> 1.3', '>= 1.3.20'
|
15
|
+
s.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
|
16
|
+
s.date = '2016-01-15'
|
17
|
+
s.summary = "Ruby API connector"
|
18
|
+
s.description = "The REGIS API as typed models"
|
19
|
+
s.authors = ["Cameron Tucker"]
|
20
|
+
s.email = 'ctucker@regent-college.edu'
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {features}/*`.split("\n")
|
23
|
+
s.homepage = 'https://github.com/RegentCollege/regis-ruby'
|
24
|
+
s.license = 'AGPL'
|
25
|
+
s.version = Regis::VERSION
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.test_files = s.files.grep(%r{^(features)/})
|
28
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: regis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Tucker
|
@@ -50,6 +50,66 @@ dependencies:
|
|
50
50
|
- - ! '>='
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 0.8.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: faraday-cookie_jar
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.0.6
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.0.6
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.0.6
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 0.0.6
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: faraday-http-cache
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.2'
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.2
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.2.2
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: dalli
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '2.7'
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.7.0
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.7'
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.7.0
|
53
113
|
- !ruby/object:Gem::Dependency
|
54
114
|
name: cucumber
|
55
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,8 +157,28 @@ extensions: []
|
|
97
157
|
extra_rdoc_files: []
|
98
158
|
files:
|
99
159
|
- .gitignore
|
160
|
+
- Gemfile
|
100
161
|
- LICENSE
|
101
162
|
- README.md
|
163
|
+
- Rakefile
|
164
|
+
- config/initializers/regis.rb
|
165
|
+
- config/regis_api.example.yml
|
166
|
+
- features/config/test_values.example.yml
|
167
|
+
- features/regis_api.feature
|
168
|
+
- features/step_definitions/api_steps.rb
|
169
|
+
- features/support/env.rb
|
170
|
+
- lib/regis.rb
|
171
|
+
- lib/regis/cache.rb
|
172
|
+
- lib/regis/client.rb
|
173
|
+
- lib/regis/configuration.rb
|
174
|
+
- lib/regis/endpoint/section.rb
|
175
|
+
- lib/regis/endpoint/sections.rb
|
176
|
+
- lib/regis/responses/base.rb
|
177
|
+
- lib/regis/responses/models/section.rb
|
178
|
+
- lib/regis/responses/section.rb
|
179
|
+
- lib/regis/responses/sections.rb
|
180
|
+
- lib/regis/version.rb
|
181
|
+
- regis.gemspec
|
102
182
|
homepage: https://github.com/RegentCollege/regis-ruby
|
103
183
|
licenses:
|
104
184
|
- AGPL
|
@@ -123,4 +203,8 @@ rubygems_version: 2.4.8
|
|
123
203
|
signing_key:
|
124
204
|
specification_version: 4
|
125
205
|
summary: Ruby API connector
|
126
|
-
test_files:
|
206
|
+
test_files:
|
207
|
+
- features/config/test_values.example.yml
|
208
|
+
- features/regis_api.feature
|
209
|
+
- features/step_definitions/api_steps.rb
|
210
|
+
- features/support/env.rb
|