openapply 0.2.10 → 0.3.0

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.
@@ -0,0 +1,125 @@
1
+ module Get
2
+
3
+ # @note Get all student details matching the criteria in params
4
+ # @param params[:status] - (String or Array of Strings) - list the status wanted
5
+ # @param params[:since_id] - (Integer) - get all ids matching the criteria LARGER than the given number
6
+ # @param params[:since_date] - (String) - all records updated after the given date (YYYY-MM-DD) or Date and Time (YYYY-MM-DD HH:MM:SS) - 24 hour clock (not sure about timeszone)
7
+ # @param params[:count] - (Integer) - The number of customers to return - large numbers need a large timeout
8
+ # @param options[:get_payments] (Boolean) - get student payments
9
+ def many_students_details( params, options={} )
10
+ ids = many_students_ids( params )
11
+ return {error: "need an array of ids"} unless ids[:ids]
12
+ return many_students_details_by_ids( ids[:ids], options )
13
+ end
14
+
15
+ # @note Get all student details matching the criteria in params
16
+ # @param ids - (Array of Integers) - list ids wanted to lookup
17
+ # @param options[:get_payments] (Boolean) - get student payments
18
+ def many_students_details_by_ids( ids, options={} )
19
+ return {error: 'no ids provided'} if ids.nil? or ids.empty?
20
+ students = []
21
+ guardians = []
22
+ ids = [ids] unless ids.is_a? Array
23
+ ids.each do |id|
24
+ response = one_student_details_by_id( id, options )
25
+ # pp response
26
+ students << response[:student]
27
+ guardians << response[:guardians]
28
+ end
29
+ return {
30
+ students: students,
31
+ guardians: guardians,
32
+ }
33
+ end
34
+
35
+ # @note Get all student ids matching the criteria in params
36
+ # @param params[:status] - (String or Array of Strings) - list the status wanted
37
+ # @param params[:since_id] - (Integer) - get all ids matching the criteria LARGER than the given number
38
+ # @param params[:since_date] - (String) - all records updated after the given date (YYYY-MM-DD) or Date and Time (YYYY-MM-DD HH:MM:SS) - 24 hour clock (not sure about timeszone)
39
+ # @param params[:count] - (Integer) - The number of customers to return - large numbers need a large timeout
40
+ def many_students_ids( params )
41
+ response = many_students_summaries( params )
42
+ ids = response[:students].map{ |kid| kid[:id] }
43
+ { ids: ids }
44
+ end
45
+
46
+ # @note Get all student ids & guardian ids with associated last updated timestamp (matching the criteria in params)
47
+ # @param params[:status] - (String or Array of Strings) - list the status wanted
48
+ # @param params[:since_id] - (Integer) - get all ids matching the criteria LARGER than the given number
49
+ # @param params[:since_date] - (String) - all records updated after the given date (YYYY-MM-DD) or Date and Time (YYYY-MM-DD HH:MM:SS) - 24 hour clock (not sure about timeszone)
50
+ # @param params[:count] - (Integer) - The number of customers to return - large numbers need a large timeout
51
+ def many_ids_updated_time( params )
52
+ response = many_students_summaries( params )
53
+ kids = response[:students].map{ |kid| {kid[:id] => kid[:updated_at]} }
54
+ rents = response[:guardians].map{ |rent| {rent[:id] => rent[:updated_at]} }
55
+ { ids_updated_at:
56
+ {
57
+ students: kids,
58
+ guardians: rents,
59
+ }
60
+ }
61
+ end
62
+
63
+ # @note Get all student summaries matching the criteria in params
64
+ # @param params[:status] - (String or Array of Strings) - list the status wanted
65
+ # @param params[:since_id] - (Integer) - get all ids matching the criteria LARGER than the given number
66
+ # @param params[:since_date] - (String) - all records updated after the given date (YYYY-MM-DD) or Date and Time (YYYY-MM-DD HH:MM:SS) - 24 hour clock (not sure about timeszone)
67
+ # @param params[:count] - (Integer) - The number of customers to return - large numbers need a large timeout
68
+ def many_students_summaries( params={} )
69
+ # status=nil,since_id=nil,since_date=nil,count=api_records)
70
+ return {error: 'no query provided'} if params.empty?
71
+
72
+ students = []
73
+ guardians = []
74
+
75
+ count = params[:count]
76
+ count ||= api_records()
77
+ since_date = params[:since_date]
78
+ statuses = params[:status]
79
+ statuses = [statuses] if not statuses.nil? and
80
+ statuses.is_a? String
81
+ statuses.each do |status|
82
+
83
+ # these values need to be reset for each status loop
84
+ page_number = nil
85
+ since_id = params[:since_id]
86
+
87
+ # loop until all pages recieved
88
+ while page_number.nil? or page_number > 1
89
+ url = url_for_many_students_summaries(status, since_id, since_date, count)
90
+ answer = oa_answer( url )
91
+ break if answer.nil? or answer[:students].empty?
92
+
93
+ students += answer[:students]
94
+ guardians += answer[:linked][:parents]
95
+
96
+ last_student = answer[:students].last
97
+ since_id = last_student[:id]
98
+ # since_id = (answer[:students].last)[:id]
99
+ page_number = answer[:meta][:pages]
100
+ end
101
+ end
102
+ return {
103
+ students: students,
104
+ guardians: guardians,
105
+ }
106
+ end
107
+
108
+ # @note Get url to query for student summaries matching the criteria in params
109
+ # @param status - (String or Array of Strings) - list the status wanted
110
+ # @param since_id - (Integer) - get all ids matching the criteria LARGER than the given number
111
+ # @param since_date - (String) - all records updated after the given date (YYYY-MM-DD) or Date and Time (YYYY-MM-DD HH:MM:SS) - 24 hour clock (not sure about timeszone)
112
+ # @param count - (Integer) - The number of customers to return - large numbers need a large timeout
113
+ def url_for_many_students_summaries(status=nil, since_id=nil,
114
+ since_date=nil, count=api_records)
115
+ url_options = []
116
+ url_options << "status=#{status}" unless status.to_s.eql? ""
117
+ url_options << "since_id=#{since_id}" unless since_id.to_s.eql? ""
118
+ url_options << "since_date=#{since_date}" unless since_date.to_s.eql? ""
119
+ url_options << "count=#{count}"
120
+ url_options << "auth_token=#{api_key}"
121
+
122
+ return "#{api_path}?#{url_options.join('&')}"
123
+ end
124
+
125
+ end
@@ -0,0 +1,65 @@
1
+ # SINGLE STUDENT API GET CALLS
2
+ ##############################
3
+
4
+ module Get
5
+
6
+ # @note Get all student details matching the associated id
7
+ # @param ids - (Integer) - ids of student to lookup
8
+ # @param options[:get_payments] (Boolean) - get student payments (or not)
9
+ def one_student_details_by_id( id, options={} )
10
+
11
+ get_payments = options[:get_payments] unless options.nil? or options.empty?
12
+ get_payments ||= true if get_payments.nil?
13
+
14
+ # get full student record and guardian information
15
+ student_info = one_student_record_by_id( "#{id}" )
16
+
17
+ # be sure there is student data to process -- if not return an empty record
18
+ return {student: {id: id, empty: []}} if student_info.nil? or
19
+ student_info[:student].nil?
20
+ student_info[:student].empty?
21
+ student = []
22
+ # extract the student info
23
+ student = student_info[:student] unless student_info[:student].nil?
24
+
25
+ guardians = []
26
+ # extract guardian information
27
+ guardians = student_info[:linked][:parents].dup unless
28
+ student_info[:linked].nil? or
29
+ student_info[:linked].empty? or
30
+ student_info[:linked][:parents].nil?
31
+ payments = []
32
+ # get student payment records
33
+ payment_info = one_student_payments_by_id("#{id}") if get_payments.eql? true
34
+ # extract payment information
35
+ payments = payment_info[:payments].dup unless payment_info.nil? or
36
+ payment_info[:payments].nil?
37
+ # organize the student details
38
+ return {
39
+ student:
40
+ { id: id,
41
+ record: student,
42
+ payments: payments,
43
+ guardians: guardians,
44
+ },
45
+ guardians: guardians,
46
+ }
47
+ end
48
+
49
+ # @note Get one student's primary record matching the associated id
50
+ # @param ids - (Integer) - ids of student to lookup
51
+ # @param options - http options
52
+ def one_student_record_by_id(id, options ={})
53
+ url = "#{api_path}#{id}?auth_token=#{api_key}"
54
+ return oa_answer( url, options )
55
+ end
56
+
57
+ # @note Get one student's details matching the associated id
58
+ # @param ids - (Integer) - ids of student to lookup
59
+ # @param options - http options
60
+ def one_student_payments_by_id(id, options={})
61
+ url = "#{api_path}#{id}/payments?auth_token=#{api_key}"
62
+ return oa_answer( url, options )
63
+ end
64
+
65
+ end
@@ -1,3 +1,3 @@
1
1
  module Openapply
2
- VERSION = "0.2.10"
2
+ VERSION = "0.3.0"
3
3
  end
data/openapply.gemspec CHANGED
@@ -7,22 +7,16 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "openapply"
8
8
  spec.version = Openapply::VERSION
9
9
  spec.authors = ["Bill Tihen"]
10
- spec.email = ["btihen@gmail.com"]
10
+ spec.email = ["btihen@las.ch"]
11
11
 
12
12
  spec.summary = %q{Access OpenApply's API with Ruby}
13
- # spec.description = %q{TODO: Write a longer description or delete this line.}
14
- spec.homepage = "https://github.com/btihen/openapply"
13
+ spec.description = %q{Access to OpenApply's API and extra utilities that
14
+ accomplish common needs -- such as recursively query
15
+ for all students of a given status or change-date
16
+ until all needed records are recieved.}
17
+ spec.homepage = "https://github.com/las-it/openapply"
15
18
  spec.license = "MIT"
16
19
 
17
- # # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- # if spec.respond_to?(:metadata)
20
- # spec.metadata["allowed_push_host"] = "http://rubygems.org"
21
- # else
22
- # raise "RubyGems 2.0 or newer is required to protect against " \
23
- # "public gem pushes."
24
- # end
25
-
26
20
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
21
  f.match(%r{^(test|spec|features)/})
28
22
  end
@@ -34,37 +28,13 @@ Gem::Specification.new do |spec|
34
28
  spec.add_dependency "json" , "~> 2.1"
35
29
  spec.add_dependency "net-ssh", "~> 4.2"
36
30
  spec.add_dependency "net-scp", "~> 1.2"
37
-
38
- # # need this version of axlsx to match roo's rubyzip needs
39
- # # axlsx 2.1.0.pre uses rubyzip 1.1.7 - which has a security flaw
40
- # # using the newest version of rubyzip 1.2.1 or larger
41
- # # https://github.com/randym/axlsx/issues/501
42
- # gem 'axlsx', git: 'https://github.com/randym/axlsx',
43
- # branch: 'master'
44
- # https://github.com/straydogstudio/axlsx_rails/issues/77
45
- # gem 'axlsx', git: 'https://github.com/randym/axlsx.git',
46
- # ref: '776037c0fc799bb09da8c9ea47980bd3bf296874'
47
- # spec.add_dependency 'axlsx', git: 'https://github.com/randym/axlsx', branch: 'master'
48
- # spec.add_dependency 'axlsx', "2.1.0.pre", git: 'https://github.com/randym/axlsx', branch: 'master'
49
- # # https://github.com/randym/axlsx/issues/234
50
- # # spec.add_dependency 'zip-zip'
51
31
  #
52
- # # # Rubyzip before 1.2.1 has a directory traversal vulnerability: CVE-2017-5946
53
- # spec.add_dependency 'rubyzip', '1.2.1'
54
- # spec.add_dependency 'rubyzip', '>= 1.2.1'
55
- # don't use official release - use above
56
- # spec.add_dependency "axlsx", "2.1.0.pre"
57
- # spec.add_dependency "rubyzip", "~> 1.2"
58
- # spec.add_runtime_dependency "axlsx", "2.1.0.pre"
59
- # spec.add_runtime_dependency "rubyzip", "~> 1.2"
60
-
61
- spec.add_development_dependency "simplecov", "~> 0.15"
62
- spec.add_development_dependency "webmock" , "~> 3.2"
32
+ # spec.add_development_dependency "simplecov", "~> 0.15"
33
+ spec.add_development_dependency 'codacy-coverage', '~> 1.1'
34
+ spec.add_development_dependency "webmock", "~> 3.2"
63
35
  spec.add_development_dependency "bundler", "~> 1.15"
64
- # spec.add_development_dependency "rake", "~> 10.0"
65
36
  spec.add_development_dependency "rake", "~> 12.3"
66
37
  spec.add_development_dependency "rspec", "~> 3.7"
67
38
  spec.add_development_dependency "pry", "~> 0.11"
68
- # spec.add_development_dependency "roo", "~> 2.7"
69
39
 
70
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openapply
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bill Tihen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-04 00:00:00.000000000 Z
11
+ date: 2018-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.2'
69
69
  - !ruby/object:Gem::Dependency
70
- name: simplecov
70
+ name: codacy-coverage
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.15'
75
+ version: '1.1'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.15'
82
+ version: '1.1'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: webmock
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -150,9 +150,13 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.11'
153
- description:
153
+ description: |-
154
+ Access to OpenApply's API and extra utilities that
155
+ accomplish common needs -- such as recursively query
156
+ for all students of a given status or change-date
157
+ until all needed records are recieved.
154
158
  email:
155
- - btihen@gmail.com
159
+ - btihen@las.ch
156
160
  executables: []
157
161
  extensions: []
158
162
  extra_rdoc_files: []
@@ -161,30 +165,25 @@ files:
161
165
  - ".gitignore"
162
166
  - ".rspec"
163
167
  - ".travis.yml"
168
+ - ".travis.yml.bak"
169
+ - CHANGE_LOG.md
164
170
  - CODE_OF_CONDUCT.md
165
171
  - Gemfile
166
172
  - Gemfile.lock
167
173
  - LICENSE.txt
174
+ - MM
168
175
  - README.md
169
176
  - Rakefile
170
177
  - bin/console
171
178
  - bin/setup
172
- - examples/demo/Gemfile
173
- - examples/demo/Gemfile.lock
174
- - examples/demo/README.md
175
- - examples/demo/demo_site.rb
176
179
  - lib/openapply.rb
177
180
  - lib/openapply/client.rb
178
- - lib/openapply/convert_to_array.rb
179
- - lib/openapply/convert_to_csv.rb
180
- - lib/openapply/convert_to_xlsx.rb
181
- - lib/openapply/get_student.rb
182
- - lib/openapply/get_students.rb
181
+ - lib/openapply/get_many_students.rb
182
+ - lib/openapply/get_one_student.rb
183
183
  - lib/openapply/put.rb
184
- - lib/openapply/send_to_remote.rb
185
184
  - lib/openapply/version.rb
186
185
  - openapply.gemspec
187
- homepage: https://github.com/btihen/openapply
186
+ homepage: https://github.com/las-it/openapply
188
187
  licenses:
189
188
  - MIT
190
189
  metadata: {}
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
- source "https://rubygems.org"
3
-
4
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
-
6
- gem "openapply", "~> 0.2"
@@ -1,24 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- httparty (0.15.6)
5
- multi_xml (>= 0.5.2)
6
- json (2.1.0)
7
- multi_xml (0.6.0)
8
- net-scp (1.2.1)
9
- net-ssh (>= 2.6.5)
10
- net-ssh (4.2.0)
11
- openapply (0.2.4)
12
- httparty (~> 0.15)
13
- json (~> 2.1)
14
- net-scp (~> 1.2)
15
- net-ssh (~> 4.2)
16
-
17
- PLATFORMS
18
- ruby
19
-
20
- DEPENDENCIES
21
- openapply (~> 0.2)
22
-
23
- BUNDLED WITH
24
- 1.16.0
@@ -1,123 +0,0 @@
1
- ## Usage
2
-
3
- In the terminal:
4
-
5
- ```bash
6
- gem install openapply
7
- # or better still
8
- bundle install
9
-
10
- irb
11
- # or better still
12
- pry
13
- ```
14
- Once in the REPL - follow the below instructions
15
-
16
- ### Standard Usage - multiple classes accomodates multiple OpenApply Sites
17
- ```ruby
18
-
19
- require 'pp'
20
- require 'date'
21
- require_relative './demo_site'
22
-
23
- # use a class override in order to interact with multiple oa sites
24
- # or extend functionality
25
- @my = MySite.new()
26
-
27
-
28
- # get students with applied and enrolled status, flatten no fields,
29
- # remove the parent_guardian (duplicate) info,
30
- # move into the xlsx file the following data: studnet id and student name
31
- # parent address (line 1) and country, and no payment info
32
- @my.records_as_csv_to_file('applied', nil, [:parent_guardian],
33
- [:id, :name],
34
- {keys: [:address, :country]}, nil , "test-#{Date.today}.csv" )
35
-
36
- @my.records_as_csv_to_server( 'applied', nil, [:parent_guardian],
37
- [:id, :name],
38
- {keys: [:address, :country]}, nil )
39
-
40
- # DISABLED UNTIL AXLSX works with RubyZip 1.2.1
41
- # # get students with applied and enrolled status, flatten the custom_fields,
42
- # # remove the parent_guardian (duplicate) info,
43
- # # move into the xlsx file the following data: studnet id and student name
44
- # # parent address (line 1) and country, and the oldest three payment amounts & dates
45
- # @my.records_as_xlsx_to_file( ['applied','enrolled'], [:custom_fields],
46
- # [:parent_guardian], [:id, :name],
47
- # {count: 2, keys: [:address, :country]},
48
- # {count: 3, order: :oldest, keys: [:amount, :date]}, "test-#{Date.today}.xlsx")
49
- #
50
- # @my.records_as_xlsx_to_server(['applied','enrolled'], [:custom_fields],
51
- # [:parent_guardian], [:id, :name],
52
- # {count: 2, keys: [:address, :country]},
53
- # {count: 3, order: :newest, keys: [:amount, :date]})
54
-
55
- # use cron or other similar tools to automate these processes
56
- ```
57
-
58
-
59
- ### Basic Usage using the gem directly - can only access one site
60
- ```ruby
61
- require 'openapply'
62
-
63
- # BASIC USAGE (see readme)
64
- # use the .rbenv-vars for a simple setup
65
- @oa = Openapply::Client.new()
66
-
67
- # see settings
68
- @oa.api_url
69
- @oa.api_key
70
- @oa.base_path
71
- @oa.api_timeout
72
- @oa.api_reply_count
73
-
74
-
75
- # student summarys with applied status
76
- summaries = @oa.students_by_status('applied')
77
- student_ids = @oa.student_ids_by_status('applied')
78
-
79
- ids = student_ids[:student_ids]
80
-
81
-
82
- # first student details - return data as is
83
- details = @oa.student_details_by_id(ids.first)
84
-
85
- # last applied student details - custom fields -
86
- # top level & duplicate :parent removed
87
- flattened = @oa.student_details_by_id(ids.last, [:custom_fields], [:parent_guardian])
88
-
89
- # get first 5 records with status applied with student_ids greater than the last
90
- # two records (which should return last six students) - but response is limited to 5
91
- # updated after 5th of Nov 2016
92
- custom = @oa.students_query('applied', ids[-7] , '2016-11-05', 5)
93
-
94
-
95
- # get students with applied and enrolled status, flatten no fields,
96
- # remove the parent_guardian (duplicate) info,
97
- # move into the xlsx file the following data: studnet id and student name
98
- # parent address (line 1) and country, and no payment info
99
- csv = @oa.students_as_csv_by_status( 'applied', nil, [:parent_guardian],
100
- [:id, :name], {keys: [:address, :country]}, nil )
101
- #
102
- @oa.send_data_to_remote_server( csv, ENV['REMOTE_HOSTNAME'],
103
- ENV['REMOTE_USERNAME'], "#{ENV['REMOTE_PATH_FILE']}.csv", ENV['REMOTE_PERMISSIONS'])
104
- # save csv string as a file locally
105
- open('test_file.csv', 'w') { |f| f.puts csv }
106
-
107
- # DISABLED UNTIL AXLSX works with RubyZip 1.2.1
108
- #
109
- # # get students with applied and enrolled status, flatten the custom_fields,
110
- # # remove the parent_guardian (duplicate) info,
111
- # # move into the xlsx file the following data: studnet id and student name
112
- # # parent address (line 1) and country, and the oldest three payment amounts & dates
113
- # xlsx = @oa.students_as_xlsx_by_status(['applied','accepted'], [:custom_fields],
114
- # [:parent_guardian], [:id, :name],
115
- # {count: 2, keys: [:address, :country]},
116
- # {count: , order: :oldest, keys: [:amount, :date]})
117
- # #
118
- # @oa.send_data_to_remote_server( xlsx, ENV['REMOTE_HOSTNAME'],
119
- # ENV['REMOTE_USERNAME'], "#{ENV['REMOTE_PATH_FILE']}.xlsx", ENV['REMOTE_PERMISSIONS'])
120
- # # save as a xlsx file locally
121
- # xlsx.serialize('test_file.xlsx')
122
-
123
- ```