berkeley_library-util 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +17 -5
- data/.idea/inspectionProfiles/Project_Default.xml +1 -0
- data/.idea/util.iml +48 -51
- data/.rubocop.yml +157 -2
- data/.simplecov +5 -6
- data/CHANGES.md +10 -0
- data/Rakefile +2 -2
- data/berkeley_library-util.gemspec +5 -6
- data/lib/berkeley_library/util/arrays.rb +3 -3
- data/lib/berkeley_library/util/files.rb +2 -2
- data/lib/berkeley_library/util/module_info.rb +1 -1
- data/lib/berkeley_library/util/uris/appender.rb +15 -19
- data/lib/berkeley_library/util/uris/requester.rb +4 -4
- data/lib/berkeley_library/util/uris.rb +1 -1
- data/rakelib/.rubocop.yml +4 -0
- data/spec/.rubocop.yml +89 -0
- data/spec/berkeley_library/util/arrays_spec.rb +10 -1
- data/spec/berkeley_library/util/files_spec.rb +1 -0
- data/spec/berkeley_library/util/stringios_spec.rb +7 -0
- data/spec/berkeley_library/util/strings_spec.rb +4 -0
- data/spec/berkeley_library/util/times_spec.rb +4 -0
- data/spec/berkeley_library/util/uris/requester_spec.rb +15 -0
- data/spec/berkeley_library/util/uris_spec.rb +62 -10
- data/spec/spec_helper.rb +2 -2
- metadata +16 -54
- data/rakelib/bundle.rake +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a17e4e3e2e6e03e0dda795450e724650a0a7f7ae44db3b7a558bc371d8bed1b7
|
4
|
+
data.tar.gz: 106ff7e21c1e9568f4bdabc116023c292878f4fd629e5ee3ada934b2c2a10b43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4fbde8aa9e43a7ad7c414b92b488c5d2af1ae29c7f28a7ecd8f6ceb308e42c3c27a2256994362b15cba5133ec00feb32d5fe76f0b774577b292be6c2ba08528
|
7
|
+
data.tar.gz: 23c41cbed1b0befc458c8989792c45cf7429905b06e2deec72a88478f8eb7676a6e3be96dae5fa308239bb4f70b19acae421593711c20dd22d305f55262b0f64
|
data/.github/workflows/build.yml
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
name: Build
|
2
|
-
on: [ push, pull_request ]
|
2
|
+
on: [ push, pull_request, workflow_dispatch ]
|
3
3
|
jobs:
|
4
4
|
test:
|
5
5
|
strategy:
|
6
6
|
fail-fast: false
|
7
7
|
matrix:
|
8
8
|
os: [ ubuntu-latest, macos-latest ]
|
9
|
-
ruby: [ '2.7', '3.0' ]
|
9
|
+
ruby: [ '2.7', '3.0', '3.1' ]
|
10
10
|
runs-on: ${{ matrix.os }}
|
11
11
|
|
12
12
|
steps:
|
13
|
-
-
|
14
|
-
|
13
|
+
- name: Check out repository
|
14
|
+
uses: actions/checkout@v2
|
15
|
+
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
15
18
|
with:
|
16
19
|
ruby-version: ${{ matrix.ruby }}
|
17
20
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
18
|
-
|
21
|
+
|
22
|
+
- name: Run checks
|
23
|
+
run: bundle exec rake
|
24
|
+
|
25
|
+
- name: Upload artifacts
|
26
|
+
if: ${{ always() }}
|
27
|
+
uses: actions/upload-artifact@v3
|
28
|
+
with:
|
29
|
+
name: artifacts
|
30
|
+
path: artifacts/**
|
@@ -11,6 +11,7 @@
|
|
11
11
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
12
12
|
<inspection_tool class="Rubocop" enabled="false" level="WARNING" enabled_by_default="false" />
|
13
13
|
<inspection_tool class="RubyCaseWithoutElseBlockInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
14
|
+
<inspection_tool class="RubyMismatchedArgumentType" enabled="true" level="INFORMATION" enabled_by_default="true" />
|
14
15
|
<inspection_tool class="RubyMismatchedReturnType" enabled="true" level="WARNING" enabled_by_default="true">
|
15
16
|
<option name="myCheckNilability" value="false" />
|
16
17
|
</inspection_tool>
|
data/.idea/util.iml
CHANGED
@@ -5,83 +5,83 @@
|
|
5
5
|
</component>
|
6
6
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
7
7
|
<exclude-output />
|
8
|
-
<content url="file://$MODULE_DIR$"
|
8
|
+
<content url="file://$MODULE_DIR$">
|
9
|
+
<excludeFolder url="file://$MODULE_DIR$/artifacts" />
|
10
|
+
</content>
|
9
11
|
<orderEntry type="jdk" jdkName="RVM: ruby-2.7.4" jdkType="RUBY_SDK" />
|
10
12
|
<orderEntry type="sourceFolder" forTests="false" />
|
11
|
-
<orderEntry type="library" scope="PROVIDED" name="actionpack (v7.0.
|
12
|
-
<orderEntry type="library" scope="PROVIDED" name="actionview (v7.0.
|
13
|
-
<orderEntry type="library" scope="PROVIDED" name="activesupport (v7.0.
|
14
|
-
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.8.
|
13
|
+
<orderEntry type="library" scope="PROVIDED" name="actionpack (v7.0.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
14
|
+
<orderEntry type="library" scope="PROVIDED" name="actionview (v7.0.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
15
|
+
<orderEntry type="library" scope="PROVIDED" name="activesupport (v7.0.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.8.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
15
17
|
<orderEntry type="library" scope="PROVIDED" name="amazing_print (v1.4.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
16
18
|
<orderEntry type="library" scope="PROVIDED" name="ast (v2.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
17
|
-
<orderEntry type="library" scope="PROVIDED" name="berkeley_library-logging (v0.2.
|
19
|
+
<orderEntry type="library" scope="PROVIDED" name="berkeley_library-logging (v0.2.7, RVM: ruby-2.7.4) [gem]" level="application" />
|
18
20
|
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.4, RVM: ruby-2.7.4) [gem]" level="application" />
|
19
|
-
<orderEntry type="library" scope="PROVIDED" name="bundle-audit (v0.1.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
20
21
|
<orderEntry type="library" scope="PROVIDED" name="bundler (v2.2.31, RVM: ruby-2.7.4) [gem]" level="application" />
|
21
|
-
<orderEntry type="library" scope="PROVIDED" name="
|
22
|
-
<orderEntry type="library" scope="PROVIDED" name="ci_reporter (v2.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="ci_reporter (v2.1.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
23
23
|
<orderEntry type="library" scope="PROVIDED" name="ci_reporter_rspec (v1.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
24
24
|
<orderEntry type="library" scope="PROVIDED" name="colorize (v0.8.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
25
|
-
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.
|
25
|
+
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.2.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
26
26
|
<orderEntry type="library" scope="PROVIDED" name="crack (v0.4.5, RVM: ruby-2.7.4) [gem]" level="application" />
|
27
27
|
<orderEntry type="library" scope="PROVIDED" name="crass (v1.0.6, RVM: ruby-2.7.4) [gem]" level="application" />
|
28
28
|
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.5.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
29
29
|
<orderEntry type="library" scope="PROVIDED" name="docile (v1.4.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
30
30
|
<orderEntry type="library" scope="PROVIDED" name="domain_name (v0.5.20190701, RVM: ruby-2.7.4) [gem]" level="application" />
|
31
|
-
<orderEntry type="library" scope="PROVIDED" name="dotenv (v2.
|
32
|
-
<orderEntry type="library" scope="PROVIDED" name="erubi (v1.
|
31
|
+
<orderEntry type="library" scope="PROVIDED" name="dotenv (v2.8.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
32
|
+
<orderEntry type="library" scope="PROVIDED" name="erubi (v1.12.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
33
33
|
<orderEntry type="library" scope="PROVIDED" name="hashdiff (v1.0.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
34
34
|
<orderEntry type="library" scope="PROVIDED" name="http-accept (v1.7.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
35
|
-
<orderEntry type="library" scope="PROVIDED" name="http-cookie (v1.0.
|
36
|
-
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.
|
35
|
+
<orderEntry type="library" scope="PROVIDED" name="http-cookie (v1.0.5, RVM: ruby-2.7.4) [gem]" level="application" />
|
36
|
+
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.12.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
37
|
+
<orderEntry type="library" scope="PROVIDED" name="json (v2.6.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
37
38
|
<orderEntry type="library" scope="PROVIDED" name="lograge (v0.12.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
38
|
-
<orderEntry type="library" scope="PROVIDED" name="loofah (v2.
|
39
|
+
<orderEntry type="library" scope="PROVIDED" name="loofah (v2.19.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
39
40
|
<orderEntry type="library" scope="PROVIDED" name="method_source (v1.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
40
41
|
<orderEntry type="library" scope="PROVIDED" name="mime-types (v3.4.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
41
|
-
<orderEntry type="library" scope="PROVIDED" name="mime-types-data (v3.
|
42
|
-
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.
|
42
|
+
<orderEntry type="library" scope="PROVIDED" name="mime-types-data (v3.2023.0218.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
43
|
+
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.18.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
43
44
|
<orderEntry type="library" scope="PROVIDED" name="netrc (v0.11.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
44
|
-
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.
|
45
|
-
<orderEntry type="library" scope="PROVIDED" name="oj (v3.
|
45
|
+
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.14.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
46
|
+
<orderEntry type="library" scope="PROVIDED" name="oj (v3.14.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
46
47
|
<orderEntry type="library" scope="PROVIDED" name="ougai (v1.9.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
47
48
|
<orderEntry type="library" scope="PROVIDED" name="parallel (v1.22.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
48
|
-
<orderEntry type="library" scope="PROVIDED" name="parser (v3.1.
|
49
|
-
<orderEntry type="library" scope="PROVIDED" name="public_suffix (
|
50
|
-
<orderEntry type="library" scope="PROVIDED" name="racc (v1.6.
|
51
|
-
<orderEntry type="library" scope="PROVIDED" name="rack (v2.2.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
52
|
-
<orderEntry type="library" scope="PROVIDED" name="rack-test (
|
49
|
+
<orderEntry type="library" scope="PROVIDED" name="parser (v3.2.1.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
50
|
+
<orderEntry type="library" scope="PROVIDED" name="public_suffix (v5.0.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
51
|
+
<orderEntry type="library" scope="PROVIDED" name="racc (v1.6.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
52
|
+
<orderEntry type="library" scope="PROVIDED" name="rack (v2.2.6.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
53
|
+
<orderEntry type="library" scope="PROVIDED" name="rack-test (v2.0.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
53
54
|
<orderEntry type="library" scope="PROVIDED" name="rails-dom-testing (v2.0.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
54
|
-
<orderEntry type="library" scope="PROVIDED" name="rails-html-sanitizer (v1.
|
55
|
-
<orderEntry type="library" scope="PROVIDED" name="railties (v7.0.
|
55
|
+
<orderEntry type="library" scope="PROVIDED" name="rails-html-sanitizer (v1.5.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
56
|
+
<orderEntry type="library" scope="PROVIDED" name="railties (v7.0.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
56
57
|
<orderEntry type="library" scope="PROVIDED" name="rainbow (v3.1.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
57
58
|
<orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, RVM: ruby-2.7.4) [gem]" level="application" />
|
58
|
-
<orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.
|
59
|
+
<orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.7.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
59
60
|
<orderEntry type="library" scope="PROVIDED" name="request_store (v1.5.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
60
61
|
<orderEntry type="library" scope="PROVIDED" name="rest-client (v2.1.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
61
62
|
<orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, RVM: ruby-2.7.4) [gem]" level="application" />
|
62
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec (v3.
|
63
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.
|
64
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.
|
65
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.
|
66
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.
|
67
|
-
<orderEntry type="library" scope="PROVIDED" name="rubocop (v1.
|
68
|
-
<orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v1.
|
63
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v3.12.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
64
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.12.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
65
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.12.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
66
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.12.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
67
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.12.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
68
|
+
<orderEntry type="library" scope="PROVIDED" name="rubocop (v1.39.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
69
|
+
<orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v1.27.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
69
70
|
<orderEntry type="library" scope="PROVIDED" name="rubocop-rake (v0.6.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
70
71
|
<orderEntry type="library" scope="PROVIDED" name="rubocop-rspec (v2.4.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
71
72
|
<orderEntry type="library" scope="PROVIDED" name="ruby-prof (v0.17.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
72
|
-
<orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.
|
73
|
-
<orderEntry type="library" scope="PROVIDED" name="simplecov (v0.
|
73
|
+
<orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.13.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
74
|
+
<orderEntry type="library" scope="PROVIDED" name="simplecov (v0.22.0, RVM: ruby-2.7.4) [gem]" level="application" />
|
74
75
|
<orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.12.3, RVM: ruby-2.7.4) [gem]" level="application" />
|
75
|
-
<orderEntry type="library" scope="PROVIDED" name="simplecov-rcov (v0.3.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
76
76
|
<orderEntry type="library" scope="PROVIDED" name="simplecov_json_formatter (v0.1.4, RVM: ruby-2.7.4) [gem]" level="application" />
|
77
77
|
<orderEntry type="library" scope="PROVIDED" name="thor (v1.2.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
78
|
-
<orderEntry type="library" scope="PROVIDED" name="typesafe_enum (v0.3.
|
79
|
-
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v2.0.
|
78
|
+
<orderEntry type="library" scope="PROVIDED" name="typesafe_enum (v0.3.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
79
|
+
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v2.0.6, RVM: ruby-2.7.4) [gem]" level="application" />
|
80
80
|
<orderEntry type="library" scope="PROVIDED" name="unf (v0.1.4, RVM: ruby-2.7.4) [gem]" level="application" />
|
81
|
-
<orderEntry type="library" scope="PROVIDED" name="unf_ext (v0.0.8.
|
82
|
-
<orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v2.
|
83
|
-
<orderEntry type="library" scope="PROVIDED" name="webmock (v3.
|
84
|
-
<orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.
|
81
|
+
<orderEntry type="library" scope="PROVIDED" name="unf_ext (v0.0.8.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
82
|
+
<orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v2.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
|
83
|
+
<orderEntry type="library" scope="PROVIDED" name="webmock (v3.18.1, RVM: ruby-2.7.4) [gem]" level="application" />
|
84
|
+
<orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.6.7, RVM: ruby-2.7.4) [gem]" level="application" />
|
85
85
|
</component>
|
86
86
|
<component name="RModuleSettingsStorage">
|
87
87
|
<LOAD_PATH number="2" string0="$MODULE_DIR$/lib" string1="$MODULE_DIR$/spec" />
|
@@ -91,19 +91,16 @@
|
|
91
91
|
<option name="myRootTask">
|
92
92
|
<RakeTaskImpl id="rake">
|
93
93
|
<subtasks>
|
94
|
-
<RakeTaskImpl id="bundle">
|
95
|
-
<subtasks>
|
96
|
-
<RakeTaskImpl description="Updates the ruby-advisory-db then runs bundle-audit" fullCommand="bundle:audit" id="audit" />
|
97
|
-
</subtasks>
|
98
|
-
</RakeTaskImpl>
|
99
94
|
<RakeTaskImpl description="Run all specs in spec directory, with coverage" fullCommand="coverage" id="coverage" />
|
100
|
-
<RakeTaskImpl description="Run tests, check test coverage, check code style,
|
101
|
-
<RakeTaskImpl description="Build berkeley_library-util.gemspec as berkeley_library-util-0.1.
|
95
|
+
<RakeTaskImpl description="Run tests, check test coverage, check code style, build gem" fullCommand="default" id="default" />
|
96
|
+
<RakeTaskImpl description="Build berkeley_library-util.gemspec as berkeley_library-util-0.1.6.gem" fullCommand="gem" id="gem" />
|
102
97
|
<RakeTaskImpl description="Run RuboCop with auto-correct, and output results to console" fullCommand="ra" id="ra" />
|
103
98
|
<RakeTaskImpl description="Run rubocop with HTML output" fullCommand="rubocop" id="rubocop" />
|
104
99
|
<RakeTaskImpl id="rubocop">
|
105
100
|
<subtasks>
|
106
|
-
<RakeTaskImpl description="
|
101
|
+
<RakeTaskImpl description="Autocorrect RuboCop offenses (only when it's safe)" fullCommand="rubocop:autocorrect" id="autocorrect" />
|
102
|
+
<RakeTaskImpl description="Autocorrect RuboCop offenses (safe and unsafe)" fullCommand="rubocop:autocorrect_all" id="autocorrect_all" />
|
103
|
+
<RakeTaskImpl description="" fullCommand="rubocop:auto_correct" id="auto_correct" />
|
107
104
|
</subtasks>
|
108
105
|
</RakeTaskImpl>
|
109
106
|
<RakeTaskImpl description="Run RSpec code examples" fullCommand="spec" id="spec" />
|
data/.rubocop.yml
CHANGED
@@ -332,7 +332,162 @@ Style/SwapValues: # (new in 1.1)
|
|
332
332
|
############################################################
|
333
333
|
# Added in RuboCop 1.10
|
334
334
|
|
335
|
-
Gemspec/DateAssignment: # (new in 1.10)
|
336
|
-
Enabled: true
|
337
335
|
Style/HashConversion: # (new in 1.10)
|
338
336
|
Enabled: true
|
337
|
+
|
338
|
+
############################################################
|
339
|
+
# Added in RuboCop 1.12
|
340
|
+
|
341
|
+
Style/StringChars: # (new in 1.12)
|
342
|
+
Enabled: true
|
343
|
+
|
344
|
+
############################################################
|
345
|
+
# Added in RuboCop 1.16
|
346
|
+
|
347
|
+
Lint/EmptyInPattern: # (new in 1.16)
|
348
|
+
Enabled: true
|
349
|
+
Style/InPatternThen: # (new in 1.16)
|
350
|
+
Enabled: true
|
351
|
+
Style/MultilineInPatternThen: # (new in 1.16)
|
352
|
+
Enabled: true
|
353
|
+
Style/QuotedSymbols: # (new in 1.16)
|
354
|
+
Enabled: true
|
355
|
+
|
356
|
+
############################################################
|
357
|
+
# Added in RuboCop 1.18
|
358
|
+
|
359
|
+
Layout/LineEndStringConcatenationIndentation: # (new in 1.18)
|
360
|
+
Enabled: true
|
361
|
+
|
362
|
+
############################################################
|
363
|
+
# Added in RuboCop 1.19
|
364
|
+
|
365
|
+
Lint/AmbiguousRange: # (new in 1.19)
|
366
|
+
Enabled: true
|
367
|
+
Style/RedundantSelfAssignmentBranch: # (new in 1.19)
|
368
|
+
Enabled: true
|
369
|
+
|
370
|
+
############################################################
|
371
|
+
# Added in RuboCop 1.21
|
372
|
+
|
373
|
+
Lint/AmbiguousOperatorPrecedence: # (new in 1.21)
|
374
|
+
Enabled: true
|
375
|
+
Lint/IncompatibleIoSelectWithFiberScheduler: # (new in 1.21)
|
376
|
+
Enabled: true
|
377
|
+
|
378
|
+
############################################################
|
379
|
+
# Added in RuboCop 1.22
|
380
|
+
|
381
|
+
Lint/RequireRelativeSelfPath: # (new in 1.22)
|
382
|
+
Enabled: true
|
383
|
+
Security/IoMethods: # (new in 1.22)
|
384
|
+
Enabled: true
|
385
|
+
Style/NumberedParameters: # (new in 1.22)
|
386
|
+
Enabled: true
|
387
|
+
Style/NumberedParametersLimit: # (new in 1.22)
|
388
|
+
Enabled: true
|
389
|
+
Style/SelectByRegexp: # (new in 1.22)
|
390
|
+
Enabled: true
|
391
|
+
|
392
|
+
############################################################
|
393
|
+
# Added in RuboCop 1.23
|
394
|
+
|
395
|
+
Gemspec/RequireMFA: # (new in 1.23)
|
396
|
+
Enabled: true
|
397
|
+
Lint/UselessRuby2Keywords: # (new in 1.23)
|
398
|
+
Enabled: true
|
399
|
+
Style/OpenStructUse: # (new in 1.23)
|
400
|
+
Enabled: true
|
401
|
+
|
402
|
+
############################################################
|
403
|
+
# Added in RuboCop 1.24
|
404
|
+
|
405
|
+
Naming/BlockForwarding: # (new in 1.24)
|
406
|
+
Enabled: true
|
407
|
+
Style/FileRead: # (new in 1.24)
|
408
|
+
Enabled: true
|
409
|
+
Style/FileWrite: # (new in 1.24)
|
410
|
+
Enabled: true
|
411
|
+
Style/MapToHash: # (new in 1.24)
|
412
|
+
Enabled: true
|
413
|
+
|
414
|
+
############################################################
|
415
|
+
# Added in RuboCop 1.26
|
416
|
+
|
417
|
+
Style/NestedFileDirname: # (new in 1.26)
|
418
|
+
Enabled: true
|
419
|
+
|
420
|
+
############################################################
|
421
|
+
# Added in RuboCop 1.27
|
422
|
+
|
423
|
+
Lint/RefinementImportMethods: # (new in 1.27)
|
424
|
+
Enabled: true
|
425
|
+
Style/RedundantInitialize: # (new in 1.27)
|
426
|
+
Enabled: true
|
427
|
+
|
428
|
+
############################################################
|
429
|
+
# Added in RuboCop 1.28
|
430
|
+
|
431
|
+
Security/CompoundHash: # (new in 1.28)
|
432
|
+
Enabled: true
|
433
|
+
Style/FetchEnvVar: # (new in 1.28)
|
434
|
+
Enabled: true
|
435
|
+
Style/ObjectThen: # (new in 1.28)
|
436
|
+
Enabled: true
|
437
|
+
|
438
|
+
############################################################
|
439
|
+
# Added in RuboCop 1.29
|
440
|
+
|
441
|
+
Style/EnvHome: # (new in 1.29)
|
442
|
+
Enabled: true
|
443
|
+
|
444
|
+
############################################################
|
445
|
+
# Added in RuboCop 1.30
|
446
|
+
|
447
|
+
Gemspec/DeprecatedAttributeAssignment: # (new in 1.30)
|
448
|
+
Enabled: true
|
449
|
+
Style/MapCompactWithConditionalBlock: # (new in 1.30)
|
450
|
+
Enabled: true
|
451
|
+
|
452
|
+
############################################################
|
453
|
+
# Added in RuboCop 1.31
|
454
|
+
|
455
|
+
Layout/LineContinuationLeadingSpace: # (new in 1.31)
|
456
|
+
Enabled: true
|
457
|
+
Layout/LineContinuationSpacing: # (new in 1.31)
|
458
|
+
Enabled: true
|
459
|
+
Lint/ConstantOverwrittenInRescue: # (new in 1.31)
|
460
|
+
Enabled: true
|
461
|
+
Lint/NonAtomicFileOperation: # (new in 1.31)
|
462
|
+
Enabled: true
|
463
|
+
|
464
|
+
############################################################
|
465
|
+
# Added in RuboCop 1.32
|
466
|
+
|
467
|
+
Lint/RequireRangeParentheses: # (new in 1.32)
|
468
|
+
Enabled: true
|
469
|
+
Style/EmptyHeredoc: # (new in 1.32)
|
470
|
+
Enabled: true
|
471
|
+
|
472
|
+
############################################################
|
473
|
+
# Added in RuboCop 1.35
|
474
|
+
|
475
|
+
Style/MagicCommentFormat: # (new in 1.35)
|
476
|
+
Enabled: true
|
477
|
+
|
478
|
+
############################################################
|
479
|
+
# Added in RuboCop 1.37
|
480
|
+
|
481
|
+
Lint/DuplicateMagicComment: # (new in 1.37)
|
482
|
+
Enabled: true
|
483
|
+
Style/OperatorMethodCall: # (new in 1.37)
|
484
|
+
Enabled: true
|
485
|
+
Style/RedundantStringEscape: # (new in 1.37)
|
486
|
+
Enabled: true
|
487
|
+
|
488
|
+
############################################################
|
489
|
+
# Added in RuboCop 1.38
|
490
|
+
|
491
|
+
Style/RedundantEach: # (new in 1.38)
|
492
|
+
Enabled: true
|
493
|
+
|
data/.simplecov
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
SimpleCov.start 'rails' do
|
1
|
+
SimpleCov.start do
|
4
2
|
add_filter 'module_info.rb'
|
5
|
-
coverage_dir 'artifacts'
|
6
|
-
|
7
|
-
|
3
|
+
coverage_dir 'artifacts/coverage'
|
4
|
+
|
5
|
+
enable_coverage :branch
|
6
|
+
minimum_coverage line: 100, branch: 100
|
8
7
|
end
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# 0.1.6 (2023-03-09)
|
2
|
+
|
3
|
+
- Fix issue in `Requester` where query parameters would not be appended properly
|
4
|
+
to URLs that already included a query string.
|
5
|
+
- Fix issue in `URIs#append` (and `Appender`) where `?` would not be accepted in
|
6
|
+
query strings or fragments, contrary to RFC 3986 §3.
|
7
|
+
- Fix documentation for `Arrays#find_indices`.
|
8
|
+
- Fix issue where `Arrays#find_index` would raise a confusing `NameError`
|
9
|
+
instead of a helpful `ArgumentError` if passed too many arguments.
|
10
|
+
|
1
11
|
# 0.1.5 (2022-09-16)
|
2
12
|
|
3
13
|
- Adds `URIs#path_escape` to escape URL path segments
|
data/Rakefile
CHANGED
@@ -16,5 +16,5 @@ ENV['RAILS_ENV'] = 'test' if ENV['CI']
|
|
16
16
|
# ------------------------------------------------------------
|
17
17
|
# Custom tasks
|
18
18
|
|
19
|
-
desc 'Run tests, check test coverage, check code style,
|
20
|
-
task default: %i[coverage rubocop
|
19
|
+
desc 'Run tests, check test coverage, check code style, build gem'
|
20
|
+
task default: %i[coverage rubocop gem]
|
@@ -17,7 +17,6 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.homepage = BerkeleyLibrary::Util::ModuleInfo::HOMEPAGE
|
18
18
|
|
19
19
|
spec.files = `git ls-files -z`.split("\x0")
|
20
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
20
|
spec.require_paths = ['lib']
|
22
21
|
|
23
22
|
spec.required_ruby_version = ruby_version
|
@@ -26,17 +25,17 @@ Gem::Specification.new do |spec|
|
|
26
25
|
spec.add_dependency 'rest-client', '~> 2.1'
|
27
26
|
spec.add_dependency 'typesafe_enum', '~> 0.3'
|
28
27
|
|
29
|
-
spec.add_development_dependency 'bundle-audit', '~> 0.1'
|
30
28
|
spec.add_development_dependency 'ci_reporter_rspec', '~> 1.0'
|
31
29
|
spec.add_development_dependency 'colorize', '~> 0.8'
|
32
30
|
spec.add_development_dependency 'dotenv', '~> 2.7'
|
33
31
|
spec.add_development_dependency 'rake', '~> 13.0'
|
34
32
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
35
|
-
spec.add_development_dependency 'rubocop', '= 1.
|
36
|
-
spec.add_development_dependency 'rubocop-rake', '
|
37
|
-
spec.add_development_dependency 'rubocop-rspec', '
|
33
|
+
spec.add_development_dependency 'rubocop', '= 1.39'
|
34
|
+
spec.add_development_dependency 'rubocop-rake', '= 0.6.0'
|
35
|
+
spec.add_development_dependency 'rubocop-rspec', '= 2.4.0'
|
38
36
|
spec.add_development_dependency 'ruby-prof', '~> 0.17.0'
|
39
37
|
spec.add_development_dependency 'simplecov', '~> 0.21'
|
40
|
-
spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
|
41
38
|
spec.add_development_dependency 'webmock', '~> 3.12'
|
39
|
+
|
40
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
42
41
|
end
|
@@ -45,7 +45,7 @@ module BerkeleyLibrary
|
|
45
45
|
# returns an array the length of the subset, containing for each element in
|
46
46
|
# the subset the index of the corresponding element in the superset.
|
47
47
|
#
|
48
|
-
# @overload
|
48
|
+
# @overload find_indices(for_array:, in_array:)
|
49
49
|
# For each value in `for_array`, finds the index of the first equal value
|
50
50
|
# in `in_array` after the previously matched value.
|
51
51
|
# @param in_array [Array] the list of values to look in
|
@@ -53,7 +53,7 @@ module BerkeleyLibrary
|
|
53
53
|
# @return [Array<Integer>, nil] the indices in `in_array` of each value in `for_array`,
|
54
54
|
# or `nil` if not all values could be found
|
55
55
|
#
|
56
|
-
# @overload
|
56
|
+
# @overload find_indices(for_array:, in_array:)
|
57
57
|
# For each value in `for_array`, finds the index of the first value
|
58
58
|
# in `in_array` after the previously matched value that matches
|
59
59
|
# the specified match function.
|
@@ -90,7 +90,7 @@ module BerkeleyLibrary
|
|
90
90
|
# @param start_index [Integer] the index to start with
|
91
91
|
# @return [Enumerator] a new enumerator
|
92
92
|
def find_index(*args, in_array:, start_index: 0, &block)
|
93
|
-
raise ArgumentError, "wrong number of arguments (given #{
|
93
|
+
raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 0..1" if args.size > 1
|
94
94
|
return Enumerator.new { |y| find_index(in_array: in_array, start_index: start_index, &y) } if args.empty? && !block_given?
|
95
95
|
return unless (relative_index = in_array[start_index..].find_index(*args, &block))
|
96
96
|
|
@@ -11,8 +11,8 @@ module BerkeleyLibrary
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def parent_exists?(path)
|
14
|
-
path.respond_to?(:parent) && path.parent.exist? ||
|
15
|
-
path.respond_to?(:to_str) && Pathname.new(path).parent.exist?
|
14
|
+
(path.respond_to?(:parent) && path.parent.exist?) ||
|
15
|
+
(path.respond_to?(:to_str) && Pathname.new(path).parent.exist?)
|
16
16
|
end
|
17
17
|
|
18
18
|
# Returns true if `obj` is close enough to an IO object for Nokogiri
|
@@ -7,7 +7,7 @@ module BerkeleyLibrary
|
|
7
7
|
SUMMARY = 'Miscellaneous Ruby utilities for the UC Berkeley Library'.freeze
|
8
8
|
DESCRIPTION = 'A collection of miscellaneous Ruby routines for the UC Berkeley Library.'.freeze
|
9
9
|
LICENSE = 'MIT'.freeze
|
10
|
-
VERSION = '0.1.
|
10
|
+
VERSION = '0.1.6'.freeze
|
11
11
|
HOMEPAGE = 'https://github.com/BerkeleyLibrary/util'.freeze
|
12
12
|
end
|
13
13
|
end
|
@@ -22,10 +22,7 @@ module BerkeleyLibrary
|
|
22
22
|
|
23
23
|
@elements = elements.map(&:to_s)
|
24
24
|
@elements.each_with_index do |element, elem_index|
|
25
|
-
|
26
|
-
next start_fragment_at(elem_index) if element.include?('#')
|
27
|
-
|
28
|
-
add_element(element)
|
25
|
+
handle_element(element, elem_index)
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
@@ -44,6 +41,16 @@ module BerkeleyLibrary
|
|
44
41
|
|
45
42
|
private
|
46
43
|
|
44
|
+
def handle_element(element, elem_index)
|
45
|
+
h_index = element.index('#')
|
46
|
+
q_index = element.index('?')
|
47
|
+
# per RFC 3986 §3, fragment (or query) can contain '?', but query can't contain '#'
|
48
|
+
return start_fragment_at(elem_index) if h_index && (q_index.nil? || h_index < q_index)
|
49
|
+
return start_query_at(elem_index) if q_index && !(in_query? || in_fragment?)
|
50
|
+
|
51
|
+
add_element(element)
|
52
|
+
end
|
53
|
+
|
47
54
|
def state
|
48
55
|
@state ||= :path
|
49
56
|
end
|
@@ -77,24 +84,21 @@ module BerkeleyLibrary
|
|
77
84
|
end
|
78
85
|
|
79
86
|
def start_query_at(elem_index)
|
80
|
-
raise URI::InvalidComponentError, err_query_after_fragment(elem_index) if in_fragment?
|
81
|
-
raise URI::InvalidComponentError, err_too_many_queries(elem_index) unless query_elements.empty?
|
82
|
-
|
83
87
|
handle_query_start(elem_index)
|
84
88
|
@state = :query
|
85
89
|
end
|
86
90
|
|
87
91
|
def start_fragment_at(elem_index)
|
88
92
|
raise URI::InvalidComponentError, err_too_many_fragments(elem_index) unless fragment_elements.empty?
|
89
|
-
raise URI::InvalidComponentError,
|
93
|
+
raise URI::InvalidComponentError, err_too_many_fragments(elem_index) if too_many_fragments?(elem_index)
|
90
94
|
|
91
95
|
handle_fragment_start(elem_index)
|
92
96
|
@state = :fragment
|
93
97
|
end
|
94
98
|
|
95
|
-
def
|
99
|
+
def too_many_fragments?(elem_index)
|
96
100
|
e = elements[elem_index]
|
97
|
-
e.index('
|
101
|
+
e.index('#', 1 + e.index('#'))
|
98
102
|
end
|
99
103
|
|
100
104
|
def add_element(e)
|
@@ -122,7 +126,7 @@ module BerkeleyLibrary
|
|
122
126
|
return q_start unless (f_index = q_start.index('#'))
|
123
127
|
|
124
128
|
next_index = elem_index + 1
|
125
|
-
q_start, q_next = split_around(q_start, f_index)
|
129
|
+
q_start, q_next = split_around(q_start, f_index) # NOTE: this doesn't return the '#'
|
126
130
|
elements[next_index] = "##{q_next}#{elements[next_index]}" # so we prepend one here
|
127
131
|
q_start
|
128
132
|
end
|
@@ -146,14 +150,6 @@ module BerkeleyLibrary
|
|
146
150
|
[s[0...i], s[(i + 1)..]]
|
147
151
|
end
|
148
152
|
|
149
|
-
def err_too_many_queries(elem_index)
|
150
|
-
"#{elements[elem_index].inspect}: URI already has a query string: #{query.inspect}"
|
151
|
-
end
|
152
|
-
|
153
|
-
def err_query_after_fragment(elem_index)
|
154
|
-
"#{elements[elem_index].inspect}: Query delimiter '?' cannot follow fragment delimeter '#'"
|
155
|
-
end
|
156
|
-
|
157
153
|
def err_too_many_fragments(elem_index)
|
158
154
|
"#{elements[elem_index].inspect}: URI already has a fragment: #{fragment.inspect}"
|
159
155
|
end
|
@@ -68,14 +68,14 @@ module BerkeleyLibrary
|
|
68
68
|
req_resp_or_raise(method, url_str, headers)
|
69
69
|
end
|
70
70
|
|
71
|
-
def url_str_with_params(
|
72
|
-
raise ArgumentError, '
|
71
|
+
def url_str_with_params(url, params)
|
72
|
+
raise ArgumentError, 'url cannot be nil' unless (uri = Validator.uri_or_nil(url))
|
73
73
|
|
74
74
|
elements = [].tap do |ee|
|
75
|
-
ee <<
|
75
|
+
ee << uri
|
76
76
|
next if params.empty?
|
77
77
|
|
78
|
-
ee <<
|
78
|
+
ee << (uri.query ? '&' : '?')
|
79
79
|
ee << URI.encode_www_form(params)
|
80
80
|
end
|
81
81
|
|
data/spec/.rubocop.yml
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
inherit_from: ../.rubocop.yml
|
2
2
|
|
3
|
+
require:
|
4
|
+
- rubocop-rspec
|
5
|
+
|
3
6
|
AllCops:
|
4
7
|
# Exclude generated files
|
5
8
|
Exclude:
|
@@ -38,3 +41,89 @@ Metrics/MethodLength:
|
|
38
41
|
# Sometimes we're testing the operator
|
39
42
|
Lint/BinaryOperatorWithIdenticalOperands:
|
40
43
|
Enabled: false
|
44
|
+
|
45
|
+
############################################################
|
46
|
+
# rubocop-rspec
|
47
|
+
|
48
|
+
# believe me, it wasn't by choice
|
49
|
+
RSpec/AnyInstance:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
# we meant to do that
|
53
|
+
RSpec/BeforeAfterAll:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
# more words != more readable
|
57
|
+
RSpec/ContextWording:
|
58
|
+
Enabled: false
|
59
|
+
|
60
|
+
# explicit >>> implicit
|
61
|
+
RSpec/DescribedClass:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
# more punctuation != more readable
|
65
|
+
RSpec/DescribeSymbol:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
# setup cost / time >>> failure granularity
|
69
|
+
RSpec/ExampleLength:
|
70
|
+
Max: 15
|
71
|
+
CountAsOne:
|
72
|
+
- array
|
73
|
+
- hash
|
74
|
+
- heredoc
|
75
|
+
|
76
|
+
# we meant to do that
|
77
|
+
RSpec/ExpectInHook:
|
78
|
+
Enabled: false
|
79
|
+
|
80
|
+
# your naming scheme is not in possession of all the facts
|
81
|
+
RSpec/FilePath:
|
82
|
+
Enabled: false
|
83
|
+
|
84
|
+
# explicit >>> implicit
|
85
|
+
RSpec/InstanceVariable:
|
86
|
+
Enabled: false
|
87
|
+
|
88
|
+
# maybe when 'all' has a corresponding 'none' matcher
|
89
|
+
RSpec/IteratedExpectation:
|
90
|
+
Enabled: false
|
91
|
+
|
92
|
+
# we meant to do that
|
93
|
+
RSpec/MessageSpies:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
# too late now
|
97
|
+
RSpec/MultipleMemoizedHelpers:
|
98
|
+
Enabled: false
|
99
|
+
|
100
|
+
# setup cost / time >>> failure granularity
|
101
|
+
RSpec/MultipleExpectations:
|
102
|
+
Enabled: false
|
103
|
+
|
104
|
+
# cure is worse than the disease
|
105
|
+
RSpec/NestedGroups:
|
106
|
+
Enabled: false
|
107
|
+
|
108
|
+
# more quotation marks != more readable
|
109
|
+
RSpec/SharedExamples:
|
110
|
+
Enabled: false
|
111
|
+
|
112
|
+
# we meant to do that
|
113
|
+
RSpec/StubbedMock:
|
114
|
+
Enabled: false
|
115
|
+
|
116
|
+
# we meant to do that
|
117
|
+
RSpec/VerifiedDoubles:
|
118
|
+
Enabled: false
|
119
|
+
|
120
|
+
############################################################
|
121
|
+
# rubocop-rspec
|
122
|
+
|
123
|
+
# enable newer rubocop-rspec cops
|
124
|
+
|
125
|
+
RSpec/IdenticalEqualityAssertion: # new in 2.4
|
126
|
+
Enabled: true
|
127
|
+
|
128
|
+
RSpec/Rails/AvoidSetupHook: # new in 2.4
|
129
|
+
Enabled: true
|
@@ -113,12 +113,13 @@ module BerkeleyLibrary::Util
|
|
113
113
|
]
|
114
114
|
sources.each do |source|
|
115
115
|
expect(Arrays.find_indices(for_array: source, in_array: target)).to be_nil
|
116
|
+
expect(Arrays.find_indices(for_array: source, in_array: target) { |s, t| t == s.to_s }).to be_nil
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
119
120
|
it 'takes a comparison block' do
|
120
121
|
sub = %i[a c e]
|
121
|
-
expect(Arrays.find_indices(for_array: sub, in_array: target) { |
|
122
|
+
expect(Arrays.find_indices(for_array: sub, in_array: target) { |s, t| t == s.to_s }).to eq([0, 2, 4])
|
122
123
|
end
|
123
124
|
end
|
124
125
|
|
@@ -145,6 +146,10 @@ module BerkeleyLibrary::Util
|
|
145
146
|
expect(Arrays.find_index(in_array: arr, start_index: 2) { |x| x < 4 }).to be_nil
|
146
147
|
end
|
147
148
|
|
149
|
+
it 'raises ArgumentError if given extra arguments' do
|
150
|
+
expect { Arrays.find_index(1, 2, 3, in_array: [1, 2, 3]) }.to raise_error(ArgumentError)
|
151
|
+
end
|
152
|
+
|
148
153
|
# rubocop:disable Lint/Void
|
149
154
|
it 'returns an enumerator if given no arguments' do
|
150
155
|
e = Arrays.find_index(in_array: arr)
|
@@ -327,6 +332,10 @@ module BerkeleyLibrary::Util
|
|
327
332
|
expect(Arrays.invert([0, 2, 3])).to eq([0, nil, 1, 2])
|
328
333
|
end
|
329
334
|
|
335
|
+
it 'returns nil if given nil' do
|
336
|
+
expect(Arrays.invert(nil)).to be_nil
|
337
|
+
end
|
338
|
+
|
330
339
|
it 'fails if values are not ints' do
|
331
340
|
# noinspection RubyYardParamTypeMatch
|
332
341
|
expect { Arrays.invert(%i[a b c]) }.to raise_error(TypeError)
|
@@ -16,6 +16,13 @@ module BerkeleyLibrary
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'reads from the end if given a negative index' do
|
20
|
+
bytes.reverse.each_with_index do |b, i|
|
21
|
+
end_offset = i + 1
|
22
|
+
expect(StringIOs.getbyte(sio, -end_offset)).to eq(b)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
19
26
|
it 'resets the current offset' do
|
20
27
|
StringIOs.getbyte(sio, bytes.size / 2)
|
21
28
|
expect(sio.pos).to eq(0)
|
@@ -41,6 +41,10 @@ module BerkeleyLibrary
|
|
41
41
|
expect(Strings.diff_index(s, s)).to be_nil
|
42
42
|
end
|
43
43
|
|
44
|
+
it 'returns nil for non-strings' do
|
45
|
+
expect(Strings.diff_index(2, ['2'])).to be_nil
|
46
|
+
end
|
47
|
+
|
44
48
|
it 'returns the index for different strings' do
|
45
49
|
s1 = 'elvis aaron presley'
|
46
50
|
s2 = 'elvis nikita presley'
|
@@ -97,6 +97,17 @@ module BerkeleyLibrary
|
|
97
97
|
expect(result).to eq(expected_status)
|
98
98
|
end
|
99
99
|
|
100
|
+
it 'appends query parameters to URL with existing params' do
|
101
|
+
url = 'https://example.org/endpoint?foo=bar'
|
102
|
+
params = { p1: 1, p2: 2 }
|
103
|
+
url_with_query = "#{url}&#{URI.encode_www_form(params)}"
|
104
|
+
expected_status = 203
|
105
|
+
stub_request(:head, url_with_query).to_return(status: expected_status)
|
106
|
+
|
107
|
+
result = Requester.head(url, params: params)
|
108
|
+
expect(result).to eq(expected_status)
|
109
|
+
end
|
110
|
+
|
100
111
|
it 'sends request headers' do
|
101
112
|
url = 'https://example.org/'
|
102
113
|
headers = { 'X-help' => 'I am trapped in a unit test' }
|
@@ -129,6 +140,10 @@ module BerkeleyLibrary
|
|
129
140
|
result = Requester.head(url1)
|
130
141
|
expect(result).to eq(expected_status)
|
131
142
|
end
|
143
|
+
|
144
|
+
it 'rejects a nil URI' do
|
145
|
+
expect { Requester.head(nil) }.to raise_error(ArgumentError)
|
146
|
+
end
|
132
147
|
end
|
133
148
|
end
|
134
149
|
end
|
@@ -3,6 +3,10 @@ require 'spec_helper'
|
|
3
3
|
module BerkeleyLibrary::Util
|
4
4
|
describe URIs do
|
5
5
|
describe :append do
|
6
|
+
it 'rejects a nil URI' do
|
7
|
+
expect { URIs.append(nil, 'foo') }.to raise_error(ArgumentError)
|
8
|
+
end
|
9
|
+
|
6
10
|
it 'appends paths' do
|
7
11
|
original_uri = URI('https://example.org/foo/bar')
|
8
12
|
new_uri = URIs.append(original_uri, 'qux', 'corge', 'garply')
|
@@ -92,29 +96,67 @@ module BerkeleyLibrary::Util
|
|
92
96
|
expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?baz=qux#grault'))
|
93
97
|
end
|
94
98
|
|
95
|
-
it 'rejects a query string if the original URI already has one' do
|
96
|
-
original_uri = URI('https://example.org/foo/bar?baz=qux')
|
97
|
-
expect { URIs.append(original_uri, '/qux?corge') }.to raise_error(URI::InvalidComponentError)
|
98
|
-
end
|
99
|
-
|
100
99
|
it 'rejects a fragment if the original URI already has one' do
|
101
100
|
original_uri = URI('https://example.org/foo/bar#baz')
|
102
101
|
expect { URIs.append(original_uri, '/qux#corge') }.to raise_error(URI::InvalidComponentError)
|
103
102
|
end
|
104
103
|
|
105
|
-
|
104
|
+
# Per RFC3986, "3.4. Query"
|
105
|
+
it 'allows queries containing ?' do
|
106
|
+
original_uri = URI('https://example.org/foo/bar')
|
107
|
+
expected_url = "#{original_uri}/baz?qux=corge?grault?plugh=xyzzy"
|
108
|
+
expected_uri = URI.parse(expected_url)
|
109
|
+
|
110
|
+
uri1 = URIs.append(original_uri, 'baz?qux=corge', '?grault?plugh=xyzzy')
|
111
|
+
expect(uri1).to eq(expected_uri)
|
112
|
+
|
113
|
+
uri2 = URIs.append(original_uri, 'baz?qux=corge?grault?plugh=xyzzy')
|
114
|
+
expect(uri2).to eq(expected_uri)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Per RFC3986, "3.4. Query"
|
118
|
+
it 'allows queries containing /' do
|
106
119
|
original_uri = URI('https://example.org/foo/bar')
|
107
|
-
|
120
|
+
expected_url = "#{original_uri}/baz?qux=corge/grault/plugh=xyzzy"
|
121
|
+
expected_uri = URI.parse(expected_url)
|
122
|
+
|
123
|
+
uri1 = URIs.append(original_uri, 'baz?qux=corge', '/grault/plugh=xyzzy')
|
124
|
+
expect(uri1).to eq(expected_uri)
|
125
|
+
|
126
|
+
uri2 = URIs.append(original_uri, 'baz?qux=corge/grault/plugh=xyzzy')
|
127
|
+
expect(uri2).to eq(expected_uri)
|
108
128
|
end
|
109
129
|
|
110
|
-
it 'rejects
|
130
|
+
it 'rejects fragments containing #' do
|
111
131
|
original_uri = URI('https://example.org/foo/bar')
|
112
132
|
expect { URIs.append(original_uri, 'baz#qux', 'grault#plugh') }.to raise_error(URI::InvalidComponentError)
|
133
|
+
expect { URIs.append(original_uri, 'baz#qux#plugh') }.to raise_error(URI::InvalidComponentError)
|
113
134
|
end
|
114
135
|
|
115
|
-
|
136
|
+
# Per RFC3986, "3.5. Fragment"
|
137
|
+
it 'allows fragments containing ?' do
|
116
138
|
original_uri = URI('https://example.org/foo/bar')
|
117
|
-
|
139
|
+
expected_url = "#{original_uri}/baz#qux?grault=plugh"
|
140
|
+
expected_uri = URI.parse(expected_url)
|
141
|
+
|
142
|
+
uri1 = URIs.append(original_uri, 'baz#qux', '?grault=plugh')
|
143
|
+
expect(uri1).to eq(expected_uri)
|
144
|
+
|
145
|
+
uri2 = URIs.append(original_uri, 'baz#qux?grault=plugh')
|
146
|
+
expect(uri2).to eq(expected_uri)
|
147
|
+
end
|
148
|
+
|
149
|
+
# Per RFC3986, "3.5. Fragment"
|
150
|
+
it 'allows fragments containing /' do
|
151
|
+
original_uri = URI('https://example.org/foo/bar')
|
152
|
+
expected_url = "#{original_uri}/baz#qux/grault=plugh"
|
153
|
+
expected_uri = URI.parse(expected_url)
|
154
|
+
|
155
|
+
uri1 = URIs.append(original_uri, 'baz#qux', '/grault=plugh')
|
156
|
+
expect(uri1).to eq(expected_uri)
|
157
|
+
|
158
|
+
uri2 = URIs.append(original_uri, 'baz#qux/grault=plugh')
|
159
|
+
expect(uri2).to eq(expected_uri)
|
118
160
|
end
|
119
161
|
|
120
162
|
it 'correctly handles fragments in mid-path-segment' do
|
@@ -147,6 +189,15 @@ module BerkeleyLibrary::Util
|
|
147
189
|
expected_url = "https://example.org/#{encoded_segment}/foo.html"
|
148
190
|
expect(new_uri).to eq(URI(expected_url))
|
149
191
|
end
|
192
|
+
|
193
|
+
it 'accepts path segments with allowed punctuation' do
|
194
|
+
original_uri = URI('https://example.org/')
|
195
|
+
path = 'foo/bar/baz@qux&corge=garply+grault$waldo/fred'
|
196
|
+
new_uri = URIs.append(original_uri, path, 'plugh')
|
197
|
+
expected_url = "#{original_uri}#{path}/plugh"
|
198
|
+
expect(new_uri).to eq(URI(expected_url))
|
199
|
+
end
|
200
|
+
|
150
201
|
end
|
151
202
|
|
152
203
|
describe 'requests' do
|
@@ -266,6 +317,7 @@ module BerkeleyLibrary::Util
|
|
266
317
|
'foo+bar' => 'foo+bar',
|
267
318
|
'qux/quux' => 'qux%2Fquux',
|
268
319
|
'foo bar baz' => 'foo%20bar%20baz',
|
320
|
+
'Corge-Grault.Fred_Waldo~Plugh' => 'Corge-Grault.Fred_Waldo~Plugh',
|
269
321
|
'25%' => '25%25',
|
270
322
|
"\t !\"#$%&'()*+,/:;<=>?@[\\]^`{|}☺" => '%09%20%21%22%23$%25&%27%28%29%2A+%2C%2F:%3B%3C=%3E%3F@%5B%5C%5D%5E%60%7B%7C%7D%E2%98%BA',
|
271
323
|
'精力善用' => '%E7%B2%BE%E5%8A%9B%E5%96%84%E7%94%A8'
|
data/spec/spec_helper.rb
CHANGED
@@ -13,8 +13,8 @@ RSpec.configure do |config|
|
|
13
13
|
config.color = true
|
14
14
|
config.tty = true
|
15
15
|
config.formatter = :documentation
|
16
|
-
config.before
|
17
|
-
config.after
|
16
|
+
config.before { WebMock.disable_net_connect!(allow_localhost: true) }
|
17
|
+
config.after { WebMock.allow_net_connect! }
|
18
18
|
config.mock_with :rspec do |mocks|
|
19
19
|
mocks.verify_partial_doubles = true
|
20
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berkeley_library-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: berkeley_library-logging
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
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
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: ci_reporter_rspec
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,42 +128,42 @@ dependencies:
|
|
142
128
|
requirements:
|
143
129
|
- - '='
|
144
130
|
- !ruby/object:Gem::Version
|
145
|
-
version: '1.
|
131
|
+
version: '1.39'
|
146
132
|
type: :development
|
147
133
|
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
136
|
- - '='
|
151
137
|
- !ruby/object:Gem::Version
|
152
|
-
version: '1.
|
138
|
+
version: '1.39'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: rubocop-rake
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
|
-
- -
|
143
|
+
- - '='
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
145
|
+
version: 0.6.0
|
160
146
|
type: :development
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
|
-
- -
|
150
|
+
- - '='
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
152
|
+
version: 0.6.0
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: rubocop-rspec
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
|
-
- -
|
157
|
+
- - '='
|
172
158
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
159
|
+
version: 2.4.0
|
174
160
|
type: :development
|
175
161
|
prerelease: false
|
176
162
|
version_requirements: !ruby/object:Gem::Requirement
|
177
163
|
requirements:
|
178
|
-
- -
|
164
|
+
- - '='
|
179
165
|
- !ruby/object:Gem::Version
|
180
|
-
version:
|
166
|
+
version: 2.4.0
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: ruby-prof
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +192,6 @@ dependencies:
|
|
206
192
|
- - "~>"
|
207
193
|
- !ruby/object:Gem::Version
|
208
194
|
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
195
|
- !ruby/object:Gem::Dependency
|
224
196
|
name: webmock
|
225
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -271,7 +243,7 @@ files:
|
|
271
243
|
- lib/berkeley_library/util/uris/appender.rb
|
272
244
|
- lib/berkeley_library/util/uris/requester.rb
|
273
245
|
- lib/berkeley_library/util/uris/validator.rb
|
274
|
-
- rakelib
|
246
|
+
- rakelib/.rubocop.yml
|
275
247
|
- rakelib/coverage.rake
|
276
248
|
- rakelib/gem.rake
|
277
249
|
- rakelib/rubocop.rake
|
@@ -290,7 +262,8 @@ files:
|
|
290
262
|
homepage: https://github.com/BerkeleyLibrary/util
|
291
263
|
licenses:
|
292
264
|
- MIT
|
293
|
-
metadata:
|
265
|
+
metadata:
|
266
|
+
rubygems_mfa_required: 'true'
|
294
267
|
post_install_message:
|
295
268
|
rdoc_options: []
|
296
269
|
require_paths:
|
@@ -310,15 +283,4 @@ rubygems_version: 3.1.6
|
|
310
283
|
signing_key:
|
311
284
|
specification_version: 4
|
312
285
|
summary: Miscellaneous Ruby utilities for the UC Berkeley Library
|
313
|
-
test_files:
|
314
|
-
- spec/.rubocop.yml
|
315
|
-
- spec/berkeley_library/util/arrays_spec.rb
|
316
|
-
- spec/berkeley_library/util/files_spec.rb
|
317
|
-
- spec/berkeley_library/util/paths_spec.rb
|
318
|
-
- spec/berkeley_library/util/stringios_spec.rb
|
319
|
-
- spec/berkeley_library/util/strings_spec.rb
|
320
|
-
- spec/berkeley_library/util/times_spec.rb
|
321
|
-
- spec/berkeley_library/util/uris/requester_spec.rb
|
322
|
-
- spec/berkeley_library/util/uris/validator_spec.rb
|
323
|
-
- spec/berkeley_library/util/uris_spec.rb
|
324
|
-
- spec/spec_helper.rb
|
286
|
+
test_files: []
|
data/rakelib/bundle.rake
DELETED