mj 0.6.2 → 0.7.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: 4f73fffd1a785c75120ffed30d970ffbc9d64f525a5a5729c814a785f7c0868e
4
- data.tar.gz: 8a09ecd20bb4bae4e54f07d30f09c9fa534b4d2c6090d87353c3297cb1bb2210
3
+ metadata.gz: 59cf5e3a74d7c41f0b5b2c3789d85987b3393eccd110dc4741a3bdff59058827
4
+ data.tar.gz: c0772655f097653bbbd719e1791791e97bd30349973febf410ae54be24f470ae
5
5
  SHA512:
6
- metadata.gz: 90f2712ab6a67d83f45ce62f4a4213e0b85404ead8f218263771095ef09121dcaf29732e81a17e459be7d2788bb836f172ec34bb6d90e3e697f49599075378eb
7
- data.tar.gz: d05317d65dd3fb88eb5379f3e0e4439a2264c5b40d6a2276fec219058668748f852ea4474468fc7a56f527357ea5b8808d15a541bbb9558203ca6602edaec50e
6
+ metadata.gz: 5f385ad6f1354b967cde4c98e63b96b1e918c406bd6009e676bac8d61f30f4df1ebffe73d3b34ac35c246f383338b0224cf7bf1d3d606176fe7f3ac95d40df74
7
+ data.tar.gz: 4ce923b46dbf190b9b233512fae4fc9163a7853926e29aa4e7f9f3cfad1ddfd274be89f0c1052b4dcaa4bde42deced0cf9e7cf3ce425154153b2dc2212202c74
data/Gemfile.lock CHANGED
@@ -1,25 +1,37 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mj (0.6.2)
4
+ mj (0.7.0)
5
+ koine-rest_client
5
6
  thor (~> 1.2.1)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ addressable (2.8.6)
12
+ public_suffix (>= 2.0.2, < 6.0)
10
13
  ast (2.4.2)
11
14
  awesome_print (1.9.2)
12
15
  coderay (1.1.3)
13
16
  diff-lcs (1.5.0)
14
17
  docile (1.4.0)
18
+ httparty (0.21.0)
19
+ mini_mime (>= 1.0.0)
20
+ multi_xml (>= 0.5.2)
21
+ koine-rest_client (1.1.1)
22
+ addressable (>= 2.3)
23
+ httparty (>= 0.17.0)
15
24
  koine-test_runner (0.4.0)
16
25
  method_source (1.0.0)
26
+ mini_mime (1.1.5)
27
+ multi_xml (0.6.0)
17
28
  parallel (1.21.0)
18
29
  parser (3.1.1.0)
19
30
  ast (~> 2.4.1)
20
31
  pry (0.14.2)
21
32
  coderay (~> 1.1)
22
33
  method_source (~> 1.0)
34
+ public_suffix (5.0.4)
23
35
  rainbow (3.1.1)
24
36
  rake (13.0.6)
25
37
  regexp_parser (2.2.1)
data/README.md CHANGED
@@ -28,6 +28,38 @@ Or install it yourself as:
28
28
  mj help
29
29
  ```
30
30
 
31
+ ### GraphQl
32
+
33
+ ```
34
+ bundle exec mj graphql query_file AccountUsers.graphql | jq
35
+ ```
36
+
37
+ Your graqphql fiel is a regular file with variables at the top:
38
+
39
+ ```graphql
40
+ # gql-endpoint: http://api.myapi.me/graphql
41
+ # gql-header: Authorization: Bearer cb923f33617877578961a19cf4566ec2
42
+ # gql-header: Content-Type: application/json
43
+ # gql-header: Cookie: ajs_user_id=ae3948ee-345e-47f2-8e2f-54277858e2c2; ajs_anonymous_id=30880a34-276e-4a86-a1d3-8869d1669199; _ga=GA1.1.649149230.1706868690; browser_id=14af87a406ec54cbe9804ea25c8f0a84; _ga_TZKSP5TS45=GS1.1.1708606615.26.1.1708606911.0.0.0
44
+ # gql-variables: { "input": { "id": "yTXuIgoU88LKUNDLSVPFFjOSkgxlyyuSrNki3GY=" } }
45
+
46
+ query QueryAccountUsers(
47
+ $input: AccountInput!
48
+ ) {
49
+ account(input: $input) {
50
+ users {
51
+ id
52
+ name
53
+ }
54
+ errors {
55
+ path
56
+ message
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+
31
63
  ### Alternative file
32
64
 
33
65
  Examples:
data/lib/mj/cli.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "thor"
4
4
  require_relative "version"
5
5
  require_relative "alternative_file/thor_command"
6
+ require_relative "graphql/thor_command"
6
7
 
7
8
  module Mj
8
9
  class Cli < Thor
@@ -17,5 +18,8 @@ module Mj
17
18
 
18
19
  desc "alternative_file", "Lists alternative files"
19
20
  subcommand "alternative_file", AlternativeFile::ThorCommand
21
+
22
+ desc "graphql", "CLI client for GraphQL"
23
+ subcommand "graphql", GraphQL::ThorCommand
20
24
  end
21
25
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "koine/rest_client"
4
+
5
+ module Mj
6
+ module GraphQL
7
+ class Client
8
+ def send(request)
9
+ base_url = request.endpoint.split("/graphql").first
10
+ base_request = Koine::RestClient::Request.new(base_url: base_url)
11
+ http_client = Koine::RestClient::Client.new(base_request: base_request)
12
+ http_client.post("/graphql", request.to_h, headers: request.headers)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mj
4
+ module GraphQL
5
+ module Commands
6
+ class QueryFileCommand
7
+ attr_reader :file
8
+ attr_reader :options
9
+
10
+ def initialize(file, options)
11
+ @file = file
12
+ @options = options
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../request_factory"
4
+ require_relative "../client"
5
+
6
+ module Mj
7
+ module GraphQL
8
+ module Commands
9
+ class QueryFileCommandHandler
10
+ def handle(command)
11
+ request = RequestFactory.new.from_file(command.file)
12
+ Client.new.send(request)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mj
4
+ module GraphQL
5
+ class Request
6
+ attr_reader :endpoint, :headers, :query, :variables
7
+
8
+ def initialize(endpoint: nil, query: nil, variables: {}, headers: {})
9
+ @endpoint = endpoint
10
+ @query = query
11
+ @variables = variables
12
+ @headers = headers
13
+ end
14
+
15
+ def with_header(name, value)
16
+ with(:headers, headers.merge(name => value))
17
+ end
18
+
19
+ def with_variables(variables)
20
+ with(:variables, variables)
21
+ end
22
+
23
+ def to_h
24
+ {
25
+ query: query,
26
+ variables: variables
27
+ }
28
+ end
29
+
30
+ private
31
+
32
+ def with(variable, value)
33
+ config = {
34
+ endpoint: endpoint,
35
+ query: query,
36
+ variables: variables,
37
+ headers: headers
38
+ }.merge(variable => value)
39
+
40
+ self.class.new(**config)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "request"
4
+
5
+ module Mj
6
+ module GraphQL
7
+ class RequestFactory
8
+ def from_file(file) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
9
+ contents = File.read(file)
10
+ comments = contents.split("\n").take_while { |line| line.match(/^#/) }.join("\n")
11
+ query = contents.split("\n").drop_while { |line| line.match(/^#/) }.join("\n")
12
+ endpoint = comments.match(/# gql-endpoint: (.+)/)&.captures&.first
13
+
14
+ request = Request.new(query: query, endpoint: endpoint)
15
+
16
+ headers = comments.split("\n")
17
+ .select { |line| line.match(/^# gql-header:/) }
18
+ .map { |line| line.split("gql-header:")[1..].join.strip }
19
+
20
+ headers.map do |value|
21
+ values = value.split(":").map(&:strip)
22
+ request = request.with_header(*values)
23
+ end
24
+
25
+ variables_string = comments.match(/# gql-variables:\s?(.+)/)&.captures&.first
26
+
27
+ if variables_string
28
+ variables = JSON.parse(variables_string)
29
+ request = request.with_variables(variables)
30
+ end
31
+
32
+ request
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "commands/query_file_command_handler"
4
+ require_relative "commands/query_file_command"
5
+ require "json"
6
+
7
+ module Mj
8
+ module GraphQL
9
+ class ThorCommand < Thor
10
+ desc "query_file <file>", "Execute a query based on a .graqphql file"
11
+ def query_file(file)
12
+ handler = Commands::QueryFileCommandHandler.new
13
+ data = handler.handle(Commands::QueryFileCommand.new(file, options))
14
+ $stdout.puts JSON.generate(data)
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/mj/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mj
4
- VERSION = "0.6.2"
4
+ VERSION = "0.7.0"
5
5
  end
data/mj.gemspec CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ["lib"]
33
33
 
34
+ spec.add_dependency "koine-rest_client"
34
35
  spec.add_dependency "thor", "~> 1.2.1"
35
36
 
36
37
  # For more information and examples about making a new gem, check out our
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mj
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcelo Jacobus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-05 00:00:00.000000000 Z
11
+ date: 2024-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: koine-rest_client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: thor
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +73,12 @@ files:
59
73
  - lib/mj/alternative_file/resolvers/ruby/view_component_resolver.rb
60
74
  - lib/mj/alternative_file/thor_command.rb
61
75
  - lib/mj/cli.rb
76
+ - lib/mj/graphql/client.rb
77
+ - lib/mj/graphql/commands/query_file_command.rb
78
+ - lib/mj/graphql/commands/query_file_command_handler.rb
79
+ - lib/mj/graphql/request.rb
80
+ - lib/mj/graphql/request_factory.rb
81
+ - lib/mj/graphql/thor_command.rb
62
82
  - lib/mj/version.rb
63
83
  - mj.gemspec
64
84
  - sig/mj.rbs