arbor 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ef88472480a661ea860c484d64e75f9884a2d171
4
+ data.tar.gz: 13885de2ac13295ab06788ece47856b6502cf1af
5
+ SHA512:
6
+ metadata.gz: a19f952f616fb95da9c16d36bf6a4b67d87bf1051096fedd5bf3c11714bdea34611f2277cab870c369276ecaa2f0a4d9aecd466c1eb8fa8b566ad9635c8adbcd
7
+ data.tar.gz: ec4b7ba338c051f2d8020bdc4b40e8fc705dc14a3d088aba5724f58fe3eff1e5063c1fa3cfe06fee7218020cf7ce6ad38471794bf2458f9deccc4f6f1a60e00d
data/.gitignore ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ arbor (0.0.1)
5
+ activesupport (>= 3.0.0)
6
+ httpi
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (4.1.5)
12
+ i18n (~> 0.6, >= 0.6.9)
13
+ json (~> 1.7, >= 1.7.7)
14
+ minitest (~> 5.1)
15
+ thread_safe (~> 0.1)
16
+ tzinfo (~> 1.1)
17
+ httpi (2.0.2)
18
+ rack
19
+ i18n (0.6.11)
20
+ json (1.8.1)
21
+ minitest (5.4.1)
22
+ rack (1.5.2)
23
+ rake (10.3.2)
24
+ thread_safe (0.3.4)
25
+ tzinfo (1.2.2)
26
+ thread_safe (~> 0.1)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ arbor!
33
+ bundler (~> 1.3)
34
+ rake
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Mike Campbell, Meritec Ltd
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Ruby Interface for Arbor API
2
+
3
+ A Ruby interface to [Arbor Education API](http://www.arbor-education.com/developers.html).
4
+
5
+ ## Installation
6
+
7
+ gem install arbor
8
+
9
+ ## Usage
10
+
11
+ ```ruby
12
+ require 'arbor'
13
+
14
+ client = Arbor::Client.new("some-school", "user@email.net", "abc123")
15
+
16
+ # retrieve all students
17
+ students = client.query(:students)
18
+
19
+ # resources loaded by `query` (listings) are lazily loaded, and will
20
+ # generate another request for that specific resource when an attribute is
21
+ # requested which isn't already loaded
22
+ students.each do |s|
23
+ # extra requests to /rest-v2/students/<id> (s.href) occur here for each item
24
+ puts "#{s.person.legal_first_name} #{s.person.legal_last_name}"
25
+ end
26
+
27
+ # use `retrieve` to get a single resource
28
+ student = client.retrieve(:student, 1)
29
+
30
+ # by default, it serialises the API responses in to classes defined for
31
+ # each resource. you can set your own serialiser for a resource type:
32
+ Arbor.serialisers.register(:students, MyStudentSerialiser)
33
+
34
+ # and/or modify the default serialiser. serialiser classes must respond to
35
+ # `deserialise` and return a single resource
36
+ Arbor.serialisers.default_serialiser = MyDefaultSerialiser
37
+ ```
38
+
39
+ ## Still to do
40
+
41
+ - Write tests
42
+ - Support the other stuff like ordering, paging, changelog etc.
43
+ - Include an API mixin for the resource classes
44
+ - RDoc it up
45
+
46
+ ## Licence
47
+
48
+ [MIT License](http://opensource.org/licenses/MIT)
data/Rakefile ADDED
File without changes
data/arbor.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'arbor/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "arbor"
8
+ spec.version = Arbor::VERSION
9
+ spec.authors = ["Mike Campbell"]
10
+ spec.email = ["mike.campbell@meritec.co.uk"]
11
+ spec.description = %q{Interface for the Arbor Education REST API.}
12
+ spec.summary = %q{Interface for the Arbor Education REST API.}
13
+ spec.homepage = "http://github.com/meritec/arbor-rb"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "activesupport", ">= 3.0.0"
22
+ spec.add_dependency "httpi", ">= 2.0.5"
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake", "~> 0"
25
+ end
data/doctor.rb ADDED
@@ -0,0 +1,87 @@
1
+ # Usage: ruby doctor.rb [HOST=status.github.com[:PORT=443]]
2
+ require 'rbconfig'
3
+ require 'net/https'
4
+
5
+ if ARGV[0] =~ /^[^-]/
6
+ host, port = ARGV[0].split(':', 2)
7
+ else
8
+ host = 'status.github.com'
9
+ end
10
+ port ||= 443
11
+
12
+ ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
13
+ ruby_version = RUBY_VERSION
14
+ if patch = RbConfig::CONFIG['PATCHLEVEL']
15
+ ruby_version += "-p#{patch}"
16
+ end
17
+ puts "%s (%s)" % [ruby, ruby_version]
18
+
19
+ openssl_dir = OpenSSL::X509::DEFAULT_CERT_AREA
20
+ mac_openssl = '/System/Library/OpenSSL' == openssl_dir
21
+ puts "%s: %s" % [OpenSSL::OPENSSL_VERSION, openssl_dir]
22
+ [OpenSSL::X509::DEFAULT_CERT_DIR_ENV, OpenSSL::X509::DEFAULT_CERT_FILE_ENV].each do |key|
23
+ puts "%s=%s" % [key, ENV[key].to_s.inspect]
24
+ end
25
+
26
+ ca_file = ENV[OpenSSL::X509::DEFAULT_CERT_FILE_ENV] || OpenSSL::X509::DEFAULT_CERT_FILE
27
+ ca_path = (ENV[OpenSSL::X509::DEFAULT_CERT_DIR_ENV] || OpenSSL::X509::DEFAULT_CERT_DIR).chomp('/')
28
+
29
+ puts "\nHEAD https://#{host}:#{port}"
30
+ http = Net::HTTP.new(host, port)
31
+ http.use_ssl = true
32
+
33
+ # Explicitly setting cert_store like this is not needed in most cases but it
34
+ # seems necessary in edge cases such as when using `verify_callback` in some
35
+ # combination of Ruby + OpenSSL versions.
36
+ http.cert_store = OpenSSL::X509::Store.new
37
+ http.cert_store.set_default_paths
38
+
39
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
40
+ failed_cert = failed_cert_reason = nil
41
+
42
+ if mac_openssl
43
+ warn "warning: will not be able show failed certificate info on OS X's OpenSSL"
44
+ # This drives me absolutely nuts. It seems that on Rubies compiled against OS X's
45
+ # system OpenSSL, the mere fact of defining a `verify_callback` makes the
46
+ # cert verification fail for requests that would otherwise be successful.
47
+ else
48
+ http.verify_callback = lambda { |verify_ok, store_context|
49
+ if !verify_ok
50
+ failed_cert = store_context.current_cert
51
+ failed_cert_reason = "%d: %s" % [ store_context.error, store_context.error_string ]
52
+ end
53
+ verify_ok
54
+ }
55
+ end
56
+
57
+ user_agent = "net/http #{ruby_version}"
58
+ req = Net::HTTP::Head.new('/', 'user-agent' => user_agent)
59
+
60
+ begin
61
+ res = http.start { http.request(req) }
62
+ abort res.inspect if res.code.to_i >= 500
63
+ puts "OK"
64
+ rescue Errno::ECONNREFUSED
65
+ puts "Error: connection refused"
66
+ exit 1
67
+ rescue OpenSSL::SSL::SSLError => e
68
+ puts "#{e.class}: #{e.message}"
69
+
70
+ if failed_cert
71
+ puts "\nThe server presented a certificate that could not be verified:"
72
+ puts " subject: #{failed_cert.subject}"
73
+ puts " issuer: #{failed_cert.issuer}"
74
+ puts " error code %s" % failed_cert_reason
75
+ end
76
+
77
+ ca_file_missing = !File.exist?(ca_file) && !mac_openssl
78
+ ca_path_empty = Dir["#{ca_path}/*"].empty?
79
+
80
+ if ca_file_missing || ca_path_empty
81
+ puts "\nPossible causes:"
82
+ puts " `%s' does not exist" % ca_file if ca_file_missing
83
+ puts " `%s/' is empty" % ca_path if ca_path_empty
84
+ end
85
+
86
+ exit 1
87
+ end
data/lib/arbor/api.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'arbor/model/serialiser'
2
+
3
+ module Arbor
4
+ module API
5
+ def retrieve(type, id)
6
+ resource = parse_resource(type)
7
+ data = get("/rest-v2/#{resource}/#{id}")
8
+
9
+ unmarshall_data(data, resource)
10
+ end
11
+
12
+ def query(type, query = nil)
13
+ resource = parse_resource(type)
14
+ query_string = query.build_query_string if query
15
+
16
+ data = get("/rest-v2/#{resource}?#{query_string}")
17
+
18
+ unmarshall_data(data, resource)
19
+ end
20
+
21
+ private
22
+ def unmarshall_data(data, resource)
23
+ singular_resource = resource.to_s.singularize
24
+ plural_resource = resource.to_s
25
+
26
+ if (res = data[singular_resource])
27
+ Model::Serialiser.parse_resource(res).tap { |obj|
28
+ obj.attach_client(self) if obj.respond_to?(:attach_client)
29
+ obj.lock_attributes = true
30
+ }
31
+ elsif data[plural_resource]
32
+ data[plural_resource].map do |res|
33
+ Model::Serialiser.parse_resource(res).tap { |obj|
34
+ obj.attach_client(self) if obj.respond_to?(:attach_client)
35
+ }
36
+ end
37
+ else
38
+ raise Errors::SerialisationError, "Unexpected root key in API data."
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ require 'arbor/api'
2
+ require 'arbor/utils'
3
+ require 'httpi'
4
+ require 'json'
5
+
6
+ module Arbor
7
+ class Client
8
+ include Arbor::API
9
+ include Arbor::Utils
10
+ attr_accessor :host, :username, :password, :settings
11
+
12
+ def initialize(*args)
13
+ @settings = args.last.is_a?(Hash) ? args.pop : {}
14
+ raise ArgumentError, "must supply a subdomain, username and password" if args.length < 3
15
+ subdomain, @username, @password = args
16
+ @host = "https://#{subdomain}.uk.arbor.sc"
17
+ end
18
+
19
+ [:get, :post].each do |verb|
20
+ define_method(verb) do |*args|
21
+ request = configure_request(*args)
22
+ response = HTTPI.request(verb, request, settings[:adapter])
23
+ JSON.parse(response.body.presence || "{}")
24
+ end
25
+ end
26
+
27
+ private
28
+ def configure_request(path, *args)
29
+ url = "#{host}#{path}"
30
+ request = HTTPI::Request.new(url, *args)
31
+ request.headers["Accept"] = "application/json"
32
+ auth_type = settings[:adapter] == :net_http ? :basic : :digest
33
+ request.auth.send(auth_type, username, password)
34
+ request
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,6 @@
1
+ module Arbor
2
+ module Errors
3
+ SerialisationError = Class.new(StandardError)
4
+ UnknownAttributeError = Class.new(StandardError)
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ require 'arbor/utils'
2
+
3
+ module Arbor
4
+ class Filter
5
+ include Arbor::Utils
6
+ attr_accessor :attribute, :operator, :value
7
+ OPERATORS = [:equals, :from, :to, :after, :before, :search, :in]
8
+
9
+ def initialize(attribute, operator, value)
10
+ @attribute = attribute
11
+ @operator = validate(operator, OPERATORS)
12
+ @value = value
13
+ end
14
+
15
+ def to_s
16
+ "filters.#{attribute}.#{operator}=#{value}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,69 @@
1
+ require 'arbor/model/serialiser'
2
+
3
+ module Arbor
4
+ module Model
5
+ class Abstract
6
+ attr_accessor :api_client, :entity_type, :attribute_names, :attribute_lock
7
+
8
+ def initialize(attributes)
9
+ @attribute_names = []
10
+ load_attributes(attributes)
11
+ end
12
+
13
+ def method_missing(meth, *args, &block)
14
+ attribute_lock ? super : begin
15
+ refresh_data
16
+ send(meth, *args, &block)
17
+ end
18
+ end
19
+
20
+ def refresh_data
21
+ raise "No API client configured for this resource" if api_client.nil?
22
+ raise "No entity_type set for this resource" if entity_type.nil?
23
+ raise "No known endpoint for this resource" if href.nil?
24
+
25
+ data = api_client.get(href)
26
+
27
+ parsed_attributes = Serialiser.parse_attributes(data[entity_type.downcase])
28
+ load_attributes(parsed_attributes)
29
+ attach_client(self.api_client)
30
+
31
+ @attribute_lock = true
32
+ end
33
+
34
+ def load_attributes(attributes)
35
+ attributes.each do |name, value|
36
+ unless self.respond_to?("#{name}=")
37
+ self.class.instance_eval { define_method(name) { attribute(name) } }
38
+ self.class.send(:attr_writer, name)
39
+ end
40
+ @attribute_names << name
41
+ self.send("#{name}=", value)
42
+ end
43
+ end
44
+
45
+ def attribute(name)
46
+ if instance_variable_defined?("@#{name}")
47
+ instance_variable_get("@#{name}")
48
+ else
49
+ raise Errors::UnknownAttributeError if attribute_lock
50
+ refresh_data
51
+ attribute(name)
52
+ end
53
+ end
54
+
55
+ def attach_client(client)
56
+ self.api_client = client
57
+ self.attribute_names.each do |name|
58
+ if send(name).respond_to?("api_client=")
59
+ send(name).attach_client(client)
60
+ end
61
+ end
62
+ end
63
+
64
+ def unlock_attributes
65
+ @attribute_lock = false
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,18 @@
1
+ require 'arbor/model/abstract'
2
+
3
+ module Arbor
4
+ module Model
5
+ class Factory
6
+ def self.create(type = :unknown)
7
+ class_name = type.to_s.classify
8
+
9
+ unless Arbor::Model.const_defined?(class_name)
10
+ type_class = Class.new(Arbor::Model::Abstract)
11
+ Arbor::Model.const_set(class_name, type_class)
12
+ end
13
+
14
+ Arbor::Model.const_get(class_name)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Arbor
2
+ module Model
3
+ class NoOpSerialiser
4
+ def self.deserialise(data)
5
+ data
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ require 'arbor/model/factory'
2
+
3
+ module Arbor
4
+ module Model
5
+ class Serialiser
6
+ class << self
7
+ def deserialise(data)
8
+ attributes = parse_attributes(data)
9
+
10
+ resource = data["entityType"].underscore.to_sym
11
+ Factory.create(resource).new(attributes)
12
+ end
13
+
14
+ def parse_attributes(attributes)
15
+ attr_array = attributes.map do |key, value|
16
+ value = case value
17
+ when Hash
18
+ parse_resource(value)
19
+ when Array
20
+ value.map { |nr| parse_resource(nr) }
21
+ else
22
+ value
23
+ end
24
+ [key, value]
25
+ end
26
+
27
+ transform_keys(Hash[attr_array])
28
+ end
29
+
30
+ def parse_resource(r)
31
+ nested_type = r["entityType"]
32
+ nested_type ? Arbor.serialisers[nested_type].deserialise(r) : r
33
+ end
34
+
35
+ def transform_keys(hash)
36
+ Hash[hash.map { |k, v| [k.underscore, v] }]
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ require 'uri'
2
+ require 'arbor/utils'
3
+ require 'arbor/filter'
4
+
5
+ module Arbor
6
+ class Query
7
+ include Arbor::Utils
8
+
9
+ attr_accessor :filters, :resource
10
+
11
+ def initialize(type, filters = [])
12
+ @resource = parse_resource(type)
13
+ @filters = filters
14
+ end
15
+
16
+ def build_query_string
17
+ URI.escape(filters.map(&:to_s).join("&"))
18
+ end
19
+
20
+ def add_filter(*args)
21
+ @filters << Arbor::Filter.new(*args)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ require 'arbor/model/serialiser'
2
+
3
+ module Arbor
4
+ class SerialiserRegistry
5
+ attr_accessor :registry, :default_serialiser
6
+
7
+ def initialize
8
+ @registry = {}
9
+ @default_serialiser = Model::Serialiser
10
+ end
11
+
12
+ def register(resource, serialiser)
13
+ registry[resource] = serialiser
14
+ end
15
+
16
+ def unregister(resource)
17
+ registry[resource] = nil
18
+ end
19
+
20
+ def get_serialiser(resource)
21
+ registry[resource] || default_serialiser
22
+ end
23
+ alias_method :[], :get_serialiser
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ require 'active_support/core_ext/string'
2
+
3
+ module Arbor
4
+ module Utils
5
+ def parse_resource(type)
6
+ validate(get_resource(type), Arbor::RESOURCES)
7
+ end
8
+
9
+ def get_resource(type)
10
+ case type
11
+ when Class
12
+ type.name.pluralize.underscore.to_sym
13
+ else
14
+ type.to_s.pluralize.to_sym
15
+ end
16
+ end
17
+
18
+ def validate(choice, options)
19
+ unless options.include?(choice)
20
+ raise ArgumentError, "#{choice} is not a valid option: #{options}"
21
+ end
22
+ choice
23
+ end
24
+
25
+ def left_pad(array, num)
26
+ num.times { array.unshift(nil) }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ module Arbor
2
+ VERSION = "0.0.2"
3
+ end
data/lib/arbor.rb ADDED
@@ -0,0 +1,149 @@
1
+ require 'arbor/client'
2
+ require 'arbor/query'
3
+ require 'arbor/serialiser_registry'
4
+ require 'active_support/inflector'
5
+ require 'arbor/errors'
6
+
7
+ module Arbor
8
+ class << self
9
+ def serialisers
10
+ @serialisers ||= SerialiserRegistry.new
11
+ end
12
+ end
13
+
14
+ RESOURCES = [:academic_calendar_dates, :academic_holidays, :academic_levels,
15
+ :academic_level_memberships, :academic_level_registration_form_mappings,
16
+ :academic_level_tutors, :academic_programmes, :academic_programme_instances,
17
+ :academic_teaching_hours, :academic_units,
18
+ :academic_unit_automatic_enrolments, :academic_unit_cohorts,
19
+ :academic_unit_cohort_memberships, :academic_unit_curriculums,
20
+ :academic_unit_enrolments, :academic_unit_leads, :academic_unit_tags,
21
+ :academic_working_days, :academic_years, :achievement_levels,
22
+ :achievement_level_sets, :additional_payment_reasons, :alerts, :allowances,
23
+ :allowance_amounts, :applications, :application_settings,
24
+ :application_withdrawal_reasons, :aspects, :aspect_sets, :assessments,
25
+ :assessment_batches, :assessment_batch_targets, :assessment_derivations,
26
+ :assessment_derivation_dependants, :assessment_templates,
27
+ :assessment_template_assessments, :attendance_follow_ups, :attendance_marks,
28
+ :attendance_patterns, :attendance_pattern_periods, :attendance_records,
29
+ :attendance_register_types, :attendance_register_type_marks,
30
+ :awarding_bodies, :awarding_body_staffs, :bank_details, :behaviours,
31
+ :behavioural_contracts, :behavioural_contract_goals,
32
+ :behavioural_contract_parties, :behavioural_contract_periods,
33
+ :behavioural_incidents, :behavioural_incident_actions,
34
+ :behavioural_incident_behaviours, :behavioural_incident_staff_involvements,
35
+ :behavioural_incident_student_involvements, :behavioural_notes,
36
+ :boarding_patterns, :boarding_statuses, :bookable_resource_periods,
37
+ :business_roles, :business_role_assignments,
38
+ :business_role_default_user_roles, :calendars, :calendar_entries,
39
+ :calendar_entry_dates, :calendar_entry_mappings, :calendar_types, :cases,
40
+ :center_numbers, :check_clearance_levels, :check_types,
41
+ :child_protection_statuses, :child_protection_status_assignments,
42
+ :collections, :communication_actions, :communication_tags, :companies,
43
+ :company_staffs, :consents, :consent_types, :contents, :content_tags,
44
+ :countries, :court_orders, :court_order_parties, :cover_arrangements,
45
+ :cover_requirements, :curriculums, :curriculum_evidences, :curriculum_goals,
46
+ :curriculum_grades, :curriculum_judgements, :curriculum_sections,
47
+ :curriculum_stages, :curriculum_tiers, :custom_groups,
48
+ :custom_group_memberships, :dashboards, :dashboard_kpis,
49
+ :dashboard_sections, :data_check_errors, :data_check_error_related_entities,
50
+ :data_export_errors, :data_export_error_tags, :data_item_subscriptions,
51
+ :data_set_subscriptions, :detentions, :detention_sessions,
52
+ :dietary_requirements, :dietary_requirement_types, :document_html_templates,
53
+ :document_image_templates, :document_layouts, :education_plans,
54
+ :education_plan_contributors, :eligibilities, :eligibility_records, :emails,
55
+ :email_accounts, :email_account_access_permissions, :email_addresses,
56
+ :email_drafts, :email_mailboxes, :email_parts, :email_recipients,
57
+ :email_references, :email_senders, :email_statuses, :enrolment_modes,
58
+ :ethnicities, :event_participants, :event_participant_invitations,
59
+ :exceptions, :exclusion_reasons, :faculties, :faculty_members, :files,
60
+ :genders, :grades, :grade_point_scales, :grade_point_scale_level_grade_sets,
61
+ :grade_sets, :guardians, :guardian_consultations,
62
+ :guardian_relationship_types, :hearing_tests, :houses, :house_memberships,
63
+ :house_tutors, :hydrators, :identification_document_types, :identity_cards,
64
+ :identity_card_readers, :immunizations, :immunization_types,
65
+ :impairment_categories, :import_records, :in_care_statuses,
66
+ :in_care_status_assignments, :intake_seasons,
67
+ :intake_season_applicant_buckets, :intake_season_groups, :item_units, :kpis,
68
+ :kpi_ranges, :kpi_targets, :kpi_values, :languages, :language_abilities,
69
+ :layout_object_types, :letters, :letter_drafts, :meals, :meal_patterns,
70
+ :meal_prices, :meal_provisions, :meal_sessions,
71
+ :meal_session_register_records, :meal_sittings,
72
+ :meal_sitting_automatic_attendee_targets, :medical_conditions,
73
+ :medical_condition_medications, :medical_condition_types, :medical_events,
74
+ :medical_event_types, :medical_institutions, :medical_institution_staffs,
75
+ :medical_plans, :medical_relationship_types, :medications, :meetings,
76
+ :meeting_notes, :meeting_topics, :message_draft_recipients, :model_bases,
77
+ :motor_vehicles, :motor_vehicle_makes, :nationality_statuses,
78
+ :next_of_kin_relationships, :notes, :notices, :operations, :pastoral_notes,
79
+ :pay_scales, :pay_scale_grades, :pay_scale_grade_spinal_points,
80
+ :pay_scale_spinal_points, :pay_scale_spinal_point_values,
81
+ :permanent_exclusions, :people, :person_checks, :person_former_names,
82
+ :person_identification_documents, :person_impairments,
83
+ :person_nationalities, :person_next_of_kins,
84
+ :person_professional_qualifications, :person_training_courses,
85
+ :person_transportation_methods, :point_awards, :point_award_categories,
86
+ :point_award_scales, :point_award_totals, :positions,
87
+ :position_business_roles, :postal_addresses, :postal_address_occupancies,
88
+ :professional_qualification_classes, :professional_qualification_subjects,
89
+ :professional_qualification_types, :progress_assessment_batches,
90
+ :progress_assessment_batch_measurement_periods,
91
+ :progress_assessment_batch_targets, :progress_measurement_periods,
92
+ :qualification_aspects, :qualification_assessables,
93
+ :qualification_assessable_instances, :qualification_awards,
94
+ :qualification_award_level_types, :qualification_award_types,
95
+ :qualification_centre_assessed_marks,
96
+ :qualification_element_disallowed_combinations,
97
+ :qualification_element_relationships, :qualification_element_series_links,
98
+ :qualification_grades, :qualification_grade_sets,
99
+ :qualification_incoming_messages, :qualification_learning_units,
100
+ :qualification_predictions, :qualification_registrations,
101
+ :qualification_registration_requests, :qualification_request_batches,
102
+ :qualification_results, :qualification_schemes, :qualification_series,
103
+ :qualification_special_arrangements,
104
+ :qualification_special_arrangement_types, :qualification_timetable_sessions,
105
+ :qualification_timetable_session_types, :qualification_time_windows,
106
+ :qualification_time_window_collections, :registration_forms,
107
+ :registration_form_memberships, :registration_form_tutors, :religions,
108
+ :report_card_batches, :report_card_batch_targets,
109
+ :report_card_batch_template_variables, :report_card_templates,
110
+ :report_card_template_sections, :report_subscriptions, :rooms, :room_assets,
111
+ :room_features, :room_room_assets, :room_room_features, :schools,
112
+ :school_enrolments, :school_events, :school_event_types, :school_staffs,
113
+ :school_trips, :schoolworks, :schoolwork_curriculum_goals,
114
+ :schoolwork_types, :sending_profiles, :sen_events, :sen_event_outcomes,
115
+ :sen_event_outcome_types, :sen_event_types, :sen_needs, :sen_need_types,
116
+ :sen_notes, :sen_provisions, :sen_provision_linked_relationships,
117
+ :sen_provision_types, :sen_statements, :sen_statuses,
118
+ :sen_status_assignments, :sessions, :session_curriculum_goals,
119
+ :session_room_asset_requirements, :session_room_feature_requirements,
120
+ :session_streams, :session_stream_automatic_enrolments,
121
+ :session_stream_enrolments, :session_stream_leads, :sites,
122
+ :site_operating_periods, :site_operating_period_exceptions,
123
+ :site_travel_times, :sms_messages, :sms_message_drafts, :sms_message_parts,
124
+ :sms_message_statuses, :snippets, :snippet_availabilities, :staffs,
125
+ :staff_absences, :staff_absence_categories, :staff_attendance_marks,
126
+ :staff_attendance_records, :staff_contracts, :staff_contract_posts,
127
+ :staff_contract_post_additional_payments, :staff_contract_post_allowances,
128
+ :staff_contract_post_end_reasons, :staff_contract_post_rates,
129
+ :staff_contract_post_salaries, :staff_contract_post_start_reasons,
130
+ :staff_destinations, :staff_employment_types, :staff_origins,
131
+ :staff_room_feature_requirements, :staff_working_periods, :students,
132
+ :student_absence_notes, :student_assessments, :student_assessment_marks,
133
+ :student_attendance_patterns, :student_guardian_relationships,
134
+ :student_linked_relationships, :student_linked_relationship_types,
135
+ :student_medical_relationships, :student_other_school_attendance_records,
136
+ :student_progress_assessments, :student_progress_assessment_marks,
137
+ :student_progress_baselines, :student_progress_goals, :student_report_cards,
138
+ :student_report_card_marks, :student_report_card_sections,
139
+ :student_room_feature_requirements, :student_schools, :student_schoolworks,
140
+ :student_schoolwork_marks, :subjects, :superannuation_schemes,
141
+ :superannuation_scheme_values, :tags, :taggings,
142
+ :teaching_assistant_allocations, :telephone_calls, :telephone_numbers,
143
+ :temporary_exclusions, :terms, :timetable_slots, :timetable_slot_staffs,
144
+ :titles, :training_courses, :training_events, :transportation_methods,
145
+ :triggers, :unenrolment_reasons, :universities, :university_staffs,
146
+ :usage_log_entries, :users, :user_defined_fields, :user_defined_records,
147
+ :user_notifications, :user_roles, :user_role_assignments, :vision_tests,
148
+ :widgets, :widget_types, :workitems, :workitem_assignments]
149
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arbor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Mike Campbell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: httpi
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
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
+ description: Interface for the Arbor Education REST API.
70
+ email:
71
+ - mike.campbell@meritec.co.uk
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - MIT-LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - arbor.gemspec
83
+ - doctor.rb
84
+ - lib/arbor.rb
85
+ - lib/arbor/api.rb
86
+ - lib/arbor/client.rb
87
+ - lib/arbor/errors.rb
88
+ - lib/arbor/filter.rb
89
+ - lib/arbor/model/abstract.rb
90
+ - lib/arbor/model/factory.rb
91
+ - lib/arbor/model/no_op_serialiser.rb
92
+ - lib/arbor/model/serialiser.rb
93
+ - lib/arbor/query.rb
94
+ - lib/arbor/serialiser_registry.rb
95
+ - lib/arbor/utils.rb
96
+ - lib/arbor/version.rb
97
+ homepage: http://github.com/meritec/arbor-rb
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.3.0
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Interface for the Arbor Education REST API.
121
+ test_files: []
122
+ has_rdoc: