openapply 0.2.6 → 0.2.7
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 +4 -4
- data/Gemfile +7 -0
- data/Gemfile.lock +25 -1
- data/README.md +10 -11
- data/lib/openapply/convert.rb +69 -75
- data/lib/openapply/version.rb +1 -1
- data/openapply.gemspec +13 -1
- metadata +44 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b0c0c8d58f1cd650e0ce2d45e87fb8f66a5e25cc8796214838a9b2bda42b52d
|
4
|
+
data.tar.gz: d7405bd5b47e826348cbfd2d39d8f16cd0f5fb2ca7b7c9186ffb4a4c7231e2d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 344ce55394f520ed227b31d3e0e78d747b7b3a1001f605502df853951e4cec6f9d70fc9b945c76dca45aa3dc3588fb449676e3d874a93dad27ad70d7789bac14
|
7
|
+
data.tar.gz: a500846657c599050a2b6f72e8581e794c85822bc207a2f87c652ce6b6f4d256645dd049e3bbc23d8f90b3865ce6909314a7aa5d15c5510362984c1f4438ea9d
|
data/Gemfile
CHANGED
@@ -2,5 +2,12 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
|
+
# # https://github.com/straydogstudio/axlsx_rails/issues/77
|
6
|
+
# gem 'axlsx', git: 'https://github.com/randym/axlsx.git',
|
7
|
+
# ref: '776037c0fc799bb09da8c9ea47980bd3bf296874'
|
8
|
+
|
9
|
+
# https://github.com/randym/axlsx/issues/501
|
10
|
+
gem 'axlsx', git: 'https://github.com/randym/axlsx', branch: 'master'
|
11
|
+
|
5
12
|
# Specify your gem's dependencies in openapply.gemspec
|
6
13
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,24 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/randym/axlsx
|
3
|
+
revision: c8ac844572b25fda358cc01d2104720c4c42f450
|
4
|
+
branch: master
|
5
|
+
specs:
|
6
|
+
axlsx (2.1.0.pre)
|
7
|
+
htmlentities (~> 4.3.4)
|
8
|
+
mimemagic (~> 0.3)
|
9
|
+
nokogiri (>= 1.6.6)
|
10
|
+
rubyzip (>= 1.2.1)
|
11
|
+
|
1
12
|
PATH
|
2
13
|
remote: .
|
3
14
|
specs:
|
4
|
-
openapply (0.2.
|
15
|
+
openapply (0.2.7)
|
16
|
+
axlsx
|
5
17
|
httparty (~> 0.15)
|
6
18
|
json (~> 2.1)
|
7
19
|
net-scp (~> 1.2)
|
8
20
|
net-ssh (~> 4.2)
|
21
|
+
rubyzip (>= 1.2.1)
|
9
22
|
|
10
23
|
GEM
|
11
24
|
remote: https://rubygems.org/
|
@@ -18,19 +31,27 @@ GEM
|
|
18
31
|
diff-lcs (1.3)
|
19
32
|
docile (1.1.5)
|
20
33
|
hashdiff (0.3.7)
|
34
|
+
htmlentities (4.3.4)
|
21
35
|
httparty (0.15.6)
|
22
36
|
multi_xml (>= 0.5.2)
|
23
37
|
json (2.1.0)
|
24
38
|
method_source (0.9.0)
|
39
|
+
mimemagic (0.3.2)
|
40
|
+
mini_portile2 (2.3.0)
|
25
41
|
multi_xml (0.6.0)
|
26
42
|
net-scp (1.2.1)
|
27
43
|
net-ssh (>= 2.6.5)
|
28
44
|
net-ssh (4.2.0)
|
45
|
+
nokogiri (1.8.1)
|
46
|
+
mini_portile2 (~> 2.3.0)
|
29
47
|
pry (0.11.3)
|
30
48
|
coderay (~> 1.1.0)
|
31
49
|
method_source (~> 0.9.0)
|
32
50
|
public_suffix (3.0.1)
|
33
51
|
rake (10.5.0)
|
52
|
+
roo (2.7.1)
|
53
|
+
nokogiri (~> 1)
|
54
|
+
rubyzip (~> 1.1, < 2.0.0)
|
34
55
|
rspec (3.7.0)
|
35
56
|
rspec-core (~> 3.7.0)
|
36
57
|
rspec-expectations (~> 3.7.0)
|
@@ -44,6 +65,7 @@ GEM
|
|
44
65
|
diff-lcs (>= 1.2.0, < 2.0)
|
45
66
|
rspec-support (~> 3.7.0)
|
46
67
|
rspec-support (3.7.0)
|
68
|
+
rubyzip (1.2.1)
|
47
69
|
safe_yaml (1.0.4)
|
48
70
|
simplecov (0.15.1)
|
49
71
|
docile (~> 1.1.0)
|
@@ -59,10 +81,12 @@ PLATFORMS
|
|
59
81
|
ruby
|
60
82
|
|
61
83
|
DEPENDENCIES
|
84
|
+
axlsx!
|
62
85
|
bundler (~> 1.15)
|
63
86
|
openapply!
|
64
87
|
pry (~> 0.11)
|
65
88
|
rake (~> 10.0)
|
89
|
+
roo (~> 2.7)
|
66
90
|
rspec (~> 3.7)
|
67
91
|
simplecov (~> 0.15)
|
68
92
|
webmock (~> 3.1)
|
data/README.md
CHANGED
@@ -6,7 +6,6 @@ This gem allows ruby access to the OpenApply API v1 - and supports the GET featu
|
|
6
6
|
### Still TODO
|
7
7
|
|
8
8
|
* **add google sheets to convert**
|
9
|
-
* **update axlsx with rubyzip 1.2.1**
|
10
9
|
* make tests for scp / ssh (at least data type conversions)
|
11
10
|
* allow csv and xlsx reports with default summary info only?
|
12
11
|
* write PUTS methods - *currently api only allows status update*
|
@@ -17,11 +16,14 @@ This gem allows ruby access to the OpenApply API v1 - and supports the GET featu
|
|
17
16
|
|
18
17
|
### CHANGE LOG
|
19
18
|
|
20
|
-
* **v0.2.
|
19
|
+
* **v0.2.8** - compatible with 0.2.x - 2017-12-?? *(https://github.com/straydogstudio/axlsx_rails/issues/77)*
|
21
20
|
- allow flattening to work with arrays
|
22
21
|
- allow flattening and reject to work at 2 levels of depth
|
23
22
|
- allow flattening and reject to work at any depth (with recursion?)
|
24
23
|
|
24
|
+
* **v0.2.7** - compatible with 0.2.x - 2017-12-10
|
25
|
+
- safely re-enabled axlsx by using the master branch and upgradeing rubyzip
|
26
|
+
|
25
27
|
* **v0.2.6** - compatible with 0.2.x - 2017-12-08
|
26
28
|
- allow ssh/scp options to be passed
|
27
29
|
|
@@ -176,13 +178,12 @@ csv_string=@oa.students_as_csv_by_statuses(['applied','enrolled'],[:custom_field
|
|
176
178
|
@oa.send_data_to_remote_server(csv_string, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
|
177
179
|
|
178
180
|
# Create XLSX file
|
179
|
-
|
180
|
-
# @oa.students_as_xlsx_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
|
181
|
+
@oa.students_as_xlsx_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
|
181
182
|
# # multiple status into
|
182
|
-
|
183
|
+
xlsx_obj=@oa.students_as_xlsx_by_statuses(['applied','enrolled'],[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
|
183
184
|
# #
|
184
185
|
# # send XLSX to a remote server as a file - using ssh-keys
|
185
|
-
|
186
|
+
@oa.send_data_to_remote_server(xlsx_obj, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.xlsx', '0750')
|
186
187
|
```
|
187
188
|
|
188
189
|
#### INDIVIDUAL STUDENT QUERIES
|
@@ -259,15 +260,13 @@ csv=@oa.students_as_csv_by_status('applied',[:custom_fields], [:parent_guardian]
|
|
259
260
|
@oa.send_data_to_remote_server(csv, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
|
260
261
|
#
|
261
262
|
# # Create a XLSX package
|
262
|
-
|
263
|
-
#
|
264
|
-
# @oa.students_as_xlsx_by_status('applied', nil, nil, [:id, :name], nil, {count: 2, order: :newest, keys: [:date, :amount]} )
|
263
|
+
@oa.students_as_xlsx_by_status('applied', nil, nil, [:id, :name], nil, {count: 2, order: :newest, keys: [:date, :amount]} )
|
265
264
|
# # all options
|
266
|
-
|
265
|
+
xlsx_obj=@oa.students_as_xlsx_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
|
267
266
|
# #
|
268
267
|
# # send CSV to a remote server as a file - using ssh-keys
|
269
268
|
# # attributes: csv_string, srv_hostname, srv_username, srv_path_file, file_permissions(0750 - default if not specified)
|
270
|
-
|
269
|
+
@oa.send_data_to_remote_server(xlsx_obj, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
|
271
270
|
```
|
272
271
|
|
273
272
|
#### CUSTOM GROUP QUERIES - summary data
|
data/lib/openapply/convert.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'csv'
|
2
|
-
|
2
|
+
require 'axlsx'
|
3
3
|
require 'net/scp'
|
4
4
|
require 'net/ssh'
|
5
5
|
|
@@ -99,66 +99,66 @@ module Convert
|
|
99
99
|
end
|
100
100
|
|
101
101
|
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# #
|
110
|
-
# # ==== Attributes
|
111
|
-
# # * +status+ - hash to convert to an array
|
112
|
-
# # * +flatten_keys+ - an array of keys to bring to the top level
|
113
|
-
# # (with this key prepened) -- default (blank does nothing)
|
114
|
-
# # * +reject_keys+ - an array of keys to remove from the data -- default (blank does nothing)
|
115
|
-
# # * +student_keys+ - [:id, :name] - include student record keys
|
116
|
-
# # * +guardian_info+ - include guardian record info {count: 2, keys: [:id, :name]}
|
117
|
-
# # * +payment_info+ - include payment info {count: 2, order: :newest, keys: [:date, :amount]}
|
118
|
-
# # * guardian & payment info options:
|
119
|
-
# # count: 2 -- how many parent or payment records to return)
|
120
|
-
# # keys: [:id, :date] -- an array of keys of data to return
|
121
|
-
# # order: :newest -- the order to return payments :newest (most recent first - default) or :oldest
|
122
|
-
# def students_as_xlsx_by_status( status,
|
123
|
-
# flatten_keys=[], reject_keys=[],
|
124
|
-
# student_keys=[],
|
125
|
-
# guardian_info={}, payment_info={})
|
126
|
-
# #
|
127
|
-
# check = check_details_keys_validity(flatten_keys, reject_keys)
|
128
|
-
# return check unless check.nil? # or check[:error].nil?
|
129
|
-
# # check = check_header_keys_validity(student_keys, guardian_info, payment_info)
|
130
|
-
# # return check unless check.nil?
|
131
|
-
# #
|
132
|
-
# students_array = students_as_array_by_status( status,
|
133
|
-
# flatten_keys, reject_keys,
|
134
|
-
# student_keys, guardian_info, payment_info )
|
135
|
-
# #
|
136
|
-
# return students_array if students_array.is_a? Hash
|
137
|
-
# #
|
138
|
-
# students_xlsx = students_array_to_xlsx( students_array )
|
139
|
-
#
|
140
|
-
# # example how to save the xlsx object as a file
|
141
|
-
# # students_xlsx.serialize("spec/data/xlsx/students_from_oa.xlsx")
|
142
|
-
#
|
143
|
-
# return students_xlsx
|
144
|
-
# end
|
145
|
-
# alias_method :students_as_xlsx_by_statuses, :students_as_xlsx_by_status
|
102
|
+
# XLSX CODE
|
103
|
+
###########
|
104
|
+
|
105
|
+
|
106
|
+
# Queries by status to get a list of students details of a given status
|
107
|
+
# and converts the result to a XLSX Object (Axlsx::Package) with headers
|
108
|
+
# (based on keys sent)
|
146
109
|
#
|
110
|
+
# ==== Attributes
|
111
|
+
# * +status+ - hash to convert to an array
|
112
|
+
# * +flatten_keys+ - an array of keys to bring to the top level
|
113
|
+
# (with this key prepened) -- default (blank does nothing)
|
114
|
+
# * +reject_keys+ - an array of keys to remove from the data -- default (blank does nothing)
|
115
|
+
# * +student_keys+ - [:id, :name] - include student record keys
|
116
|
+
# * +guardian_info+ - include guardian record info {count: 2, keys: [:id, :name]}
|
117
|
+
# * +payment_info+ - include payment info {count: 2, order: :newest, keys: [:date, :amount]}
|
118
|
+
# * guardian & payment info options:
|
119
|
+
# count: 2 -- how many parent or payment records to return)
|
120
|
+
# keys: [:id, :date] -- an array of keys of data to return
|
121
|
+
# order: :newest -- the order to return payments :newest (most recent first - default) or :oldest
|
122
|
+
def students_as_xlsx_by_status( status,
|
123
|
+
flatten_keys=[], reject_keys=[],
|
124
|
+
student_keys=[],
|
125
|
+
guardian_info={}, payment_info={})
|
126
|
+
#
|
127
|
+
check = check_details_keys_validity(flatten_keys, reject_keys)
|
128
|
+
return check unless check.nil? # or check[:error].nil?
|
129
|
+
# check = check_header_keys_validity(student_keys, guardian_info, payment_info)
|
130
|
+
# return check unless check.nil?
|
131
|
+
#
|
132
|
+
students_array = students_as_array_by_status( status,
|
133
|
+
flatten_keys, reject_keys,
|
134
|
+
student_keys, guardian_info, payment_info )
|
135
|
+
#
|
136
|
+
return students_array if students_array.is_a? Hash
|
137
|
+
#
|
138
|
+
students_xlsx = students_array_to_xlsx( students_array )
|
139
|
+
|
140
|
+
# example how to save the xlsx object as a file
|
141
|
+
# students_xlsx.serialize("spec/data/xlsx/students_from_oa.xlsx")
|
142
|
+
|
143
|
+
return students_xlsx
|
144
|
+
end
|
145
|
+
alias_method :students_as_xlsx_by_statuses, :students_as_xlsx_by_status
|
146
|
+
|
147
|
+
|
148
|
+
# Given an array convert to XLSX Object (Axlsx::Package)
|
147
149
|
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
# return xlsx_obj
|
161
|
-
# end
|
150
|
+
# ==== Attributes
|
151
|
+
# +array+ - expects a hash of students_details (should be flattened to use custom fields)
|
152
|
+
def students_array_to_xlsx(student_array)
|
153
|
+
xlsx_obj = Axlsx::Package.new do |p|
|
154
|
+
p.workbook.add_worksheet(:name => "Students from OpenApply") do |sheet|
|
155
|
+
student_array.each{ |r| sheet.add_row r }
|
156
|
+
end
|
157
|
+
# to save the xlsx object as a file
|
158
|
+
# p.serialize("spec/data/xlsx/students_from_oa.xlsx")
|
159
|
+
end
|
160
|
+
return xlsx_obj
|
161
|
+
end
|
162
162
|
|
163
163
|
|
164
164
|
# ARRAY CODE
|
@@ -301,24 +301,16 @@ module Convert
|
|
301
301
|
srv_path_file, srv_file_permissions="0750",
|
302
302
|
ssl_options={}
|
303
303
|
)
|
304
|
+
# be sure its a file type that can be sent
|
305
|
+
return "Unrecognized Object" unless known_transfer_object?(data)
|
306
|
+
|
307
|
+
# Prep data as necessary for scp
|
304
308
|
# https://www.safaribooksonline.com/library/view/ruby-cookbook/0596523696/ch06s15.html
|
305
309
|
# convert the string to a stringio object (which can act as a file)
|
306
|
-
|
307
|
-
# just move the file via SCP
|
308
|
-
xfer = data if data.is_a? File
|
309
|
-
# convert string into a SteamIO - "FILE" like object
|
310
|
+
xfer = data.to_stream() if data.is_a? Axlsx::Package
|
310
311
|
xfer = data if data.is_a? StringIO
|
311
|
-
# convert string into a SteamIO - "FILE" like object
|
312
312
|
xfer = StringIO.new( data ) if data.is_a? String
|
313
|
-
|
314
|
-
# # convert Axlsx object into a SteamIO - "FILE" like object
|
315
|
-
# xfer = data.to_stream() if data.is_a? Axlsx::Package
|
316
|
-
|
317
|
-
# be sure its a file type that can be sent
|
318
|
-
return "Unrecognized Object" unless known_transfer_object?(data)
|
319
|
-
|
320
|
-
# verify_host_key = {verify_host_key: false} if options[:verify_host_key].eql? false
|
321
|
-
# verify_host_key ||= {verify_host_key: true}
|
313
|
+
xfer = data if data.is_a? File
|
322
314
|
|
323
315
|
# http://www.rubydoc.info/github/delano/net-scp/Net/SCP
|
324
316
|
# send the stringio object to the remote host via scp
|
@@ -340,8 +332,10 @@ module Convert
|
|
340
332
|
# === Attributes
|
341
333
|
# * +data+ - is it an Axlsx::Package, Sting, StringIO or a File class?
|
342
334
|
def known_transfer_object?( data )
|
343
|
-
return true if data.is_a?
|
344
|
-
|
335
|
+
return true if data.is_a? Axlsx::Package
|
336
|
+
return true if data.is_a? StringIO
|
337
|
+
return true if data.is_a? String
|
338
|
+
return true if data.is_a? File
|
345
339
|
return false
|
346
340
|
end
|
347
341
|
|
data/lib/openapply/version.rb
CHANGED
data/openapply.gemspec
CHANGED
@@ -38,9 +38,19 @@ Gem::Specification.new do |spec|
|
|
38
38
|
# # need this version of axlsx to match roo's rubyzip needs
|
39
39
|
# # axlsx 2.1.0.pre uses rubyzip 1.1.7 - which has a security flaw
|
40
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'
|
48
|
+
|
49
|
+
# # Rubyzip before 1.2.1 has a directory traversal vulnerability: CVE-2017-5946
|
50
|
+
spec.add_dependency 'rubyzip', '>= 1.2.1'
|
51
|
+
# don't use official release - use above
|
41
52
|
# spec.add_dependency "axlsx", "2.1.0.pre"
|
42
53
|
# spec.add_dependency "rubyzip", "~> 1.2"
|
43
|
-
# spec.add_development_dependency "roo", "~> 2.7"
|
44
54
|
|
45
55
|
spec.add_development_dependency "simplecov", "~> 0.15"
|
46
56
|
spec.add_development_dependency "webmock" , "~> 3.1"
|
@@ -48,4 +58,6 @@ Gem::Specification.new do |spec|
|
|
48
58
|
spec.add_development_dependency "rake", "~> 10.0"
|
49
59
|
spec.add_development_dependency "rspec", "~> 3.7"
|
50
60
|
spec.add_development_dependency "pry", "~> 0.11"
|
61
|
+
spec.add_development_dependency "roo", "~> 2.7"
|
62
|
+
|
51
63
|
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.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bill Tihen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: axlsx
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
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: rubyzip
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.2.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.2.1
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: simplecov
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +178,20 @@ dependencies:
|
|
150
178
|
- - "~>"
|
151
179
|
- !ruby/object:Gem::Version
|
152
180
|
version: '0.11'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: roo
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.7'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '2.7'
|
153
195
|
description:
|
154
196
|
email:
|
155
197
|
- btihen@gmail.com
|