fragment-alpha-sdk 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'faraday'
5
+ require 'faraday/net_http'
6
+ require 'json'
7
+ require 'graphql/client'
8
+ require 'graphql/client/http'
9
+ require 'sorbet-runtime'
10
+ require 'pry'
11
+
12
+ module FragmentGraphQl
13
+ extend T::Sig
14
+ http = GraphQL::Client.const_get(:HTTP).new('https://api.fragment.dev/graphql') do
15
+ extend T::Sig
16
+ sig {params(context: T.untyped).returns(T::Hash[T.untyped, T.untyped])}
17
+ def headers(context)
18
+ { 'Authorization' => 'Bearer %s' % context[:access_token] }
19
+ end
20
+ end
21
+
22
+ Schema = T.let(GraphQL::Client.load_schema("#{__dir__}/fragment.schema.json"), T.untyped)
23
+
24
+ puts File.read("#{__dir__}/fragment.schema.json")
25
+ pry
26
+
27
+ Client = T.let(GraphQL::Client.new(schema: Schema, execute: RDoc::Attr), GraphQL::Client)
28
+
29
+ Queries = T.let(Client.parse(
30
+ File.open("#{__dir__}/queries.graphql").read
31
+ ), T.untyped)
32
+ end
33
+
34
+ # A client for Fragment
35
+ class FragmentClient
36
+ extend T::Sig
37
+
38
+ sig { params(client_id: String, client_secret: String).void }
39
+ def initialize(client_id, client_secret)
40
+ conn = T.let(Faraday.new('https://auth.fragment.dev') do |f|
41
+ f.request :url_encoded
42
+ f.request :authorization, :basic, client_id, client_secret
43
+ f.adapter :net_http
44
+ end, Faraday::Connection)
45
+ @token = T.let(get_token(conn, client_id), String)
46
+ FragmentGraphQl::Queries.constants.each do |q|
47
+ name = q.to_s.gsub(/[a-z]([A-Z])/) do |m|
48
+ format('%<lower>s_%<upper>s', lower: m[0], upper: m[1].downcase)
49
+ end.gsub(/^[A-Z]/, &:downcase)
50
+ define_singleton_method(name) do |v|
51
+ query(FragmentGraphQl::Queries.const_get(q), v)
52
+ end
53
+ end
54
+ end
55
+
56
+ sig {params(query: T.untyped, variables: T.untyped).returns(T.untyped)}
57
+ def query(query, variables)
58
+ FragmentGraphQl::Client.query(query, variables: variables, context: { access_token: @token })
59
+ end
60
+
61
+ private
62
+
63
+ sig { params(conn: Faraday::Connection, client_id: String).returns(String) }
64
+ def get_token(conn, client_id)
65
+ response = conn.post('/oauth2/token') do |req|
66
+ req.body = format('grant_type=client_credentials&scope=https://api.fragment.dev/*&client_id=%s', client_id)
67
+ end
68
+
69
+ T.let(JSON.parse(response.body)['access_token'], String)
70
+ end
71
+ end
@@ -0,0 +1,15 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ # A client for Fragment
5
+ class FragmentClient
6
+ sig { params(variables: { 'ik' => String, 'ledger' => { 'name' => String } }).returns(T::Hash[T.untyped, T.untyped]) }
7
+ def create_ledger(variables); end
8
+
9
+ sig do
10
+ params(variables: { 'ledger' => { 'id' => String },
11
+ 'ledgerAccounts' => T::Array[{ 'ik' => String, 'name' => String,
12
+ 'type' => String }] }).returns(T.untyped)
13
+ end
14
+ def create_ledger_accounts(variables); end
15
+ end
@@ -0,0 +1,129 @@
1
+ mutation CreateLedger($ik: ID!, $ledger: CreateLedgerInput!) {
2
+ createLedger(ik: $ik, ledger: $ledger) {
3
+ ... on CreateLedgerResult {
4
+ ledger {
5
+ id
6
+ name
7
+ }
8
+ isIkReplay
9
+ }
10
+ ... on BadRequestError {
11
+ code
12
+ message
13
+ }
14
+ ... on InternalError {
15
+ code
16
+ message
17
+ }
18
+ }
19
+ }
20
+
21
+ mutation CreateLedgerAccounts(
22
+ $ledger: LedgerMatchInput!
23
+ $ledgerAccounts: [CreateLedgerAccountsInput!]!
24
+ ) {
25
+ createLedgerAccounts(ledger: $ledger, ledgerAccounts: $ledgerAccounts) {
26
+ __typename
27
+ ... on CreateLedgerAccountsResult {
28
+ ledgerAccounts {
29
+ id
30
+ name
31
+ type
32
+ ik
33
+ }
34
+ ikReplays {
35
+ ik
36
+ isIkReplay
37
+ }
38
+ }
39
+ ... on Error {
40
+ code
41
+ message
42
+ }
43
+ }
44
+ }
45
+
46
+ query LedgerEntry($ledgerEntry: LedgerEntryMatchInput!) {
47
+ ledgerEntry(ledgerEntry: $ledgerEntry) {
48
+ id
49
+ date
50
+ posted
51
+ created
52
+ description
53
+ workspaceId
54
+ ledgerId
55
+ orderId
56
+ lines {
57
+ nodes {
58
+ id
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ # copied from https://fragment.dev/api-reference#query-bankTransfer
65
+ query BankTransfer($bankTransfer: BankTransferMatchInput!) {
66
+ bankTransfer(bankTransfer: $bankTransfer) {
67
+ id
68
+ description
69
+ status
70
+ order {
71
+ id
72
+ description
73
+ entryIds
74
+ stateMachine
75
+ }
76
+ }
77
+ }
78
+
79
+ # copied from https://fragment.dev/api-reference#query-ledger
80
+ query Ledger($ledger: LedgerMatchInput!) {
81
+ ledger(ledger: $ledger) {
82
+ id
83
+ name
84
+ type
85
+ workspaceId
86
+ created
87
+ balanceUTCOffset
88
+ ledgerAccounts {
89
+ nodes {
90
+ id
91
+ ledgerId
92
+ type
93
+ }
94
+ pageInfo {
95
+ hasNextPage
96
+ }
97
+ }
98
+ ledgerEntries {
99
+ nodes {
100
+ id
101
+ date
102
+ description
103
+ }
104
+ pageInfo {
105
+ hasNextPage
106
+ }
107
+ }
108
+ }
109
+ }
110
+
111
+ # copied from https://fragment.dev/api-reference#mutation-addLedgerEntry
112
+ mutation AddLedgerEntry($ik: ID!, $entry: LedgerEntryInput!) {
113
+ addLedgerEntry(ik: $ik, entry: $entry) {
114
+ ... on AddLedgerEntryResult {
115
+ entry {
116
+ id
117
+ date
118
+ }
119
+ }
120
+ ... on BadRequestError {
121
+ message
122
+ code
123
+ }
124
+ ... on InternalError {
125
+ message
126
+ code
127
+ }
128
+ }
129
+ }
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fragment-alpha-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - fragment
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 1980-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: graphql-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.18'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.18'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sorbet-runtime
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ description:
56
+ email: snoble@fragment.dev
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/fragment.schema.json
62
+ - lib/fragment_client.rb
63
+ - lib/fragment_client.rbi
64
+ - lib/queries.graphql
65
+ homepage: https://fragment.dev
66
+ licenses:
67
+ - Nonstandard
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 3.0.0
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubygems_version: 3.3.11
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: an alpha version for the fragment client sdk
88
+ test_files: []