hachi 0.3.2 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a64cb219a699afb02768ce856250ee2baa3eb77b51f8fc2bcb76b1ccc36b44a
4
- data.tar.gz: 8de8ee38a60140d62e6740c874fddd679e91748cba187c6789b9afc3f3cfd09d
3
+ metadata.gz: d03f917e4b7693f16612d130fb9808df41a4f66f962d757ec8e2dbedd6f039e1
4
+ data.tar.gz: 76ee4ec9ba69e732b17c7bff865fa5aaa5a251339b39b7daacc4e104000f99a3
5
5
  SHA512:
6
- metadata.gz: f66d6cf5bcb7c252a2ca4355e0409b28667dc7d9f55c356e482cab043bf6559f6d5eae49e08e83fa58cdf42493ab97fb481eb5c0907d0af5bcfd29b20aeb85bc
7
- data.tar.gz: d00975cc9e11bfca85828a821f6d9915458f43d6adc22d957fc6dcc13a39b91e06bb315e290b0f5ca12cb87d79915e6611ea7b5542b695e661c13910e7d99f36
6
+ metadata.gz: 9281deed1829c4efe3ea82ed2ecafa616535cb4038867ab9ef480e28a328b39ad66c270503b5ef40d80b18c99dce849231aaa31e6c59a24ec5073dfebf9c103b
7
+ data.tar.gz: 637a3945b65862633bdfeeb1723f4179bd7a61ae989cc725b4427d94257dc5aa71c972100110afdadd61717294b7001957349ffb90a1978dcce70060186f82e6
@@ -0,0 +1,26 @@
1
+ name: Ruby CI
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ ruby: [2.7, '3.0']
14
+
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ bundler-cache: true
22
+ - name: Build and test with Rake
23
+ run: |
24
+ gem install bundler
25
+ bundle install
26
+ bundle exec rake
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # Hachi
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/hachi.svg)](https://badge.fury.io/rb/hachi)
4
- [![Build Status](https://travis-ci.com/ninoseki/hachi.svg?branch=master)](https://travis-ci.com/ninoseki/hachi)
4
+ [![Ruby CI](https://github.com/ninoseki/hachi/actions/workflows/test.yml/badge.svg)](https://github.com/ninoseki/hachi/actions/workflows/test.yml)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/ninoseki/hachi/badge.svg?branch=master)](https://coveralls.io/github/ninoseki/hachi?branch=master)
6
6
  [![CodeFactor](https://www.codefactor.io/repository/github/ninoseki/hachi/badge)](https://www.codefactor.io/repository/github/ninoseki/hachi)
7
7
 
8
8
  Hachi(`蜂`) is a dead simple [TheHive](https://github.com/TheHive-Project/TheHive) API wrapper for Ruby.
9
9
 
10
+ **Note**: This library supports TheHive v4.
11
+
10
12
  ## Installation
11
13
 
12
14
  ```bash
@@ -26,10 +28,9 @@ api = Hachi::API.new(api_endpoint: "http://your_api_endpoint", api_key: "yoru_ap
26
28
  # list alerts
27
29
  api.alert.list
28
30
 
29
- # search atrifacts
30
- api.artifact.search(data: "1.1.1.1", data_type: "ip")
31
- # you can do a bulk search by giving an array as an input
32
- api.artifact.search(data: %w(1.1.1.1 8.8.8.8 github.com))
31
+ # search artifacts
32
+ query = { "_and": [{ "_or": [{ "_field": "data", "_value": "1.1.1.1" }, { "_field": "data", "_value": "example.com" }] }] }
33
+ api.artifact.search(query)
33
34
  ```
34
35
 
35
36
  See `samples` for more.
@@ -41,7 +42,7 @@ See `samples` for more.
41
42
  | HTTP Method | URI | Action | API method |
42
43
  |-------------|-----------------------------------|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
43
44
  | GET | /api/alert | List alerts | `#api.alert.list` |
44
- | POST | /api/alert/_search | Find alerts | `#api.alert.search(attributes, range: "all")` |
45
+ | POST | /api/alert/_search | Find alerts | `#api.alert.search(query, range: "all")` |
45
46
  | PATCH | /api/alert/_bulk | Update alerts in bulk | N/A |
46
47
  | POST | /api/alert/_stats | Compute stats on alerts | N/A |
47
48
  | POST | /api/alert | Create an alert | `#api.alert.create(title:, description:, severity: nil, date: nil, tags: nil, tlp: nil, status: nil, type:, source:, source_ref: nil, artifacts: nil, follow: nil)` |
@@ -59,7 +60,7 @@ See `samples` for more.
59
60
 
60
61
  | HTTP Method | URI | Action | API method |
61
62
  |-------------|----------------------------------------|---------------------------------|---------------------------------------------------------------------------------------|
62
- | POST | /api/case/artifact/_search | Find observables | `#api.artifact.search(attributes, range: "all")` |
63
+ | POST | /api/case/artifact/_search | Find observables | `#api.artifact.search(query, range: "all")` |
63
64
  | POST | /api/case/artifact/_stats | Compute stats on observables | N/A |
64
65
  | POST | /api/case/:caseId/artifact | Create an observable | `#api.artifact.create(case_id, data:, data_type:, message: nil, tlp: nil, tags: nil)` |
65
66
  | GET | /api/case/artifact/:artifactId | Get an observable | `#api.artifact.get_by_id(id)` |
@@ -73,7 +74,7 @@ See `samples` for more.
73
74
  | HTTP Method | URI | Action | API method |
74
75
  |-------------|------------------------------------|---------------------------------------|----------------------------------------------------------------------------------------------------------------------|
75
76
  | GET | /api/case | List cases | `#api.case.list` |
76
- | POST | /api/case/_search | Find cases | `#api.case.search(attributes, range: "all")` |
77
+ | POST | /api/case/_search | Find cases | `#api.case.search(query, range: "all")` |
77
78
  | PATCH | /api/case/_bulk | Update cases in bulk | N/A |
78
79
  | POST | /api/case/_stats | Compute stats on cases | N/A |
79
80
  | POST | /api/case | Create a case | `#api.case.create(title:, description:, severity: nil, start_date: nil, owner: nil, flag: nil, tlp: nil, tags: nil)` |
@@ -98,6 +99,15 @@ See `samples` for more.
98
99
  | POST | /api/user/:userId/password/set | Set password | N/A |
99
100
  | POST | /api/user/:userId/password/change | Change password | N/A |
100
101
 
102
+
103
+ ## How to interact with unimplemented API endpoints
104
+
105
+ `Hachi::API` exposes `get`, `post`, `delete` and `patch` methods. You can interact with the API endpoints via the methods.
106
+
107
+ ```ruby
108
+ alerts = api.get("/api/alert" ) { |json| json }
109
+ ```
110
+
101
111
  ## License
102
112
 
103
113
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
data/hachi.gemspec CHANGED
@@ -24,10 +24,10 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
- spec.add_development_dependency "bundler", "~> 2.1"
27
+ spec.add_development_dependency "bundler", "~> 2.2"
28
28
  spec.add_development_dependency "coveralls", "~> 0.8"
29
29
  spec.add_development_dependency "rake", "~> 13.0"
30
- spec.add_development_dependency "rspec", "~> 3.9"
30
+ spec.add_development_dependency "rspec", "~> 3.10"
31
31
  spec.add_development_dependency "vcr", "~> 6.0"
32
- spec.add_development_dependency "webmock", "~> 3.8"
32
+ spec.add_development_dependency "webmock", "~> 3.12"
33
33
  end
data/lib/hachi/api.rb CHANGED
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'forwardable'
4
+
3
5
  module Hachi
4
6
  class API
7
+ extend Forwardable
8
+
5
9
  # @return [String] TheHive API endpoint
6
10
  attr_reader :api_endpoint
7
11
 
@@ -20,8 +24,12 @@ module Hachi
20
24
 
21
25
  @api_key = api_key
22
26
  raise ArgumentError, "api_key argument is required" unless api_key
27
+
28
+ @base = Clients::Base.new(api_endpoint: api_endpoint, api_key: api_key)
23
29
  end
24
30
 
31
+ def_delegators :@base, :get, :post, :delete, :push
32
+
25
33
  #
26
34
  # Alert API endpoint client
27
35
  #
@@ -55,7 +55,7 @@ module Hachi
55
55
  #
56
56
  # @return [Hash]
57
57
  #
58
- def create(title:, description:, severity: nil, date: nil, tags: nil, tlp: nil, status: nil, type:, source:, source_ref: nil, artifacts: nil, follow: nil)
58
+ def create(title:, description:, type:, source:, severity: nil, date: nil, tags: nil, tlp: nil, status: nil, source_ref: nil, artifacts: nil, follow: nil)
59
59
  alert = Models::Alert.new(
60
60
  title: title,
61
61
  description: description,
@@ -70,20 +70,20 @@ module Hachi
70
70
  artifacts: artifacts,
71
71
  follow: follow,
72
72
  )
73
- post("/api/alert", alert.payload) { |json| json }
73
+ post("/api/alert", json: alert.payload) { |json| json }
74
74
  end
75
75
 
76
76
  #
77
77
  # Find alerts
78
78
  #
79
- # @param [Hash] attributes
79
+ # @param [Hash] query
80
80
  # @param [String] range
81
81
  # @param [String, nil] sort
82
82
  #
83
83
  # @return [Array]
84
84
  #
85
- def search(attributes, range: "all", sort: nil)
86
- _search("/api/alert/_search", attributes: attributes, range: range, sort: sort) { |json| json }
85
+ def search(query, range: "all", sort: nil)
86
+ _search("/api/alert/_search", query: query, range: range, sort: sort) { |json| json }
87
87
  end
88
88
 
89
89
  #
@@ -132,7 +132,7 @@ module Hachi
132
132
  alertIds: ids.flatten,
133
133
  caseId: case_id
134
134
  }
135
- post("/api/alert/merge/_bulk", params) { |json| json }
135
+ post("/api/alert/merge/_bulk", json: params) { |json| json }
136
136
  end
137
137
 
138
138
  #
@@ -157,7 +157,7 @@ module Hachi
157
157
  tlp: tlp,
158
158
  artifacts: artifacts,
159
159
  }.compact
160
- patch("/api/alert/#{id}", attributes) { |json| json }
160
+ patch("/api/alert/#{id}", json: attributes) { |json| json }
161
161
  end
162
162
  end
163
163
  end
@@ -24,7 +24,7 @@ module Hachi
24
24
  tags: tags,
25
25
  )
26
26
 
27
- post("/api/case/#{case_id}/artifact", artifact.payload) { |json| json }
27
+ post("/api/case/#{case_id}/artifact", json: artifact.payload) { |json| json }
28
28
  end
29
29
 
30
30
  #
@@ -52,13 +52,13 @@ module Hachi
52
52
  #
53
53
  # Find artifacts
54
54
  #
55
- # @param [Hash] attributes
55
+ # @param [Hash] query
56
56
  # @param [String] range
57
57
  #
58
58
  # @return [Array]
59
59
  #
60
- def search( range: "all", **attributes)
61
- _search("/api/case/artifact/_search", attributes: attributes, range: range) { |json| json }
60
+ def search(query, range: "all")
61
+ _search("/api/case/artifact/_search", query: query, range: range) { |json| json }
62
62
  end
63
63
 
64
64
  #
@@ -7,14 +7,59 @@ require "uri"
7
7
  module Hachi
8
8
  module Clients
9
9
  class Base
10
- attr_reader :api_endpoint
11
- attr_reader :api_key
10
+ attr_reader :api_endpoint, :api_key
12
11
 
13
12
  def initialize(api_endpoint:, api_key:)
14
13
  @api_endpoint = URI(api_endpoint)
15
14
  @api_key = api_key
16
15
  end
17
16
 
17
+ def get(path, params: {}, &block)
18
+ url = url_for(path)
19
+ url.query = URI.encode_www_form(params) unless params.empty?
20
+
21
+ get = Net::HTTP::Get.new(url)
22
+ get.add_field "Authorization", "Bearer #{api_key}"
23
+ request(get, &block)
24
+ end
25
+
26
+ def post(path, params: {}, json: {}, &block)
27
+ url = url_for(path)
28
+ url.query = URI.encode_www_form(params) unless params.empty?
29
+
30
+ post = Net::HTTP::Post.new(url)
31
+ post.body = json.is_a?(Hash) ? json.to_json : json.to_s
32
+
33
+ post.add_field "Content-Type", "application/json"
34
+ post.add_field "Authorization", "Bearer #{api_key}"
35
+
36
+ request(post, &block)
37
+ end
38
+
39
+ def delete(path, params: {}, json: {}, &block)
40
+ url = url_for(path)
41
+ url.query = URI.encode_www_form(params) unless params.empty?
42
+
43
+ delete = Net::HTTP::Delete.new(url)
44
+ delete.body = json.is_a?(Hash) ? json.to_json : json.to_s
45
+
46
+ delete.add_field "Authorization", "Bearer #{api_key}"
47
+ request(delete, &block)
48
+ end
49
+
50
+ def patch(path, params: {}, json: {}, &block)
51
+ url = url_for(path)
52
+ url.query = URI.encode_www_form(params) unless params.empty?
53
+
54
+ patch = Net::HTTP::Patch.new(url)
55
+ patch.body = json.is_a?(Hash) ? json.to_json : json.to_s
56
+
57
+ patch.add_field "Content-Type", "application/json"
58
+ patch.add_field "Authorization", "Bearer #{api_key}"
59
+
60
+ request(patch, &block)
61
+ end
62
+
18
63
  private
19
64
 
20
65
  def base_url
@@ -74,48 +119,6 @@ module Hachi
74
119
  end
75
120
  end
76
121
 
77
- def get(path, params = {}, &block)
78
- url = url_for(path)
79
- url.query = URI.encode_www_form(params) unless params.empty?
80
-
81
- get = Net::HTTP::Get.new(url)
82
- get.add_field "Authorization", "Bearer #{api_key}"
83
- request(get, &block)
84
- end
85
-
86
- def post(path, params = {}, &block)
87
- url = url_for(path)
88
-
89
- post = Net::HTTP::Post.new(url)
90
- post.body = params.is_a?(Hash) ? params.to_json : params.to_s
91
-
92
- post.add_field "Content-Type", "application/json"
93
- post.add_field "Authorization", "Bearer #{api_key}"
94
-
95
- request(post, &block)
96
- end
97
-
98
- def delete(path, params = {}, &block)
99
- url = url_for(path)
100
- url.query = URI.encode_www_form(params) unless params.empty?
101
-
102
- delete = Net::HTTP::Delete.new(url)
103
- delete.add_field "Authorization", "Bearer #{api_key}"
104
- request(delete, &block)
105
- end
106
-
107
- def patch(path, params = {}, &block)
108
- url = url_for(path)
109
-
110
- patch = Net::HTTP::Patch.new(url)
111
- patch.body = params.is_a?(Hash) ? params.to_json : params.to_s
112
-
113
- patch.add_field "Content-Type", "application/json"
114
- patch.add_field "Authorization", "Bearer #{api_key}"
115
-
116
- request(patch, &block)
117
- end
118
-
119
122
  def validate_range(range)
120
123
  return true if range == "all"
121
124
  raise ArgumentError, "range should be 'all' or `from-to`" unless range.match?(/(\d+)-(\d+)/)
@@ -126,51 +129,12 @@ module Hachi
126
129
  raise ArgumentError, "from should be smaller than to"
127
130
  end
128
131
 
129
- def _search(path, attributes:, range: "all", sort: nil)
132
+ def _search(path, query:, range: "all", sort: nil)
130
133
  validate_range range
131
134
 
132
- attributes = normalize_attributes(attributes)
133
- conditions = attributes.map do |key, value|
134
- if key == :data && value.is_a?(Array)
135
- { _or: decompose_data(value) }
136
- else
137
- { _string: "#{key}:\"#{value}\"" }
138
- end
139
- end
140
-
141
- default_conditions = {
142
- _and: [
143
- { _not: { status: "Deleted" } },
144
- { _not: { _in: { _field: "_type", _values: ["dashboard", "data", "user", "analyzer", "caseTemplate", "reportTemplate", "action"] } } },
145
- ],
146
- }
147
-
148
- query = {
149
- _and: [conditions, default_conditions].flatten,
150
- }
151
-
152
135
  query_string = build_query_string(range: range, sort: sort)
153
136
 
154
- post("#{path}?#{query_string}", query: query) { |json| json }
155
- end
156
-
157
- def decompose_data(data)
158
- data.map do |elem|
159
- { _field: "data", _value: elem }
160
- end
161
- end
162
-
163
- def normalize_attributes(attributes)
164
- h = {}
165
- attributes.each do |key, value|
166
- h[camelize(key).to_sym] = value
167
- end
168
- h
169
- end
170
-
171
- def camelize(string)
172
- head, *others = string.to_s.split("_")
173
- [head, others.map(&:capitalize)].flatten.join
137
+ post("#{path}?#{query_string}", json: { query: query }) { |json| json }
174
138
  end
175
139
 
176
140
  def build_query_string(params)
@@ -60,19 +60,19 @@ module Hachi
60
60
  tags: tags,
61
61
  )
62
62
 
63
- post("/api/case", kase.payload) { |json| json }
63
+ post("/api/case", json: kase.payload) { |json| json }
64
64
  end
65
65
 
66
66
  #
67
67
  # Find cases
68
68
  #
69
- # @param [Hash] attributes
69
+ # @param [Hash] query
70
70
  # @param [String] range
71
71
  #
72
72
  # @return [Hash]
73
73
  #
74
- def search(range: "all", **attributes)
75
- _search("/api/case/_search", attributes: attributes, range: range) { |json| json }
74
+ def search(query, range: "all")
75
+ _search("/api/case/_search", query: query, range: range) { |json| json }
76
76
  end
77
77
 
78
78
  #
@@ -138,7 +138,7 @@ module Hachi
138
138
  metrics: metrics,
139
139
  customFields: custom_fields
140
140
  }.compact
141
- patch("/api/case/#{id}", attributes) { |json| json }
141
+ patch("/api/case/#{id}", json: attributes) { |json| json }
142
142
  end
143
143
  end
144
144
  end
@@ -52,7 +52,7 @@ module Hachi
52
52
  password: password
53
53
  )
54
54
 
55
- post("/api/user", user.payload) { |json| json }
55
+ post("/api/user", json: user.payload) { |json| json }
56
56
  end
57
57
  end
58
58
  end
@@ -6,20 +6,9 @@ require "securerandom"
6
6
  module Hachi
7
7
  module Models
8
8
  class Alert < Base
9
- attr_reader :title
10
- attr_reader :description
11
- attr_reader :severity
12
- attr_reader :date
13
- attr_reader :tags
14
- attr_reader :tlp
15
- attr_reader :status
16
- attr_reader :type
17
- attr_reader :source
18
- attr_reader :source_ref
19
- attr_reader :artifacts
20
- attr_reader :follow
9
+ attr_reader :title, :description, :severity, :date, :tags, :tlp, :status, :type, :source, :source_ref, :artifacts, :follow
21
10
 
22
- def initialize(title:, description:, severity: nil, date: nil, tags: nil, tlp: nil, status: nil, type:, source:, source_ref: nil, artifacts: nil, follow: nil)
11
+ def initialize(title:, description:, type:, source:, severity: nil, date: nil, tags: nil, tlp: nil, status: nil, source_ref: nil, artifacts: nil, follow: nil)
23
12
  @title = title
24
13
  @description = description
25
14
  @severity = severity
@@ -5,11 +5,7 @@ module Hachi
5
5
  class Artifact < Base
6
6
  DATA_TYPES = %w(filename file fqdn hash uri_path ip domain mail autonomous-system registry mail_subject regexp user-agent other url).freeze
7
7
 
8
- attr_reader :data
9
- attr_reader :data_type
10
- attr_reader :message
11
- attr_reader :tlp
12
- attr_reader :tags
8
+ attr_reader :data, :data_type, :message, :tlp, :tags
13
9
 
14
10
  def initialize(data:, data_type:, message: nil, tlp: nil, tags: nil)
15
11
  @data = data
@@ -3,14 +3,7 @@
3
3
  module Hachi
4
4
  module Models
5
5
  class Case < Base
6
- attr_reader :title
7
- attr_reader :description
8
- attr_reader :severity
9
- attr_reader :start_date
10
- attr_reader :owner
11
- attr_reader :flag
12
- attr_reader :tlp
13
- attr_reader :tags
6
+ attr_reader :title, :description, :severity, :start_date, :owner, :flag, :tlp, :tags
14
7
 
15
8
  def initialize(title:, description:, severity: nil, start_date: nil, owner: nil, flag: nil, tlp: nil, tags: nil)
16
9
  @title = title
@@ -3,10 +3,7 @@
3
3
  module Hachi
4
4
  module Models
5
5
  class User < Base
6
- attr_reader :login
7
- attr_reader :name
8
- attr_reader :roles
9
- attr_reader :password
6
+ attr_reader :login, :name, :roles, :password
10
7
 
11
8
  ROLES = %w(read write admin).freeze
12
9
 
data/lib/hachi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hachi
4
- VERSION = "0.3.2"
4
+ VERSION = "1.0.0"
5
5
  end
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hachi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-18 00:00:00.000000000 Z
11
+ date: 2021-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: '2.2'
20
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: '2.1'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: coveralls
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.9'
61
+ version: '3.10'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.9'
68
+ version: '3.10'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: vcr
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.8'
89
+ version: '3.12'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.8'
96
+ version: '3.12'
97
97
  description: A dead simple TheHive API wrapper.
98
98
  email:
99
99
  - manabu.niseki@gmail.com
@@ -101,9 +101,9 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
+ - ".github/workflows/test.yml"
104
105
  - ".gitignore"
105
106
  - ".rspec"
106
- - ".travis.yml"
107
107
  - Gemfile
108
108
  - LICENSE.txt
109
109
  - README.md
@@ -124,6 +124,7 @@ files:
124
124
  - lib/hachi/models/case.rb
125
125
  - lib/hachi/models/user.rb
126
126
  - lib/hachi/version.rb
127
+ - renovate.json
127
128
  - samples/01_create_an_alert.rb
128
129
  - samples/02_search_artifacts.rb
129
130
  - samples/03_list_cases.rb
@@ -147,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  - !ruby/object:Gem::Version
148
149
  version: '0'
149
150
  requirements: []
150
- rubygems_version: 3.1.2
151
+ rubygems_version: 3.2.3
151
152
  signing_key:
152
153
  specification_version: 4
153
154
  summary: A dead simple TheHive API wrapper.
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6
7
- - 2.7
8
- before_install: gem install bundler -v 2.1