censysx 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f1a928dc3e503eb26fc40f8e9db02a8a10ca738e41a74f1b766c570997502200
4
+ data.tar.gz: 13faa72dc9fa10cb1983a91dd16e6a729828fec6c3dec40cf21d1d084c7b60dd
5
+ SHA512:
6
+ metadata.gz: 8c44202221979f299bf1ccfffa45ebf5a36ee1e4cc03ab93bb0fc9d7bf90f8e0d60b3e834d921b52f4436ed11703588dbab392a6c666f7a2ddf4b77adfee0a3f
7
+ data.tar.gz: 24ab4f8fa09bbfe4af64c0f553bc0638ffb995bbfad77cecaeb025b67ae992354e22b10d9e96b2a2dbc2dfadbdabd5c7631f3b1574dea587443d090bbba9eb7c
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v2
10
+ - name: Set up Ruby
11
+ uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: 3.0.0
14
+ bundler-cache: true
15
+
16
+ - name: Run the default task
17
+ run: |
18
+ gem install bundler -v 2.2.15
19
+ bundle install
20
+ bundle exec rake
data/.gitignore ADDED
@@ -0,0 +1,59 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ # Ignore Byebug command history file.
17
+ .byebug_history
18
+
19
+ ## Specific to RubyMotion:
20
+ .dat*
21
+ .repl_history
22
+ build/
23
+ *.bridgesupport
24
+ build-iPhoneOS/
25
+ build-iPhoneSimulator/
26
+
27
+ ## Specific to RubyMotion (use of CocoaPods):
28
+ #
29
+ # We recommend against adding the Pods directory to your .gitignore. However
30
+ # you should judge for yourself, the pros and cons are mentioned at:
31
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
+ #
33
+ # vendor/Pods/
34
+
35
+ ## Documentation cache and generated files:
36
+ /.yardoc/
37
+ /_yardoc/
38
+ /doc/
39
+ /rdoc/
40
+
41
+ ## Environment normalization:
42
+ /.bundle/
43
+ /vendor/bundle
44
+ /lib/bundler/man/
45
+
46
+ # for a library or gem, you might want to ignore these files since the code is
47
+ # intended to run in multiple environments; otherwise, check them in:
48
+ Gemfile.lock
49
+ .ruby-version
50
+ .ruby-gemset
51
+
52
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
+ .rvmrc
54
+
55
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
+ # .rubocop-https?--*
57
+
58
+ # rspec failure tracking
59
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.0
3
+
4
+ Style/StringLiterals:
5
+ Enabled: true
6
+ EnforcedStyle: double_quotes
7
+
8
+ Style/StringLiteralsInInterpolation:
9
+ Enabled: true
10
+ EnforcedStyle: double_quotes
11
+
12
+ Layout/LineLength:
13
+ Max: 120
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in censysx.gemspec
6
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Manabu Niseki
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Censysx
2
+
3
+ A Censys Search v2 API wrapper for Ruby. 💎
4
+
5
+ - [Official API Docs](https://search.censys.io/api)
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ gem install censysx
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Initialize the API:
16
+
17
+ ```ruby
18
+ require "censys"
19
+
20
+ api = Censys::API.new(id, secret)
21
+ ```
22
+
23
+ You can initialize the API by using `$CENSYS_ID` and `$CENSYS_SECRET` environment variables:
24
+
25
+ ```ruby
26
+ # in this case, it tries to load ID and secret from ENV
27
+ # - ENV["CENSYS_ID"] for the ID
28
+ # - ENV["CENSYS_SECRET"] for the secret
29
+ api = Censys::API.new
30
+ ```
31
+
32
+ View:
33
+
34
+ ```ruby
35
+ response = api.view("1.1.1.1")
36
+ response = api.view("1.1.1.1", at_time: "2021-03-01T00:00:00.000000Z")
37
+ ```
38
+
39
+ Search:
40
+
41
+ ```ruby
42
+ response = api.search(query, cursor: cursor)
43
+ ```
44
+
45
+ Search with cursor:
46
+
47
+ ```ruby
48
+ cursor = nil
49
+
50
+ loop do
51
+ response = api.search(query, cursor: cursor)
52
+
53
+ links = response.dig("result", "links")
54
+ cursor = links["next"]
55
+ break if cursor == ""
56
+ end
57
+ ```
58
+
59
+ Aggregate:
60
+
61
+ ```ruby
62
+ response = api.aggregate(query, field)
63
+ response = api.aggregate(query, field, num_buckets: num_buckets)
64
+ ```
65
+
66
+ ## License
67
+
68
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec]
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "censysx"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/censysx.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/censys/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "censysx"
7
+ spec.version = Censys::VERSION
8
+ spec.authors = ["Manabu Niseki"]
9
+ spec.email = ["manabu.niseki@gmail.com"]
10
+
11
+ spec.summary = "Censys Search v2 API wrapper for Ruby"
12
+ spec.homepage = "https://github.com/ninoseki/censysx"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/ninoseki/censysx"
18
+
19
+ # Specify which files should be added to the gem when it is released.
20
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
23
+ end
24
+ spec.bindir = "exe"
25
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
26
+ spec.require_paths = ["lib"]
27
+
28
+ spec.add_development_dependency "coveralls_reborn", "~> 0.22"
29
+ spec.add_development_dependency "dotenv", "~> 2.7"
30
+ spec.add_development_dependency "rake", "~> 13.0"
31
+ spec.add_development_dependency "rspec", "~> 3.10"
32
+ spec.add_development_dependency "rubocop", "~> 1.16"
33
+ spec.add_development_dependency "rubocop-performance", "~> 1.11"
34
+ spec.add_development_dependency "rubocop-rake", "~> 0.5"
35
+ spec.add_development_dependency "rubocop-rspec", "~> 2.3"
36
+ spec.add_development_dependency "vcr", "~> 6.0"
37
+ spec.add_development_dependency "webmock", "~> 3.13"
38
+ end
data/lib/censys.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "censys/version"
4
+
5
+ require_relative "censys/exceptions"
6
+
7
+ require_relative "censys/api"
data/lib/censys/api.rb ADDED
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "censys/exceptions"
4
+
5
+ require "net/https"
6
+ require "json"
7
+ require "time"
8
+
9
+ module Censys
10
+ #
11
+ # Censys Search v2 API wrapper
12
+ #
13
+ class API
14
+ VERSION = 2
15
+ HOST = "search.censys.io"
16
+ URL = "https://#{HOST}/api/v#{VERSION}/hosts"
17
+
18
+ #
19
+ # Initializes the API.
20
+ #
21
+ # @param [String] id the API UID used for authentication.
22
+ #
23
+ # @param [String] secret the API secret used for authentication.
24
+ #
25
+ # @raise [ArgumentError] either `id` or `secret` was `nil` or empty.
26
+ #
27
+ # @see https://censys.io/account
28
+ # Censys - My Account
29
+ #
30
+ def initialize(id = ENV["CENSYS_ID"], secret = ENV["CENSYS_SECRET"])
31
+ raise(ArgumentError, "'id' argument is required") if id.nil? || id.empty?
32
+ raise(ArgumentError, "'secret' argument is required") if secret.nil? || secret.empty?
33
+
34
+ @id = id
35
+ @secret = secret
36
+ end
37
+
38
+ #
39
+ # View document from current index.
40
+ #
41
+ # View the current structured data we have on a specific document.
42
+ # For more details, see our documentation: https://search.censys.io/api/v2/docs
43
+ #
44
+ # @param [String] document_id the ID of the document you are requesting.
45
+ # @param [String, Time, nil] at_time Fetches a document at a given point in time.
46
+ #
47
+ # @return [Hash]
48
+ #
49
+ def view(document_id, at_time: nil)
50
+ at_time = at_time.strftime("%Y-%m-%dT%H:%M:%S.%6NZ") if at_time.is_a?(Time)
51
+ params = { at_time: at_time }.compact
52
+
53
+ get("/#{document_id}", params) do |json|
54
+ json
55
+ end
56
+ end
57
+
58
+ #
59
+ # Search current index.
60
+ #
61
+ # Searches the given index for all records that match the given query.
62
+ # For more details, see our documentation: https://search.censys.io/api/v2/docs
63
+ #
64
+ # @param [String] query the query to be executed.
65
+ # @params [Integer, nil] per_page the number of results to be returned for each page.
66
+ # @params [Integer, nil] cursor the cursor of the desired result set.
67
+ #
68
+ # @return [Hash]
69
+ #
70
+ def search(query, per_page: nil, cursor: nil)
71
+ params = { q: query, per_page: per_page, cursor: cursor }.compact
72
+ get("/search", params) do |json|
73
+ json
74
+ end
75
+ end
76
+
77
+ #
78
+ # Aggregate current index.
79
+ #
80
+ # Creates a report on the breakdown of the values of a field in a result set.
81
+ # For more details, see our documentation: https://search.censys.io/api/v2/docs
82
+ #
83
+ # @param [String] query the query to be executed.
84
+ # @param [String] field the field you are running a breakdown on.
85
+ # @param [Integer, nil] num_buckets the maximum number of values. Defaults to 50.
86
+ #
87
+ # @return [Hash]
88
+ #
89
+ def aggregate(query, field, num_buckets: nil)
90
+ params = { q: query, field: field, num_buckets: num_buckets }.compact
91
+ get("/aggregate", params) do |json|
92
+ json
93
+ end
94
+ end
95
+
96
+ private
97
+
98
+ #
99
+ # Returns a URL for the API sub-path.
100
+ #
101
+ # @param [String] path the path relative to `/api/v2`.
102
+ #
103
+ # @return [URI::HTTPS] fully qualified URI.
104
+ #
105
+ def url_for(path)
106
+ URI(URL + path)
107
+ end
108
+
109
+ #
110
+ # Return HTTPS options
111
+ #
112
+ # @return [Hash]
113
+ #
114
+ def https_options
115
+ proxy = ENV["HTTPS_PROXY"]
116
+
117
+ return { use_ssl: true } unless proxy
118
+
119
+ uri = URI(proxy)
120
+ {
121
+ proxy_address: uri.hostname,
122
+ proxy_port: uri.port,
123
+ proxy_from_env: false,
124
+ use_ssl: true
125
+ }
126
+ end
127
+
128
+ #
129
+ # Sends the HTTP request and handles the response.
130
+ #
131
+ # @param [Net::HTTP::Get, Net::HTTP::Post] req the prepared request to send.
132
+ #
133
+ # @yield [json] the given block will be passed the parsed JSON.
134
+ #
135
+ # @yieldparam [Hash{String => Object}] json the parsed JSON.
136
+ #
137
+ # @raise [NotFound, RateLimited, InternalServerError, ResponseError]
138
+ # If an error response is returned, the appropriate exception will be
139
+ # raised.
140
+ #
141
+ def request(req)
142
+ Net::HTTP.start(HOST, 443, https_options) do |http|
143
+ response = http.request(req)
144
+
145
+ json = JSON.parse(response.body)
146
+ error = json["error"]
147
+
148
+ case response.code
149
+ when "200" then yield JSON.parse(response.body)
150
+ when "302" then raise AuthenticationError, error
151
+ when "403" then raise Forbidden, error
152
+ when "404" then raise NotFound, error
153
+ when "429" then raise RateLimited, error
154
+ when "500" then raise InternalServerError, error
155
+ else
156
+ raise Error, error
157
+ end
158
+ end
159
+ end
160
+
161
+ #
162
+ # Creates a new HTTP GET request.
163
+ #
164
+ # @param [String] path
165
+ # @param [Hash] query parameters
166
+ #
167
+ # @see #request
168
+ #
169
+ def get(path, params, &block)
170
+ url = url_for(path)
171
+ url.query = URI.encode_www_form(params)
172
+
173
+ get = Net::HTTP::Get.new(url)
174
+ get.basic_auth @id, @secret
175
+
176
+ request(get, &block)
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Censys
4
+ class Error < StandardError; end
5
+
6
+ class AuthenticationError < Error; end
7
+
8
+ class NotFound < Error; end
9
+
10
+ class Forbidden < Error; end
11
+
12
+ class RateLimited < Error; end
13
+
14
+ class InternalServerError < Error; end
15
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Censys
4
+ VERSION = "0.1.0"
5
+ end
data/lib/censysx.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "censys/version"
4
+
5
+ require_relative "censys/exceptions"
6
+
7
+ require_relative "censys/api"
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: censysx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Manabu Niseki
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: coveralls_reborn
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.22'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.22'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dotenv
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.16'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.16'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.11'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.11'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.5'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '6.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '6.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.13'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.13'
153
+ description:
154
+ email:
155
+ - manabu.niseki@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".github/workflows/main.yml"
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".rubocop.yml"
164
+ - Gemfile
165
+ - LICENSE
166
+ - README.md
167
+ - Rakefile
168
+ - bin/console
169
+ - bin/setup
170
+ - censysx.gemspec
171
+ - lib/censys.rb
172
+ - lib/censys/api.rb
173
+ - lib/censys/exceptions.rb
174
+ - lib/censys/version.rb
175
+ - lib/censysx.rb
176
+ homepage: https://github.com/ninoseki/censysx
177
+ licenses:
178
+ - MIT
179
+ metadata:
180
+ homepage_uri: https://github.com/ninoseki/censysx
181
+ source_code_uri: https://github.com/ninoseki/censysx
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: 3.0.0
191
+ required_rubygems_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ requirements: []
197
+ rubygems_version: 3.2.15
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Censys Search v2 API wrapper for Ruby
201
+ test_files: []