berkeley_library-util 0.1.5 → 0.1.6
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/.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