tana 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data/LICENSE.adoc +134 -0
- data/README.adoc +532 -0
- data/lib/tana/api/client.rb +26 -0
- data/lib/tana/client.rb +20 -0
- data/lib/tana/configuration/content.rb +8 -0
- data/lib/tana/configuration/loader.rb +29 -0
- data/lib/tana/container.rb +15 -0
- data/lib/tana/endpoints/add/action.rb +44 -0
- data/lib/tana/import.rb +7 -0
- data/lib/tana/models/node.rb +19 -0
- data/lib/tana/models/root.rb +16 -0
- data/lib/tana/requests/add.rb +35 -0
- data/lib/tana/requests/level_a.rb +12 -0
- data/lib/tana/requests/level_b.rb +12 -0
- data/lib/tana/requests/level_c.rb +12 -0
- data/lib/tana/requests/level_d.rb +12 -0
- data/lib/tana/requests/level_e.rb +12 -0
- data/lib/tana/requests/level_f.rb +12 -0
- data/lib/tana/requests/level_g.rb +12 -0
- data/lib/tana/requests/level_h.rb +12 -0
- data/lib/tana/requests/level_i.rb +12 -0
- data/lib/tana/requests/node.rb +46 -0
- data/lib/tana/responses/level_a.rb +12 -0
- data/lib/tana/responses/level_b.rb +12 -0
- data/lib/tana/responses/level_c.rb +12 -0
- data/lib/tana/responses/level_d.rb +12 -0
- data/lib/tana/responses/level_e.rb +12 -0
- data/lib/tana/responses/level_f.rb +12 -0
- data/lib/tana/responses/level_g.rb +12 -0
- data/lib/tana/responses/level_h.rb +12 -0
- data/lib/tana/responses/level_i.rb +12 -0
- data/lib/tana/responses/node.rb +15 -0
- data/lib/tana/responses/root.rb +12 -0
- data/lib/tana.rb +24 -0
- data/tana.gemspec +38 -0
- data.tar.gz.sig +0 -0
- metadata +240 -0
- metadata.gz.sig +0 -0
data/lib/tana/client.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tana
|
4
|
+
# The primary interface for making API requests.
|
5
|
+
class Client
|
6
|
+
include Import[:configuration]
|
7
|
+
|
8
|
+
def initialize(endpoint: Endpoints::Add::Action.new, **)
|
9
|
+
@endpoint = endpoint
|
10
|
+
super(**)
|
11
|
+
yield configuration if block_given?
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(...) = endpoint.call(...)
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :endpoint
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/string"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Configuration
|
7
|
+
# Handles loading of configuration with environment defaults.
|
8
|
+
class Loader
|
9
|
+
using Refinements::String
|
10
|
+
|
11
|
+
def initialize model = Content, environment: ENV
|
12
|
+
@model = model
|
13
|
+
@environment = environment
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
model[
|
18
|
+
accept: environment.fetch("TANA_API_ACCEPT", "application/json"),
|
19
|
+
token: environment["TANA_API_TOKEN"],
|
20
|
+
url: environment.fetch("TANA_API_URL", "https://europe-west1-tagr-prod.cloudfunctions.net")
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :model, :environment
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-container"
|
4
|
+
require "http"
|
5
|
+
|
6
|
+
module Tana
|
7
|
+
# Defines application dependencies.
|
8
|
+
module Container
|
9
|
+
extend Dry::Container::Mixin
|
10
|
+
|
11
|
+
register(:configuration, memoize: true) { Configuration::Loader.new.call }
|
12
|
+
register(:http) { HTTP }
|
13
|
+
register(:client, memoize: true) { API::Client.new }
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "transactable"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Endpoints
|
7
|
+
module Add
|
8
|
+
# Handles a repository create action.
|
9
|
+
class Action
|
10
|
+
include Import[:client]
|
11
|
+
include Transactable
|
12
|
+
|
13
|
+
# rubocop:todo Metrics/ParameterLists
|
14
|
+
def initialize(
|
15
|
+
request: Requests::Add.new,
|
16
|
+
response: Responses::Root,
|
17
|
+
model: Models::Root,
|
18
|
+
**
|
19
|
+
)
|
20
|
+
@request = request
|
21
|
+
@response = response
|
22
|
+
@model = model
|
23
|
+
super(**)
|
24
|
+
end
|
25
|
+
# rubocop:enable Metrics/ParameterLists
|
26
|
+
|
27
|
+
def call(body, **)
|
28
|
+
pipe body,
|
29
|
+
validate(request),
|
30
|
+
insert("addToNodeV2", at: 0),
|
31
|
+
insert(**),
|
32
|
+
to(client, :post),
|
33
|
+
try(:parse, catch: JSON::ParserError),
|
34
|
+
validate(response),
|
35
|
+
to(model, :for)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :request, :response, :model
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/tana/import.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Models
|
7
|
+
# A generic node.
|
8
|
+
Node = Data.define :id, :name, :description, :type, :children do
|
9
|
+
def self.for(**attributes) = new(**attributes.transform_keys!(nodeId: :id))
|
10
|
+
|
11
|
+
def initialize id:, type:, name: nil, description: nil, children: Core::EMPTY_ARRAY
|
12
|
+
updated_children = children.map { |child| self.class.for(**child) }
|
13
|
+
super id:, name:, type:, description:, children: updated_children
|
14
|
+
end
|
15
|
+
|
16
|
+
alias_method :to_hash, :to_h
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Models
|
7
|
+
# A root node.
|
8
|
+
Root = Data.define :children do
|
9
|
+
def self.for(node: Node, **attributes)
|
10
|
+
attributes.fetch(:children, Core::EMPTY_ARRAY)
|
11
|
+
.map { |child| node.for(**child) }
|
12
|
+
.then { |children| new children: }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/validation"
|
4
|
+
require "refinements/array"
|
5
|
+
|
6
|
+
module Tana
|
7
|
+
module Requests
|
8
|
+
# Validates an API add request.
|
9
|
+
class Add < Dry::Validation::Contract
|
10
|
+
using Refinements::Array
|
11
|
+
|
12
|
+
TARGETS = ["INBOX", "SCHEMA", /\A[0-9a-z\-_]{12}\Z/i].freeze
|
13
|
+
|
14
|
+
def initialize(targets: TARGETS, **)
|
15
|
+
@targets = targets
|
16
|
+
super(**)
|
17
|
+
end
|
18
|
+
|
19
|
+
json do
|
20
|
+
optional(:targetNodeId).filled :string
|
21
|
+
required(:nodes).value(:array, min_size?: 1).each { hash LevelA }
|
22
|
+
end
|
23
|
+
|
24
|
+
rule :targetNodeId do
|
25
|
+
next unless key? && targets.none? { |target| value.match? target }
|
26
|
+
|
27
|
+
key.failure "is invalid. Use: #{targets.to_usage :or}"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :targets
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the first level of an API request.
|
8
|
+
LevelA = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelB }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the second level of an API request.
|
8
|
+
LevelB = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelC }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the third level of an API request.
|
8
|
+
LevelC = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelD }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the fourth level of an API request.
|
8
|
+
LevelD = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelE }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the fifth level of an API request.
|
8
|
+
LevelE = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelF }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the sixth level of an API request.
|
8
|
+
LevelF = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelG }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the seventh level of an API request.
|
8
|
+
LevelG = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelH }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the eight level of an API request.
|
8
|
+
LevelH = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelI }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Requests
|
7
|
+
# Validates the ninth level of an API request.
|
8
|
+
LevelI = Dry::Schema.JSON parent: Node.schema do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash Node.schema }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/validation"
|
4
|
+
require "refinements/array"
|
5
|
+
|
6
|
+
module Tana
|
7
|
+
module Requests
|
8
|
+
# Validates a generic node within an API request.
|
9
|
+
class Node < Dry::Validation::Contract
|
10
|
+
TYPES = %w[boolean date field file plain reference url].freeze
|
11
|
+
|
12
|
+
using Refinements::Array
|
13
|
+
|
14
|
+
def initialize(types: TYPES, **)
|
15
|
+
@types = types
|
16
|
+
super(**)
|
17
|
+
end
|
18
|
+
|
19
|
+
json do
|
20
|
+
optional(:attributeId).filled :string
|
21
|
+
optional(:contentType).filled :string
|
22
|
+
optional(:dataType).filled :string
|
23
|
+
optional(:description).filled :string
|
24
|
+
optional(:file).filled :string
|
25
|
+
optional(:filename).filled :string
|
26
|
+
optional(:id).filled :string
|
27
|
+
optional(:name).filled :string
|
28
|
+
optional(:supertags).array(:hash) { required(:id).filled :string }
|
29
|
+
optional(:type).filled :string
|
30
|
+
optional(:value).filled :bool
|
31
|
+
end
|
32
|
+
|
33
|
+
rule :type do
|
34
|
+
key.failure "is invalid. Use: #{types.to_usage :or}" if key? && !types.include?(value)
|
35
|
+
end
|
36
|
+
|
37
|
+
rule :dataType do
|
38
|
+
key.failure "is invalid. Use: #{types.to_usage :or}" if key? && !types.include?(value)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
attr_reader :types
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the first level of an API response.
|
8
|
+
LevelA = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelB }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the second level of an API response.
|
8
|
+
LevelB = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelC }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the third level of an API response.
|
8
|
+
LevelC = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelD }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the fourth level of an API response.
|
8
|
+
LevelD = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelE }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the fifth level of an API response.
|
8
|
+
LevelE = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelF }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the sixth level of an API response.
|
8
|
+
LevelF = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelG }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the seventh level of an API response.
|
8
|
+
LevelG = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelH }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the eighth level of an API response.
|
8
|
+
LevelH = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelI }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the ninth level of an API response.
|
8
|
+
LevelI = Dry::Schema.JSON parent: Node do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash Node }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates a generic node within an API response.
|
8
|
+
Node = Dry::Schema.JSON do
|
9
|
+
optional(:description).filled :string
|
10
|
+
optional(:name).filled :string
|
11
|
+
required(:nodeId).filled :string
|
12
|
+
required(:type).filled :string
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/schema"
|
4
|
+
|
5
|
+
module Tana
|
6
|
+
module Responses
|
7
|
+
# Validates the root node of an API response.
|
8
|
+
Root = Dry::Schema.JSON do
|
9
|
+
optional(:children).value(:array, min_size?: 1).each { hash LevelA }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/tana.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/monads"
|
4
|
+
require "dry/validation"
|
5
|
+
require "zeitwerk"
|
6
|
+
|
7
|
+
Dry::Schema.load_extensions :monads
|
8
|
+
Dry::Validation.load_extensions :monads
|
9
|
+
|
10
|
+
Zeitwerk::Loader.new.then do |loader|
|
11
|
+
loader.inflector.inflect "api" => "API"
|
12
|
+
loader.tag = File.basename __FILE__, ".rb"
|
13
|
+
loader.push_dir __dir__
|
14
|
+
loader.setup
|
15
|
+
end
|
16
|
+
|
17
|
+
# Main namespace.
|
18
|
+
module Tana
|
19
|
+
def self.loader registry = Zeitwerk::Registry
|
20
|
+
@loader ||= registry.loaders.find { |loader| loader.tag == File.basename(__FILE__, ".rb") }
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.new(...) = Client.new(...)
|
24
|
+
end
|
data/tana.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "tana"
|
5
|
+
spec.version = "0.0.0"
|
6
|
+
spec.authors = ["Brooke Kuhlmann"]
|
7
|
+
spec.email = ["brooke@alchemists.io"]
|
8
|
+
spec.homepage = "https://alchemists.io/projects/tana"
|
9
|
+
spec.summary = "A monadic API client for the Tana Personal Knowledge Management system."
|
10
|
+
spec.license = "Hippocratic-2.1"
|
11
|
+
|
12
|
+
spec.metadata = {
|
13
|
+
"bug_tracker_uri" => "https://github.com/bkuhlmann/tana/issues",
|
14
|
+
"changelog_uri" => "https://alchemists.io/projects/tana/versions",
|
15
|
+
"documentation_uri" => "https://alchemists.io/projects/tana",
|
16
|
+
"funding_uri" => "https://github.com/sponsors/bkuhlmann",
|
17
|
+
"label" => "Tana",
|
18
|
+
"rubygems_mfa_required" => "true",
|
19
|
+
"source_code_uri" => "https://github.com/bkuhlmann/tana"
|
20
|
+
}
|
21
|
+
|
22
|
+
spec.signing_key = Gem.default_key_path
|
23
|
+
spec.cert_chain = [Gem.default_cert_path]
|
24
|
+
|
25
|
+
spec.required_ruby_version = "~> 3.3"
|
26
|
+
spec.add_dependency "core", "~> 1.0"
|
27
|
+
spec.add_dependency "dry-container", "~> 0.11"
|
28
|
+
spec.add_dependency "dry-monads", "~> 1.6"
|
29
|
+
spec.add_dependency "dry-validation", "~> 1.10"
|
30
|
+
spec.add_dependency "http", "~> 5.1"
|
31
|
+
spec.add_dependency "infusible", "~> 3.0"
|
32
|
+
spec.add_dependency "refinements", "~> 12.0"
|
33
|
+
spec.add_dependency "transactable", "~> 0.10"
|
34
|
+
spec.add_dependency "zeitwerk", "~> 2.6"
|
35
|
+
|
36
|
+
spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
|
37
|
+
spec.files = Dir["*.gemspec", "lib/**/*"]
|
38
|
+
end
|
data.tar.gz.sig
ADDED
Binary file
|