opensrs 0.3.6 → 0.4.2
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 +5 -5
- data/.github/workflows/rubocop-analysis.yml +43 -0
- data/.github/workflows/ruby.yml +28 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +131 -0
- data/Gemfile.lock +71 -40
- data/README.md +11 -15
- data/Rakefile +1 -1
- data/SECURITY.md +12 -0
- data/bin/console +4 -5
- data/lib/opensrs/response.rb +11 -7
- data/lib/opensrs/sanitizable_string.rb +21 -0
- data/lib/opensrs/server.rb +34 -23
- data/lib/opensrs/version.rb +1 -1
- data/lib/opensrs/xml_processor/libxml.rb +30 -16
- data/lib/opensrs/xml_processor/nokogiri.rb +28 -16
- data/lib/opensrs/xml_processor.rb +14 -11
- data/lib/opensrs.rb +6 -5
- data/opensrs.gemspec +23 -22
- metadata +77 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7bf3d8a1a7fc99157bf196ab56c8d34832ef523160a9d092a3db0e5b17de2e7f
|
4
|
+
data.tar.gz: dc587d48682875b59af971baf6b5552437f5da5fcffea5030985d848c7986457
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b00c5ad6a516c5f00fd292e81b437abb496c47cfd5b690cd44e6113bf1ac613bd348561caafb420bb94891e4b2bf319b1e947592c780c23c0e97147e4dfa1fa
|
7
|
+
data.tar.gz: 6ae7ca1eb7b675d079015b37b6efc79740ba98dabce8aa60a6f79fe610ca3f30bb75014ee54b0edb4ee6cc97c9050b8eca1ccf82acb3d82b6952f00f90f29dbe
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# pulled from repo
|
2
|
+
name: "Rubocop"
|
3
|
+
|
4
|
+
on:
|
5
|
+
push:
|
6
|
+
branches: [ master, rubocop ]
|
7
|
+
pull_request:
|
8
|
+
# The branches below must be a subset of the branches above
|
9
|
+
branches: [ master, rubocop ]
|
10
|
+
schedule:
|
11
|
+
- cron: '37 10 * * 2'
|
12
|
+
|
13
|
+
jobs:
|
14
|
+
rubocop:
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
strategy:
|
17
|
+
fail-fast: false
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- name: Checkout repository
|
21
|
+
uses: actions/checkout@v2
|
22
|
+
|
23
|
+
# If running on a self-hosted runner, check it meets the requirements
|
24
|
+
# listed at https://github.com/ruby/setup-ruby#using-self-hosted-runners
|
25
|
+
- name: Set up Ruby
|
26
|
+
uses: ruby/setup-ruby@v1
|
27
|
+
with:
|
28
|
+
ruby-version: 2.6
|
29
|
+
|
30
|
+
- name: Install dependencies
|
31
|
+
run: bundle install
|
32
|
+
|
33
|
+
- name: Rubocop run
|
34
|
+
run: |
|
35
|
+
bash -c "
|
36
|
+
bundle exec rubocop --require code_scanning --format CodeScanning::SarifFormatter -o rubocop.sarif
|
37
|
+
[[ $? -ne 2 ]]
|
38
|
+
"
|
39
|
+
|
40
|
+
- name: Upload Sarif output
|
41
|
+
uses: github/codeql-action/upload-sarif@v1
|
42
|
+
with:
|
43
|
+
sarif_file: rubocop.sarif
|
@@ -0,0 +1,28 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: push
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
name: "Rspec (on Ruby ${{ matrix.ruby }})"
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
strategy:
|
10
|
+
fail-fast: false
|
11
|
+
matrix:
|
12
|
+
ruby: ['2.5', '2.6', '2.7', '3.0', '3.1', 'head']
|
13
|
+
|
14
|
+
steps:
|
15
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
bundler-cache: true
|
19
|
+
ruby-version: ${{ matrix.ruby }}
|
20
|
+
|
21
|
+
- name: Checkout repository
|
22
|
+
uses: actions/checkout@v2
|
23
|
+
|
24
|
+
- name: Install dependencies
|
25
|
+
run: gem install bundler && bundle install
|
26
|
+
|
27
|
+
- name: Run Rspec
|
28
|
+
run: bundle exec rspec spec
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
TargetRubyVersion: 2.5
|
5
|
+
SuggestExtensions: false
|
6
|
+
|
7
|
+
Style/FrozenStringLiteralComment:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
RSpec/InstanceVariable:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Metrics/BlockLength:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
RSpec/FilePath:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Layout/LineLength:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
RSpec/MultipleExpectations:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
RSpec/ExampleLength:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
RSpec/NestedGroups:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
RSpec/MultipleMemoizedHelpers:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
RSpec/MessageSpies:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
RSpec/StubbedMock:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
RSpec/VerifiedDoubles:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Metrics/MethodLength:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
Metrics/AbcSize:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Style/ClassVars:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Gemspec/DateAssignment: # (new in 1.10)
|
53
|
+
Enabled: true
|
54
|
+
Layout/LineEndStringConcatenationIndentation: # (new in 1.18)
|
55
|
+
Enabled: true
|
56
|
+
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
57
|
+
Enabled: true
|
58
|
+
Lint/AmbiguousAssignment: # (new in 1.7)
|
59
|
+
Enabled: true
|
60
|
+
Lint/AmbiguousRange: # (new in 1.19)
|
61
|
+
Enabled: true
|
62
|
+
Lint/DeprecatedConstants: # (new in 1.8)
|
63
|
+
Enabled: true
|
64
|
+
Lint/DuplicateBranch: # (new in 1.3)
|
65
|
+
Enabled: true
|
66
|
+
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
|
67
|
+
Enabled: true
|
68
|
+
Lint/EmptyBlock: # (new in 1.1)
|
69
|
+
Enabled: true
|
70
|
+
Lint/EmptyClass: # (new in 1.3)
|
71
|
+
Enabled: true
|
72
|
+
Lint/EmptyInPattern: # (new in 1.16)
|
73
|
+
Enabled: true
|
74
|
+
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
|
75
|
+
Enabled: true
|
76
|
+
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
|
77
|
+
Enabled: true
|
78
|
+
Lint/NumberedParameterAssignment: # (new in 1.9)
|
79
|
+
Enabled: true
|
80
|
+
Lint/OrAssignmentToConstant: # (new in 1.9)
|
81
|
+
Enabled: true
|
82
|
+
Lint/RedundantDirGlobSort: # (new in 1.8)
|
83
|
+
Enabled: true
|
84
|
+
Lint/SymbolConversion: # (new in 1.9)
|
85
|
+
Enabled: true
|
86
|
+
Lint/ToEnumArguments: # (new in 1.1)
|
87
|
+
Enabled: true
|
88
|
+
Lint/TripleQuotes: # (new in 1.9)
|
89
|
+
Enabled: true
|
90
|
+
Lint/UnexpectedBlockArity: # (new in 1.5)
|
91
|
+
Enabled: true
|
92
|
+
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
|
93
|
+
Enabled: true
|
94
|
+
Naming/InclusiveLanguage: # (new in 1.18)
|
95
|
+
Enabled: true
|
96
|
+
Style/ArgumentsForwarding: # (new in 1.1)
|
97
|
+
Enabled: true
|
98
|
+
Style/CollectionCompact: # (new in 1.2)
|
99
|
+
Enabled: true
|
100
|
+
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
|
101
|
+
Enabled: true
|
102
|
+
Style/EndlessMethod: # (new in 1.8)
|
103
|
+
Enabled: true
|
104
|
+
Style/HashConversion: # (new in 1.10)
|
105
|
+
Enabled: true
|
106
|
+
Style/HashExcept: # (new in 1.7)
|
107
|
+
Enabled: true
|
108
|
+
Style/IfWithBooleanLiteralBranches: # (new in 1.9)
|
109
|
+
Enabled: true
|
110
|
+
Style/InPatternThen: # (new in 1.16)
|
111
|
+
Enabled: true
|
112
|
+
Style/MultilineInPatternThen: # (new in 1.16)
|
113
|
+
Enabled: true
|
114
|
+
Style/NegatedIfElseCondition: # (new in 1.2)
|
115
|
+
Enabled: true
|
116
|
+
Style/NilLambda: # (new in 1.3)
|
117
|
+
Enabled: true
|
118
|
+
Style/QuotedSymbols: # (new in 1.16)
|
119
|
+
Enabled: true
|
120
|
+
Style/RedundantArgument: # (new in 1.4)
|
121
|
+
Enabled: true
|
122
|
+
Style/RedundantSelfAssignmentBranch: # (new in 1.19)
|
123
|
+
Enabled: true
|
124
|
+
Style/StringChars: # (new in 1.12)
|
125
|
+
Enabled: true
|
126
|
+
Style/SwapValues: # (new in 1.1)
|
127
|
+
Enabled: true
|
128
|
+
RSpec/IdenticalEqualityAssertion: # (new in 2.4)
|
129
|
+
Enabled: true
|
130
|
+
RSpec/Rails/AvoidSetupHook: # (new in 2.4)
|
131
|
+
Enabled: true
|
data/Gemfile.lock
CHANGED
@@ -1,65 +1,96 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
opensrs (0.
|
5
|
-
libxml-ruby (~> 2)
|
4
|
+
opensrs (0.4.1)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
9
8
|
specs:
|
10
|
-
activesupport (4.2.
|
9
|
+
activesupport (4.2.11.3)
|
11
10
|
i18n (~> 0.7)
|
12
|
-
json (~> 1.7, >= 1.7.7)
|
13
11
|
minitest (~> 5.1)
|
14
12
|
thread_safe (~> 0.3, >= 0.3.4)
|
15
13
|
tzinfo (~> 1.1)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
14
|
+
ast (2.4.2)
|
15
|
+
code-scanning-rubocop (0.6.1)
|
16
|
+
rubocop (~> 1.0)
|
17
|
+
coderay (1.1.3)
|
18
|
+
concurrent-ruby (1.1.10)
|
19
|
+
diff-lcs (1.5.0)
|
20
|
+
i18n (0.9.5)
|
21
|
+
concurrent-ruby (~> 1.0)
|
22
|
+
libxml-ruby (3.2.2)
|
23
|
+
method_source (1.0.0)
|
24
|
+
mini_portile2 (2.8.0)
|
25
|
+
minitest (5.15.0)
|
26
|
+
nokogiri (1.13.6)
|
27
|
+
mini_portile2 (~> 2.8.0)
|
28
|
+
racc (~> 1.4)
|
29
|
+
parallel (1.22.1)
|
30
|
+
parser (3.1.2.0)
|
31
|
+
ast (~> 2.4.1)
|
32
|
+
pry (0.14.1)
|
33
|
+
coderay (~> 1.1)
|
34
|
+
method_source (~> 1.0)
|
35
|
+
racc (1.6.0)
|
36
|
+
rainbow (3.1.1)
|
37
|
+
rake (13.0.6)
|
38
|
+
regexp_parser (2.4.0)
|
39
|
+
rexml (3.2.5)
|
40
|
+
rspec (3.11.0)
|
41
|
+
rspec-core (~> 3.11.0)
|
42
|
+
rspec-expectations (~> 3.11.0)
|
43
|
+
rspec-mocks (~> 3.11.0)
|
44
|
+
rspec-core (3.11.0)
|
45
|
+
rspec-support (~> 3.11.0)
|
46
|
+
rspec-expectations (3.11.0)
|
38
47
|
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
-
rspec-support (~> 3.
|
40
|
-
rspec-mocks (3.
|
48
|
+
rspec-support (~> 3.11.0)
|
49
|
+
rspec-mocks (3.11.1)
|
41
50
|
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
-
rspec-support (~> 3.
|
43
|
-
rspec-support (3.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
rspec-support (~> 3.11.0)
|
52
|
+
rspec-support (3.11.0)
|
53
|
+
rubocop (1.29.0)
|
54
|
+
parallel (~> 1.10)
|
55
|
+
parser (>= 3.1.0.0)
|
56
|
+
rainbow (>= 2.2.2, < 4.0)
|
57
|
+
regexp_parser (>= 1.8, < 3.0)
|
58
|
+
rexml (>= 3.2.5, < 4.0)
|
59
|
+
rubocop-ast (>= 1.17.0, < 2.0)
|
60
|
+
ruby-progressbar (~> 1.7)
|
61
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
62
|
+
rubocop-ast (1.17.0)
|
63
|
+
parser (>= 3.1.1.0)
|
64
|
+
rubocop-rspec (2.10.0)
|
65
|
+
rubocop (~> 1.19)
|
66
|
+
ruby-progressbar (1.11.0)
|
67
|
+
shoulda (4.0.0)
|
68
|
+
shoulda-context (~> 2.0)
|
69
|
+
shoulda-matchers (~> 4.0)
|
70
|
+
shoulda-context (2.0.0)
|
71
|
+
shoulda-matchers (4.5.1)
|
72
|
+
activesupport (>= 4.2.0)
|
73
|
+
thread_safe (0.3.6)
|
74
|
+
tzinfo (1.2.9)
|
53
75
|
thread_safe (~> 0.1)
|
76
|
+
unicode-display_width (2.1.0)
|
54
77
|
|
55
78
|
PLATFORMS
|
56
79
|
ruby
|
57
80
|
|
58
81
|
DEPENDENCIES
|
82
|
+
activesupport (~> 4.2.2)
|
59
83
|
bundler
|
60
|
-
|
84
|
+
code-scanning-rubocop (~> 0.5)
|
85
|
+
libxml-ruby (~> 3)
|
86
|
+
nokogiri (~> 1.13.4)
|
61
87
|
opensrs!
|
62
88
|
pry
|
63
89
|
rake
|
64
90
|
rspec
|
91
|
+
rubocop (~> 1)
|
92
|
+
rubocop-rspec
|
65
93
|
shoulda
|
94
|
+
|
95
|
+
BUNDLED WITH
|
96
|
+
2.3.13
|
data/README.md
CHANGED
@@ -1,17 +1,13 @@
|
|
1
1
|
# OpenSRS
|
2
2
|
|
3
|
-
[](https://gitter.im/voxxit/opensrs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
|
-
|
5
|
-
[](https://travis-ci.org/voxxit/opensrs)
|
6
|
-
[](https://codeclimate.com/github/voxxit/opensrs)
|
7
3
|
[](https://coveralls.io/r/voxxit/opensrs)
|
8
4
|
|
9
|
-
This
|
5
|
+
This unofficial OpenSRS gem provides basic support to connect to and utilize the [OpenSRS API.](http://www.opensrs.com/site/resources/documentation/api) This library has been well-tested in high-performance production
|
10
6
|
environments.
|
11
7
|
|
12
8
|
### Requirements
|
13
9
|
|
14
|
-
* Ruby **>=
|
10
|
+
* Ruby **>= 2.5**
|
15
11
|
|
16
12
|
### Installation
|
17
13
|
|
@@ -25,7 +21,9 @@ You can then include it in a Ruby project, like so:
|
|
25
21
|
|
26
22
|
For Rails 3.x and above, add it to the `Gemfile`:
|
27
23
|
|
28
|
-
gem
|
24
|
+
gem 'opensrs'
|
25
|
+
gem 'nokogiri' # if you want to use nokogiri as the XML parser
|
26
|
+
gem 'libxml-ruby' # if you want to use libxml as the XML parser
|
29
27
|
|
30
28
|
### Usage
|
31
29
|
|
@@ -40,6 +38,10 @@ Currently, the library supports LibXML and Nokogiri as XML parsers. By default,
|
|
40
38
|
|
41
39
|
OpenSRS::Server.xml_processor = :nokogiri
|
42
40
|
|
41
|
+
or
|
42
|
+
|
43
|
+
OpenSRS::Server.xml_processor = :libxml
|
44
|
+
|
43
45
|
To connect, instantiate a new <tt>OpenSRS::Server</tt> object:
|
44
46
|
|
45
47
|
server = OpenSRS::Server.new(
|
@@ -95,7 +97,6 @@ Responses from OpenSRS are returned in an OpenSRS::Response object, which gives
|
|
95
97
|
Method | Description
|
96
98
|
---|---
|
97
99
|
`response.response` | This gives you the response in a Hash form, which is highly accessible to most other actions in your application.
|
98
|
-
`response.response` | This gives you the response in a Hash form, which is highly accessible to most other actions in your application.
|
99
100
|
`response.errors` | If there are errors which come back from OpenSRS, they are returned here. If not, it returns nil.
|
100
101
|
`response.success?` | Returns true if the response was labeled as successful. If not, it returns false.
|
101
102
|
`response.request_xml` | Returns raw request XML.
|
@@ -115,15 +116,10 @@ If you have any bugs or feature requests for this gem, feel free to [open an iss
|
|
115
116
|
|
116
117
|
### Contributors (in order of appearance)
|
117
118
|
|
118
|
-
|
119
|
-
* Glenn Roberts
|
119
|
+
See ["Contributors"](https://github.com/voxxit/opensrs/graphs/contributors) section of GitHub Insights.
|
120
120
|
|
121
121
|
### Copyright
|
122
122
|
|
123
|
-
Copyright (c) 2010-
|
123
|
+
Copyright (c) 2010-2022 Joshua Delsman.
|
124
124
|
|
125
125
|
Distributed under the MIT license. See `LICENSE` for details.
|
126
|
-
|
127
|
-
|
128
|
-
[](https://bitdeli.com/free "Bitdeli Badge")
|
129
|
-
|
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
data/SECURITY.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Security Policy
|
2
|
+
|
3
|
+
## Supported Versions
|
4
|
+
|
5
|
+
| Version | Supported |
|
6
|
+
| ------- | ------------------ |
|
7
|
+
| 0.4.x | :white_check_mark: |
|
8
|
+
| < 0.4.x | :x: |
|
9
|
+
|
10
|
+
## Reporting a Vulnerability
|
11
|
+
|
12
|
+
Please encyrpt your message to me at https://keybase.io/encrypt#jdelsman, then send to j@srv.im. Since this is an unsupported open-source project, I will get to it as quickly as I can.
|
data/bin/console
CHANGED
data/lib/opensrs/response.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
module OpenSRS
|
2
|
+
# Response
|
2
3
|
class Response
|
3
4
|
attr_reader :request_xml, :response_xml
|
4
5
|
attr_accessor :response, :success
|
@@ -13,19 +14,22 @@ module OpenSRS
|
|
13
14
|
# We need to return the error message unless the
|
14
15
|
# response is successful.
|
15
16
|
def errors
|
16
|
-
|
17
|
-
msg = @response["response_text"]
|
18
|
-
code = @response["response_code"]
|
17
|
+
return if success?
|
19
18
|
|
20
|
-
|
21
|
-
|
19
|
+
msg = @response['response_text']
|
20
|
+
code = @response['response_code']
|
21
|
+
|
22
|
+
msg && code ? "#{msg} (Code #{code})" : 'Unknown error'
|
22
23
|
end
|
23
24
|
|
24
25
|
# If 'is_success' is returned, the API is letting us know that they
|
25
26
|
# will explicitly tell us whether something has succeeded or not.
|
26
|
-
#
|
27
|
+
#
|
28
|
+
# Otherwise, just assume it failed.
|
27
29
|
def success?
|
28
|
-
|
30
|
+
return false unless @response['is_success']
|
31
|
+
|
32
|
+
@response['is_success'] == '1'
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
3
|
+
module OpenSRS
|
4
|
+
# SanitizableString
|
5
|
+
class SanitizableString < SimpleDelegator
|
6
|
+
@enable_sanitization = false
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_accessor :enable_sanitization
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(original_string, sanitized_string)
|
13
|
+
super(original_string)
|
14
|
+
@sanitized_string = sanitized_string
|
15
|
+
end
|
16
|
+
|
17
|
+
def sanitized
|
18
|
+
self.class.enable_sanitization ? @sanitized_string : self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/opensrs/server.rb
CHANGED
@@ -1,45 +1,53 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'uri'
|
2
|
+
require 'net/https'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'openssl'
|
5
5
|
|
6
6
|
module OpenSRS
|
7
7
|
class OpenSRSError < StandardError; end
|
8
8
|
|
9
9
|
class BadResponse < OpenSRSError; end
|
10
|
+
|
10
11
|
class ConnectionError < OpenSRSError; end
|
12
|
+
|
11
13
|
class TimeoutError < ConnectionError; end
|
12
14
|
|
15
|
+
# Server
|
13
16
|
class Server
|
14
|
-
attr_accessor :server, :username, :password, :key, :timeout, :open_timeout, :logger
|
17
|
+
attr_accessor :server, :username, :password, :key, :timeout, :open_timeout, :logger, :proxy
|
15
18
|
|
16
19
|
def initialize(options = {})
|
17
|
-
@server = URI.parse(options[:server] ||
|
20
|
+
@server = URI.parse(options[:server] || 'https://rr-n1-tor.opensrs.net:55443/')
|
18
21
|
@username = options[:username]
|
19
22
|
@password = options[:password]
|
20
23
|
@key = options[:key]
|
21
24
|
@timeout = options[:timeout]
|
22
25
|
@open_timeout = options[:open_timeout]
|
23
26
|
@logger = options[:logger]
|
27
|
+
@proxy = URI.parse(options[:proxy]) if options[:proxy]
|
28
|
+
@sanitize_request = options[:sanitize_request]
|
29
|
+
|
30
|
+
OpenSRS::SanitizableString.enable_sanitization = @sanitize_request
|
24
31
|
end
|
25
32
|
|
26
33
|
def call(data = {})
|
27
|
-
xml = xml_processor.build({ :
|
28
|
-
log('Request', xml, data)
|
34
|
+
xml = xml_processor.build({ protocol: 'XCP' }.merge!(data))
|
35
|
+
log('Request', xml.sanitized, data)
|
29
36
|
|
30
37
|
begin
|
31
38
|
response = http.post(server_path, xml, headers(xml))
|
32
39
|
log('Response', response.body, data)
|
33
40
|
rescue Net::HTTPBadResponse
|
34
|
-
raise OpenSRS::BadResponse,
|
41
|
+
raise OpenSRS::BadResponse,
|
42
|
+
'Received a bad response from OpenSRS. Please check that your IP address is added to the whitelist, and try again.'
|
35
43
|
end
|
36
44
|
|
37
45
|
parsed_response = xml_processor.parse(response.body)
|
38
|
-
|
39
|
-
rescue Timeout::Error =>
|
40
|
-
raise OpenSRS::TimeoutError,
|
41
|
-
rescue Errno::ECONNRESET, Errno::ECONNREFUSED =>
|
42
|
-
raise OpenSRS::ConnectionError,
|
46
|
+
OpenSRS::Response.new(parsed_response, xml.sanitized, response.body)
|
47
|
+
rescue Timeout::Error => e
|
48
|
+
raise OpenSRS::TimeoutError, e
|
49
|
+
rescue Errno::ECONNRESET, Errno::ECONNREFUSED => e
|
50
|
+
raise OpenSRS::ConnectionError, e
|
43
51
|
end
|
44
52
|
|
45
53
|
def xml_processor
|
@@ -48,19 +56,17 @@ module OpenSRS
|
|
48
56
|
|
49
57
|
def self.xml_processor=(name)
|
50
58
|
require "opensrs/xml_processor/#{name.to_s.downcase}"
|
51
|
-
@@xml_processor = OpenSRS::XmlProcessor.const_get(
|
59
|
+
@@xml_processor = OpenSRS::XmlProcessor.const_get(name.to_s.capitalize.to_s)
|
52
60
|
end
|
53
61
|
|
54
|
-
OpenSRS::Server.xml_processor = :libxml
|
55
|
-
|
56
62
|
private
|
57
63
|
|
58
64
|
def headers(request)
|
59
65
|
{
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
66
|
+
'Content-Length' => request.length.to_s,
|
67
|
+
'Content-Type' => 'text/xml',
|
68
|
+
'X-Username' => username,
|
69
|
+
'X-Signature' => signature(request)
|
64
70
|
}
|
65
71
|
end
|
66
72
|
|
@@ -69,8 +75,13 @@ module OpenSRS
|
|
69
75
|
end
|
70
76
|
|
71
77
|
def http
|
72
|
-
http =
|
73
|
-
|
78
|
+
http = if @proxy
|
79
|
+
Net::HTTP.new(server.host, server.port, @proxy.host, @proxy.port, @proxy.user, @proxy.password)
|
80
|
+
else
|
81
|
+
Net::HTTP.new(server.host, server.port)
|
82
|
+
end
|
83
|
+
|
84
|
+
http.use_ssl = (server.scheme == 'https')
|
74
85
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
75
86
|
http.read_timeout = http.open_timeout = @timeout if @timeout
|
76
87
|
http.open_timeout = @open_timeout if @open_timeout
|
data/lib/opensrs/version.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
begin
|
2
2
|
require 'libxml'
|
3
3
|
rescue LoadError => e
|
4
|
-
|
4
|
+
warn 'Cannot find `libxml` gem. Please install it before using it as the XML processor'
|
5
5
|
raise e
|
6
6
|
end
|
7
7
|
|
8
8
|
module OpenSRS
|
9
9
|
class XmlProcessor
|
10
|
+
# Libxml
|
10
11
|
class Libxml < OpenSRS::XmlProcessor
|
11
12
|
include ::LibXML::XML
|
12
13
|
|
@@ -14,23 +15,35 @@ module OpenSRS
|
|
14
15
|
# go ahead and build the entire XML document to send to OpenSRS.
|
15
16
|
def self.build(data)
|
16
17
|
xml = Document.new
|
17
|
-
xml.root = envelope = Node.new(
|
18
|
+
xml.root = envelope = Node.new('OPS_envelope')
|
18
19
|
|
19
|
-
envelope << header = Node.new(
|
20
|
-
envelope << body = Node.new(
|
21
|
-
header << Node.new(
|
22
|
-
body << data_block = Node.new(
|
20
|
+
envelope << header = Node.new('header')
|
21
|
+
envelope << body = Node.new('body')
|
22
|
+
header << Node.new('version', '0.9')
|
23
|
+
body << data_block = Node.new('data_block')
|
23
24
|
|
24
25
|
data_block << encode_data(data, data_block)
|
25
26
|
|
26
|
-
|
27
|
+
OpenSRS::SanitizableString.new(xml.to_s, sanitize(xml).to_s)
|
27
28
|
end
|
28
29
|
|
29
|
-
|
30
|
+
def self.sanitize(doc)
|
31
|
+
# Before changing the iteration through the nodes, read:
|
32
|
+
# https://www.rubydoc.info/gems/libxml-ruby/LibXML/XML/Document#find-instance_method
|
33
|
+
|
34
|
+
username_nodes = doc.find("//item[@key='reg_username']")
|
35
|
+
username_nodes.each { |node| node.content = 'FILTERED' }
|
36
|
+
|
37
|
+
password_nodes = doc.find("//item[@key='reg_password']")
|
38
|
+
password_nodes.each { |node| node.content = 'FILTERED' }
|
39
|
+
|
40
|
+
doc
|
41
|
+
end
|
42
|
+
private_class_method :sanitize
|
30
43
|
|
31
44
|
def self.data_block_element(response)
|
32
45
|
doc = Parser.string(response).parse
|
33
|
-
|
46
|
+
doc.find('//OPS_envelope/body/data_block/*')
|
34
47
|
end
|
35
48
|
|
36
49
|
def self.decode_dt_array_data(element)
|
@@ -38,10 +51,11 @@ module OpenSRS
|
|
38
51
|
|
39
52
|
element.children.each do |item|
|
40
53
|
next if item.empty?
|
41
|
-
|
54
|
+
|
55
|
+
dt_array[item.attributes['key'].to_i] = decode_data(item)
|
42
56
|
end
|
43
57
|
|
44
|
-
|
58
|
+
dt_array
|
45
59
|
end
|
46
60
|
|
47
61
|
def self.decode_dt_assoc_data(element)
|
@@ -49,19 +63,19 @@ module OpenSRS
|
|
49
63
|
|
50
64
|
element.children.each do |item|
|
51
65
|
next if item.content.strip.empty?
|
52
|
-
|
66
|
+
|
67
|
+
dt_assoc[item.attributes['key']] = decode_data(item)
|
53
68
|
end
|
54
69
|
|
55
|
-
|
70
|
+
dt_assoc
|
56
71
|
end
|
57
72
|
|
58
73
|
# Accepts two parameters but uses only one; to keep the interface same as other xml parser classes
|
59
74
|
# Is that a side effect of Template pattern?
|
60
75
|
#
|
61
|
-
def self.new_element(element_name,
|
62
|
-
|
76
|
+
def self.new_element(element_name, _container)
|
77
|
+
Node.new(element_name.to_s)
|
63
78
|
end
|
64
|
-
|
65
79
|
end
|
66
80
|
end
|
67
81
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
begin
|
2
2
|
require 'nokogiri'
|
3
3
|
rescue LoadError => e
|
4
|
-
|
4
|
+
warn 'Cannot find `nokogiri` gem. Please install it before using it as the XML processor'
|
5
5
|
raise e
|
6
6
|
end
|
7
7
|
|
8
8
|
module OpenSRS
|
9
9
|
class XmlProcessor
|
10
|
+
# Nokogiri
|
10
11
|
class Nokogiri < OpenSRS::XmlProcessor
|
11
|
-
|
12
12
|
def self.build(data)
|
13
13
|
builder = ::Nokogiri::XML::Builder.new
|
14
14
|
|
15
|
-
envelope = ::Nokogiri::XML::Node.new(
|
16
|
-
header = ::Nokogiri::XML::Node.new(
|
17
|
-
version = ::Nokogiri::XML::Node.new(
|
18
|
-
body = ::Nokogiri::XML::Node.new(
|
19
|
-
data_block = ::Nokogiri::XML::Node.new(
|
15
|
+
envelope = ::Nokogiri::XML::Node.new('OPS_envelope', builder.doc)
|
16
|
+
header = ::Nokogiri::XML::Node.new('header', builder.doc)
|
17
|
+
version = ::Nokogiri::XML::Node.new('version', builder.doc)
|
18
|
+
body = ::Nokogiri::XML::Node.new('body', builder.doc)
|
19
|
+
data_block = ::Nokogiri::XML::Node.new('data_block', builder.doc)
|
20
20
|
other_data = encode_data(data, builder.doc)
|
21
21
|
version << '0.9'
|
22
22
|
header << version
|
@@ -25,14 +25,25 @@ module OpenSRS
|
|
25
25
|
data_block << other_data
|
26
26
|
body << data_block
|
27
27
|
envelope << body
|
28
|
-
|
28
|
+
|
29
|
+
OpenSRS::SanitizableString.new(builder.to_xml, sanitize(builder.to_xml))
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
|
+
def self.sanitize(xml_string)
|
33
|
+
doc = ::Nokogiri::XML(xml_string)
|
34
|
+
doc.xpath("//item[@key='reg_username']").each do |node|
|
35
|
+
node.content = 'FILTERED'
|
36
|
+
end
|
37
|
+
doc.xpath("//item[@key='reg_password']").each do |node|
|
38
|
+
node.content = 'FILTERED'
|
39
|
+
end
|
40
|
+
doc.to_xml
|
41
|
+
end
|
42
|
+
private_class_method :sanitize
|
32
43
|
|
33
44
|
def self.data_block_element(response)
|
34
45
|
doc = ::Nokogiri::XML(response)
|
35
|
-
|
46
|
+
doc.xpath('//OPS_envelope/body/data_block/*')
|
36
47
|
end
|
37
48
|
|
38
49
|
def self.decode_dt_array_data(element)
|
@@ -40,10 +51,11 @@ module OpenSRS
|
|
40
51
|
|
41
52
|
element.children.each do |item|
|
42
53
|
next if item.content.strip.empty?
|
43
|
-
|
54
|
+
|
55
|
+
dt_array[item.attributes['key'].value.to_i] = decode_data(item.children)
|
44
56
|
end
|
45
57
|
|
46
|
-
|
58
|
+
dt_array
|
47
59
|
end
|
48
60
|
|
49
61
|
def self.decode_dt_assoc_data(element)
|
@@ -51,16 +63,16 @@ module OpenSRS
|
|
51
63
|
|
52
64
|
element.children.each do |item|
|
53
65
|
next if item.content.strip.empty?
|
54
|
-
|
66
|
+
|
67
|
+
dt_assoc[item.attributes['key'].value] = decode_data(item.children)
|
55
68
|
end
|
56
69
|
|
57
|
-
|
70
|
+
dt_assoc
|
58
71
|
end
|
59
72
|
|
60
73
|
def self.new_element(element_name, container)
|
61
|
-
|
74
|
+
::Nokogiri::XML::Node.new(element_name.to_s, container.document)
|
62
75
|
end
|
63
|
-
|
64
76
|
end
|
65
77
|
end
|
66
78
|
end
|
@@ -1,18 +1,16 @@
|
|
1
1
|
module OpenSRS
|
2
|
+
# XmlProcessor
|
2
3
|
class XmlProcessor
|
3
|
-
|
4
4
|
# Parses the main data block from OpenSRS and discards
|
5
5
|
# the rest of the response.
|
6
6
|
def self.parse(response)
|
7
7
|
data_block = data_block_element(response)
|
8
8
|
|
9
|
-
raise ArgumentError
|
9
|
+
raise ArgumentError, 'No data found in document' unless data_block
|
10
10
|
|
11
|
-
|
11
|
+
decode_data(data_block)
|
12
12
|
end
|
13
13
|
|
14
|
-
protected
|
15
|
-
|
16
14
|
# Encodes individual elements, and their child elements, for the root XML document.
|
17
15
|
def self.encode_data(data, container = nil)
|
18
16
|
case data
|
@@ -42,11 +40,16 @@ module OpenSRS
|
|
42
40
|
# if hash, item will be array of the key & value
|
43
41
|
data.each_with_index do |item, index|
|
44
42
|
item_node = new_element(:item, container)
|
45
|
-
item_node[
|
43
|
+
item_node['key'] = item.is_a?(Array) ? item[0].to_s : index.to_s
|
46
44
|
|
47
45
|
value = item.is_a?(Array) ? item[1] : item
|
48
46
|
|
49
|
-
|
47
|
+
encoded_data = encode_data(value, item_node)
|
48
|
+
if encoded_data.is_a?(String)
|
49
|
+
item_node.content = encoded_data
|
50
|
+
else
|
51
|
+
item_node << encoded_data
|
52
|
+
end
|
50
53
|
element << item_node
|
51
54
|
end
|
52
55
|
|
@@ -58,16 +61,16 @@ module OpenSRS
|
|
58
61
|
def self.decode_data(data)
|
59
62
|
data.each do |element|
|
60
63
|
case element.name
|
61
|
-
when
|
64
|
+
when 'dt_array'
|
62
65
|
return decode_dt_array_data(element)
|
63
|
-
when
|
66
|
+
when 'dt_assoc'
|
64
67
|
return decode_dt_assoc_data(element)
|
65
|
-
when
|
68
|
+
when 'text', 'item', 'dt_scalar'
|
66
69
|
next if element.content.strip.empty?
|
70
|
+
|
67
71
|
return element.content.strip
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
71
|
-
|
72
75
|
end
|
73
76
|
end
|
data/lib/opensrs.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require 'opensrs/xml_processor'
|
2
|
+
require 'opensrs/server'
|
3
|
+
require 'opensrs/response'
|
4
|
+
require 'opensrs/sanitizable_string'
|
5
|
+
require 'opensrs/version'
|
6
6
|
|
7
|
+
# OpenSRS
|
7
8
|
module OpenSRS
|
8
9
|
end
|
data/opensrs.gemspec
CHANGED
@@ -1,31 +1,32 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'opensrs/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
|
8
|
-
spec.name = "opensrs"
|
6
|
+
spec.name = 'opensrs'
|
9
7
|
spec.version = OpenSRS::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
8
|
+
spec.authors = ['Joshua Delsman']
|
9
|
+
spec.email = ['j@srv.im']
|
10
|
+
spec.summary = 'OpenSRS API for Ruby'
|
11
|
+
spec.description = 'Provides support to utilize the OpenSRS API with Ruby.'
|
12
|
+
spec.homepage = 'https://github.com/voxxit/opensrs'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
spec.required_ruby_version = '>= 2.5'
|
16
15
|
|
17
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
17
|
+
spec.bindir = 'exe'
|
19
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
21
|
-
|
22
|
-
spec.add_runtime_dependency "libxml-ruby", "~> 2"
|
23
|
-
|
24
|
-
spec.add_development_dependency "bundler"
|
25
|
-
spec.add_development_dependency "rake"
|
26
|
-
spec.add_development_dependency "rspec"
|
27
|
-
spec.add_development_dependency "shoulda"
|
28
|
-
spec.add_development_dependency "nokogiri"
|
29
|
-
spec.add_development_dependency "pry"
|
19
|
+
spec.require_paths = ['lib']
|
30
20
|
|
21
|
+
spec.add_development_dependency 'activesupport', '~> 4.2.2'
|
22
|
+
spec.add_development_dependency 'bundler'
|
23
|
+
spec.add_development_dependency 'code-scanning-rubocop', '~> 0.5'
|
24
|
+
spec.add_development_dependency 'libxml-ruby', '~> 3'
|
25
|
+
spec.add_development_dependency 'nokogiri', '~> 1.13.4'
|
26
|
+
spec.add_development_dependency 'pry'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
spec.add_development_dependency 'rspec'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 1'
|
30
|
+
spec.add_development_dependency 'rubocop-rspec'
|
31
|
+
spec.add_development_dependency 'shoulda'
|
31
32
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opensrs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Delsman
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 4.2.2
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 4.2.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,7 +39,49 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: code-scanning-rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: libxml-ruby
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nokogiri
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.13.4
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.13.4
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
44
86
|
requirements:
|
45
87
|
- - ">="
|
@@ -53,7 +95,7 @@ dependencies:
|
|
53
95
|
- !ruby/object:Gem::Version
|
54
96
|
version: '0'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
98
|
+
name: rake
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
58
100
|
requirements:
|
59
101
|
- - ">="
|
@@ -67,7 +109,7 @@ dependencies:
|
|
67
109
|
- !ruby/object:Gem::Version
|
68
110
|
version: '0'
|
69
111
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
112
|
+
name: rspec
|
71
113
|
requirement: !ruby/object:Gem::Requirement
|
72
114
|
requirements:
|
73
115
|
- - ">="
|
@@ -81,7 +123,21 @@ dependencies:
|
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '0'
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rspec
|
85
141
|
requirement: !ruby/object:Gem::Requirement
|
86
142
|
requirements:
|
87
143
|
- - ">="
|
@@ -95,7 +151,7 @@ dependencies:
|
|
95
151
|
- !ruby/object:Gem::Version
|
96
152
|
version: '0'
|
97
153
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
154
|
+
name: shoulda
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
100
156
|
requirements:
|
101
157
|
- - ">="
|
@@ -116,17 +172,22 @@ extensions: []
|
|
116
172
|
extra_rdoc_files: []
|
117
173
|
files:
|
118
174
|
- ".document"
|
175
|
+
- ".github/workflows/rubocop-analysis.yml"
|
176
|
+
- ".github/workflows/ruby.yml"
|
119
177
|
- ".gitignore"
|
120
178
|
- ".rspec"
|
179
|
+
- ".rubocop.yml"
|
121
180
|
- Gemfile
|
122
181
|
- Gemfile.lock
|
123
182
|
- LICENSE.txt
|
124
183
|
- README.md
|
125
184
|
- Rakefile
|
185
|
+
- SECURITY.md
|
126
186
|
- bin/console
|
127
187
|
- bin/setup
|
128
188
|
- lib/opensrs.rb
|
129
189
|
- lib/opensrs/response.rb
|
190
|
+
- lib/opensrs/sanitizable_string.rb
|
130
191
|
- lib/opensrs/server.rb
|
131
192
|
- lib/opensrs/version.rb
|
132
193
|
- lib/opensrs/xml_processor.rb
|
@@ -137,7 +198,7 @@ homepage: https://github.com/voxxit/opensrs
|
|
137
198
|
licenses:
|
138
199
|
- MIT
|
139
200
|
metadata: {}
|
140
|
-
post_install_message:
|
201
|
+
post_install_message:
|
141
202
|
rdoc_options: []
|
142
203
|
require_paths:
|
143
204
|
- lib
|
@@ -145,16 +206,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
206
|
requirements:
|
146
207
|
- - ">="
|
147
208
|
- !ruby/object:Gem::Version
|
148
|
-
version: '
|
209
|
+
version: '2.5'
|
149
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
211
|
requirements:
|
151
212
|
- - ">="
|
152
213
|
- !ruby/object:Gem::Version
|
153
214
|
version: '0'
|
154
215
|
requirements: []
|
155
|
-
|
156
|
-
|
157
|
-
signing_key:
|
216
|
+
rubygems_version: 3.0.3.1
|
217
|
+
signing_key:
|
158
218
|
specification_version: 4
|
159
219
|
summary: OpenSRS API for Ruby
|
160
220
|
test_files: []
|