berkeley_library-util 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +18 -0
  3. data/.gitignore +240 -0
  4. data/.idea/.gitignore +8 -0
  5. data/.idea/inspectionProfiles/Project_Default.xml +21 -0
  6. data/.idea/misc.xml +6 -0
  7. data/.idea/modules.xml +8 -0
  8. data/.idea/util.iml +123 -0
  9. data/.idea/vcs.xml +6 -0
  10. data/.rubocop.yml +334 -0
  11. data/.ruby-version +1 -0
  12. data/.simplecov +8 -0
  13. data/.yardopts +1 -0
  14. data/CHANGES.md +3 -0
  15. data/Gemfile +3 -0
  16. data/LICENSE.md +21 -0
  17. data/README.md +21 -0
  18. data/Rakefile +20 -0
  19. data/berkeley_library-util.gemspec +42 -0
  20. data/lib/berkeley_library/util/arrays.rb +178 -0
  21. data/lib/berkeley_library/util/module_info.rb +16 -0
  22. data/lib/berkeley_library/util/paths.rb +111 -0
  23. data/lib/berkeley_library/util/stringios.rb +30 -0
  24. data/lib/berkeley_library/util/strings.rb +42 -0
  25. data/lib/berkeley_library/util/sys_exits.rb +15 -0
  26. data/lib/berkeley_library/util/times.rb +22 -0
  27. data/lib/berkeley_library/util/uris/appender.rb +162 -0
  28. data/lib/berkeley_library/util/uris/requester.rb +62 -0
  29. data/lib/berkeley_library/util/uris/validator.rb +32 -0
  30. data/lib/berkeley_library/util/uris.rb +44 -0
  31. data/lib/berkeley_library/util.rb +1 -0
  32. data/rakelib/bundle.rake +8 -0
  33. data/rakelib/coverage.rake +11 -0
  34. data/rakelib/gem.rake +54 -0
  35. data/rakelib/rubocop.rake +18 -0
  36. data/rakelib/spec.rake +2 -0
  37. data/spec/.rubocop.yml +40 -0
  38. data/spec/berkeley_library/util/arrays_spec.rb +340 -0
  39. data/spec/berkeley_library/util/paths_spec.rb +90 -0
  40. data/spec/berkeley_library/util/stringios_spec.rb +34 -0
  41. data/spec/berkeley_library/util/strings_spec.rb +59 -0
  42. data/spec/berkeley_library/util/times_spec.rb +39 -0
  43. data/spec/berkeley_library/util/uris/requester_spec.rb +75 -0
  44. data/spec/berkeley_library/util/uris/validator_spec.rb +51 -0
  45. data/spec/berkeley_library/util/uris_spec.rb +133 -0
  46. data/spec/spec_helper.rb +30 -0
  47. metadata +321 -0
@@ -0,0 +1,133 @@
1
+ require 'spec_helper'
2
+
3
+ module BerkeleyLibrary::Util
4
+ describe URIs do
5
+ describe :append do
6
+ it 'appends paths' do
7
+ original_uri = URI('https://example.org/foo/bar')
8
+ new_uri = URIs.append(original_uri, 'qux', 'corge', 'garply')
9
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply'))
10
+ end
11
+
12
+ it 'does not modify the original URI' do
13
+ original_uri = URI('https://example.org/foo/bar')
14
+ original_url = original_uri.to_s
15
+ new_uri = URIs.append(original_uri, 'qux', 'corge', 'garply')
16
+ expect(new_uri).not_to be(original_uri)
17
+ expect(original_uri.to_s).to eq(original_url)
18
+ end
19
+
20
+ it 'removes extraneous slashes' do
21
+ original_uri = URI('https://example.org/foo/bar')
22
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
23
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply'))
24
+ end
25
+
26
+ it 'preserves queries' do
27
+ original_uri = URI('https://example.org/foo/bar?baz=qux')
28
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
29
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?baz=qux'))
30
+ end
31
+
32
+ it 'preserves fragments' do
33
+ original_uri = URI('https://example.org/foo/bar#baz')
34
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
35
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply#baz'))
36
+ end
37
+
38
+ it 'accepts a query string if no previous query present' do
39
+ original_uri = URI('https://example.org/foo/bar#baz')
40
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply?grault=xyzzy')
41
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy#baz'))
42
+ end
43
+
44
+ it 'allows the ? to be passed separately' do
45
+ original_uri = URI('https://example.org/foo/bar#baz')
46
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply', '?', 'grault=xyzzy')
47
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy#baz'))
48
+ end
49
+
50
+ it 'appends query parameters with &' do
51
+ original_uri = URI('https://example.org/foo/bar#baz')
52
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply?grault=xyzzy', '&plugh=flob')
53
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy&plugh=flob#baz'))
54
+ end
55
+
56
+ it 'appends query parameters to original URI query' do
57
+ original_uri = URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy')
58
+ new_uri = URIs.append(original_uri, '&plugh=flob')
59
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy&plugh=flob'))
60
+ end
61
+
62
+ it 'treats & as a path element if no query is present' do
63
+ original_uri = URI('https://example.org/foo/bar#baz')
64
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', 'garply', '&plugh=flob')
65
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply/&plugh=flob#baz'))
66
+ end
67
+
68
+ it 'accepts a fragment if no previous fragment present' do
69
+ original_uri = URI('https://example.org/foo/bar?baz=qux')
70
+ new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply#grault')
71
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?baz=qux#grault'))
72
+ end
73
+
74
+ it 'rejects a query string if the original URI already has one' do
75
+ original_uri = URI('https://example.org/foo/bar?baz=qux')
76
+ expect { URIs.append(original_uri, '/qux?corge') }.to raise_error(URI::InvalidComponentError)
77
+ end
78
+
79
+ it 'rejects a fragment if the original URI already has one' do
80
+ original_uri = URI('https://example.org/foo/bar#baz')
81
+ expect { URIs.append(original_uri, '/qux#corge') }.to raise_error(URI::InvalidComponentError)
82
+ end
83
+
84
+ it 'rejects appending multiple queries' do
85
+ original_uri = URI('https://example.org/foo/bar')
86
+ expect { URIs.append(original_uri, 'baz?qux=corge', 'grault?plugh=xyzzy') }.to raise_error(URI::InvalidComponentError)
87
+ end
88
+
89
+ it 'rejects appending multiple fragments' do
90
+ original_uri = URI('https://example.org/foo/bar')
91
+ expect { URIs.append(original_uri, 'baz#qux', 'grault#plugh') }.to raise_error(URI::InvalidComponentError)
92
+ end
93
+
94
+ it 'rejects queries after fragments' do
95
+ original_uri = URI('https://example.org/foo/bar')
96
+ expect { URIs.append(original_uri, 'baz#qux', '?grault=plugh') }.to raise_error(URI::InvalidComponentError)
97
+ end
98
+
99
+ it 'correctly handles fragments in mid-path-segment' do
100
+ original_uri = URI('https://example.org/foo/bar')
101
+ new_uri = URIs.append(original_uri, 'qux#corge')
102
+ expect(new_uri).to eq(URI('https://example.org/foo/bar/qux#corge'))
103
+ end
104
+
105
+ it 'correctly handles fragments in query start' do
106
+ original_uri = URI('https://example.org/foo/bar')
107
+ new_uri = URIs.append(original_uri, '?qux=corge&grault=plugh#xyzzy')
108
+ expect(new_uri).to eq(URI('https://example.org/foo/bar?qux=corge&grault=plugh#xyzzy'))
109
+ end
110
+
111
+ it 'correctly handles fragments in mid-query' do
112
+ original_uri = URI('https://example.org/foo/bar')
113
+ new_uri = URIs.append(original_uri, '?qux=corge', '&grault=plugh#xyzzy')
114
+ expect(new_uri).to eq(URI('https://example.org/foo/bar?qux=corge&grault=plugh#xyzzy'))
115
+ end
116
+ end
117
+
118
+ describe :get do
119
+ it 'makes a GET request' do
120
+ url = 'https://example.org/'
121
+ params = { p1: 1, p2: 2 }
122
+ headers = { 'X-help' => 'I am trapped in a unit test' }
123
+
124
+ url_with_query = "#{url}?#{URI.encode_www_form(params)}"
125
+ expected_body = 'Help! I am trapped in a unit test'
126
+ stub_request(:get, url_with_query).with(headers: headers).to_return(body: expected_body)
127
+
128
+ result = URIs.get(url, params: params, headers: headers)
129
+ expect(result).to eq(expected_body)
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,30 @@
1
+ # ------------------------------------------------------------
2
+ # Simplecov
3
+
4
+ require 'colorize'
5
+ require 'simplecov' if ENV['COVERAGE']
6
+
7
+ # ------------------------------------------------------------
8
+ # RSpec
9
+
10
+ require 'webmock/rspec'
11
+
12
+ RSpec.configure do |config|
13
+ config.color = true
14
+ config.tty = true
15
+ config.formatter = :documentation
16
+ config.before(:each) { WebMock.disable_net_connect!(allow_localhost: true) }
17
+ config.after(:each) { WebMock.allow_net_connect! }
18
+ config.mock_with :rspec do |mocks|
19
+ mocks.verify_partial_doubles = true
20
+ end
21
+ config.shared_context_metadata_behavior = :apply_to_host_groups
22
+ end
23
+
24
+ # ------------------------------------------------------------
25
+ # Code under test
26
+
27
+ require 'berkeley_library/util'
28
+
29
+ FileUtils.mkdir_p('log')
30
+ BerkeleyLibrary::Logging.logger = BerkeleyLibrary::Logging::Loggers.new_readable_logger('log/test.log')
metadata ADDED
@@ -0,0 +1,321 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: berkeley_library-util
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - David Moles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-09-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: berkeley_library-logging
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: typesafe_enum
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundle-audit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ci_reporter_rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: colorize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dotenv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '13.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '13.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.10'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.10'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: '1.11'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: '1.11'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rake
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.5'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.5'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop-rspec
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '2.2'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '2.2'
181
+ - !ruby/object:Gem::Dependency
182
+ name: ruby-prof
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 0.17.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 0.17.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: simplecov
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.21'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0.21'
209
+ - !ruby/object:Gem::Dependency
210
+ name: simplecov-rcov
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0.2'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.2'
223
+ - !ruby/object:Gem::Dependency
224
+ name: webmock
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3.12'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.12'
237
+ description: A collection of miscellaneous Ruby routines for the UC Berkeley Library.
238
+ email: dmoles@berkeley.edu
239
+ executables: []
240
+ extensions: []
241
+ extra_rdoc_files: []
242
+ files:
243
+ - ".github/workflows/build.yml"
244
+ - ".gitignore"
245
+ - ".idea/.gitignore"
246
+ - ".idea/inspectionProfiles/Project_Default.xml"
247
+ - ".idea/misc.xml"
248
+ - ".idea/modules.xml"
249
+ - ".idea/util.iml"
250
+ - ".idea/vcs.xml"
251
+ - ".rubocop.yml"
252
+ - ".ruby-version"
253
+ - ".simplecov"
254
+ - ".yardopts"
255
+ - CHANGES.md
256
+ - Gemfile
257
+ - LICENSE.md
258
+ - README.md
259
+ - Rakefile
260
+ - berkeley_library-util.gemspec
261
+ - lib/berkeley_library/util.rb
262
+ - lib/berkeley_library/util/arrays.rb
263
+ - lib/berkeley_library/util/module_info.rb
264
+ - lib/berkeley_library/util/paths.rb
265
+ - lib/berkeley_library/util/stringios.rb
266
+ - lib/berkeley_library/util/strings.rb
267
+ - lib/berkeley_library/util/sys_exits.rb
268
+ - lib/berkeley_library/util/times.rb
269
+ - lib/berkeley_library/util/uris.rb
270
+ - lib/berkeley_library/util/uris/appender.rb
271
+ - lib/berkeley_library/util/uris/requester.rb
272
+ - lib/berkeley_library/util/uris/validator.rb
273
+ - rakelib/bundle.rake
274
+ - rakelib/coverage.rake
275
+ - rakelib/gem.rake
276
+ - rakelib/rubocop.rake
277
+ - rakelib/spec.rake
278
+ - spec/.rubocop.yml
279
+ - spec/berkeley_library/util/arrays_spec.rb
280
+ - spec/berkeley_library/util/paths_spec.rb
281
+ - spec/berkeley_library/util/stringios_spec.rb
282
+ - spec/berkeley_library/util/strings_spec.rb
283
+ - spec/berkeley_library/util/times_spec.rb
284
+ - spec/berkeley_library/util/uris/requester_spec.rb
285
+ - spec/berkeley_library/util/uris/validator_spec.rb
286
+ - spec/berkeley_library/util/uris_spec.rb
287
+ - spec/spec_helper.rb
288
+ homepage: https://github.com/BerkeleyLibrary/util
289
+ licenses:
290
+ - MIT
291
+ metadata: {}
292
+ post_install_message:
293
+ rdoc_options: []
294
+ require_paths:
295
+ - lib
296
+ required_ruby_version: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '2.7'
301
+ required_rubygems_version: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - ">="
304
+ - !ruby/object:Gem::Version
305
+ version: '0'
306
+ requirements: []
307
+ rubygems_version: 3.1.6
308
+ signing_key:
309
+ specification_version: 4
310
+ summary: Miscellaneous Ruby utilities for the UC Berkeley Library
311
+ test_files:
312
+ - spec/.rubocop.yml
313
+ - spec/berkeley_library/util/arrays_spec.rb
314
+ - spec/berkeley_library/util/paths_spec.rb
315
+ - spec/berkeley_library/util/stringios_spec.rb
316
+ - spec/berkeley_library/util/strings_spec.rb
317
+ - spec/berkeley_library/util/times_spec.rb
318
+ - spec/berkeley_library/util/uris/requester_spec.rb
319
+ - spec/berkeley_library/util/uris/validator_spec.rb
320
+ - spec/berkeley_library/util/uris_spec.rb
321
+ - spec/spec_helper.rb