okay 4.0.0 → 5.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: 9c80a7352326cc10efc3054833ae3d3fd81151d16a1dee650b605c8657387710
4
- data.tar.gz: 9606264cc4d9ef40d7e7a1807ea0c73bf08716d26285edc203e98cc231d4b5e5
3
+ metadata.gz: 5954167c96379ab1ee2a94068253b417f17bdea70a4d9b700b8e94e8e59c5495
4
+ data.tar.gz: fad91f6ef89734072991b0985763b98a0c6195d7b0176d76ee3d401dbca645ae
5
5
  SHA512:
6
- metadata.gz: 7a199e77c5a83901da60cd19e4d7938d3e599af3f2e16157a626c2954f6ad5fee49b7804473cf5c918c0380c87e1af08c74201e112a30108c6bad4e5f5d79a74
7
- data.tar.gz: c00aa59fdefcf05ca3227a38ad557e82ed0f7a810db9cf0019580b3bedca10fb6d6e61fa3295e75923817571861b17bef77a68369610c9332f2eda45c9608260
6
+ metadata.gz: 96337777a6f774ff282af8f883b11411977b14ee43e277d1fb239dfe85a2ce805451ffcfdcc6f65608d7e3ac552bf82bdbce6138ed0bd88278901513f6ddb805
7
+ data.tar.gz: a4cb525e1ab90e43d56a40e52641ef5143cc0a8e14554f47398b8b9d1bc39c80d4218683b38ef699cb13daed58835be83b64d7bebc68ab3213c56fe89bb63c2f
data/README.md CHANGED
@@ -65,6 +65,26 @@ Okay::HTTP.post("https://httpbin.org/post", form_data: { "foo" => "bar" })
65
65
  Okay::HTTP.post("https://httpbin.org/post", data: "hello, world!")
66
66
  ```
67
67
 
68
+ ### GraphQL
69
+
70
+ ```ruby
71
+ require "okay/graphql"
72
+ require "json"
73
+
74
+ query = GraphQL.query {
75
+ viewer {
76
+ login
77
+ }
78
+ }
79
+
80
+ response = request.submit!(:github, {bearer_token: ENV["DEMO_GITHUB_TOKEN"]})
81
+ JSON.parse(response.body)
82
+ # =>
83
+ {"data" =>
84
+ {"viewer" =>
85
+ {"login" => "duckinator"}}}
86
+ ```
87
+
68
88
  ## Development
69
89
 
70
90
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,124 @@
1
+ require "okay/version"
2
+ require "okay/http"
3
+ require "json"
4
+
5
+ module Okay
6
+ # Example usage:
7
+ #
8
+ # require "okay/graphql"
9
+ # require "pp"
10
+ # query = GraphQL.query {
11
+ # viewer {
12
+ # login
13
+ # }
14
+ # }
15
+ # response = request.submit!(:github, {bearer_token: ENV["DEMO_GITHUB_TOKEN"]})
16
+ # pp JSON.parse(response.body)
17
+ class GraphQL
18
+ Container = Struct.new(:value) do
19
+ def inspect
20
+ value
21
+ end
22
+ end
23
+
24
+ class QueryDSL
25
+ def initialize(indent = 0, &query)
26
+ @query = ""
27
+ @indent = indent
28
+ @indent_str = " " * indent
29
+ instance_exec(&query)
30
+ end
31
+
32
+ def method_missing(name, *args, **kwargs, &block)
33
+ query_part = @indent_str + name.to_s
34
+ if args.length > 0 || kwargs.length > 0
35
+ query_part += "("
36
+
37
+ query_args = []
38
+ query_args += args unless args.empty?
39
+ query_args += kwargs.map { |k,v|
40
+ [k,v.inspect].join(": ")
41
+ }
42
+ query_part += query_args.join(", ")
43
+
44
+ query_part += ")"
45
+ end
46
+
47
+ if block
48
+ query_part += " {\n"
49
+ query_part += QueryDSL.new(@indent + 2, &block).to_s
50
+ query_part += @indent_str + "}"
51
+ end
52
+
53
+ @query += "#{query_part}\n"
54
+ end
55
+
56
+ def to_s
57
+ @query
58
+ end
59
+ end
60
+
61
+ class Query
62
+ def initialize(&query)
63
+ @query = QueryDSL.new(&query)
64
+ end
65
+
66
+ def to_s
67
+ "query {\n" +
68
+ @query.to_s.gsub(/^/, " ") +
69
+ "}"
70
+ end
71
+
72
+ def submit!(url, headers = {})
73
+ if url == :github
74
+ url = "https://api.github.com/graphql"
75
+
76
+ bearer_token = headers[:bearer_token]
77
+
78
+ if bearer_token.nil?
79
+ raise ArgumentError, "missing keyword: bearer_token"
80
+ end
81
+
82
+ headers = default_github_headers(bearer_token).merge(headers)
83
+ end
84
+
85
+ data = {
86
+ "query" => to_s
87
+ }.to_json
88
+ Okay::HTTP.post(url, headers: headers, data: data)
89
+ end
90
+
91
+ private
92
+ def default_github_headers(token)
93
+ {
94
+ "Accept" => "application/vnd.github.v4.idl",
95
+ "Authorization" => "bearer #{token}",
96
+ }
97
+ end
98
+ end
99
+
100
+ def self.query(&query_)
101
+ Query.new(&query_)
102
+ end
103
+ end
104
+ end
105
+
106
+ class Object
107
+ def self.const_missing(name)
108
+ # HACK: if const_missing is called inside Okay::GraphQL#initialize,
109
+ # we wrap the constant name in a GraphQL::Container.
110
+ # Otherwise, we re-raise the exception.
111
+ if caller[2] =~ /^#{Regexp.escape(__FILE__)}:\d+:in `initialize'$/
112
+ Okay::GraphQL::Container.new(name.to_s)
113
+ else
114
+ # Create an exception equivalent to what's normally raised.
115
+ exception = NameError.new("uninitialized constant #{name.to_s}")
116
+
117
+ # Preserve the backtrace.
118
+ exception.set_backtrace(caller)
119
+
120
+ # Raise the exception.
121
+ raise exception
122
+ end
123
+ end
124
+ end
data/lib/okay/http.rb CHANGED
@@ -1,7 +1,7 @@
1
- require 'okay/version'
2
- require 'openssl/better_defaults'
3
- require 'net/https'
4
- require 'cacert'
1
+ require "okay/version"
2
+ require "openssl/better_defaults"
3
+ require "net/https"
4
+ require "cacert"
5
5
 
6
6
  Cacert.set_in_env
7
7
 
@@ -60,7 +60,7 @@ module Okay
60
60
 
61
61
  options = {
62
62
  # If the URI starts with "https://", enable SSL/TLS.
63
- use_ssl: (uri.scheme == 'https')
63
+ use_ssl: (uri.scheme == "https")
64
64
  }
65
65
 
66
66
  # Net::HTTP.start() keeps a connection to the host alive
@@ -88,7 +88,7 @@ module Okay
88
88
  # Follow a redirect.
89
89
  # Decrements +redirect_limit+ while doing so, to avoid redirect loops.
90
90
  # NOTE: Does not handle HTTP 307. https://httpstatuses.com/307
91
- send_request(:Get, response['location'], parameters, body, headers, redirect_limit - 1)
91
+ send_request(:Get, response["location"], parameters, body, headers, redirect_limit - 1)
92
92
  else
93
93
  response
94
94
  end
data/lib/okay/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Okay
2
- VERSION = "4.0.0"
2
+ VERSION = "5.0.0"
3
3
  end
data/okay.gemspec CHANGED
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "bundler", "~> 1.15"
28
28
  spec.add_development_dependency "rake", "~> 10.0"
29
29
  spec.add_development_dependency "rspec", "~> 3.0"
30
+ spec.add_development_dependency "pry"
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: okay
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ellen Marie Dash
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-08 00:00:00.000000000 Z
11
+ date: 2017-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: openssl-better_defaults
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Okay, minimalist implementations of common utilities in Ruby. E.g., HTTP
84
98
  fetchers.
85
99
  email:
@@ -99,6 +113,7 @@ files:
99
113
  - bin/console
100
114
  - bin/setup
101
115
  - lib/okay.rb
116
+ - lib/okay/graphql.rb
102
117
  - lib/okay/http.rb
103
118
  - lib/okay/version.rb
104
119
  - okay.gemspec
@@ -122,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
137
  version: '0'
123
138
  requirements: []
124
139
  rubyforge_project:
125
- rubygems_version: 2.7.2
140
+ rubygems_version: 2.7.3
126
141
  signing_key:
127
142
  specification_version: 4
128
143
  summary: Okay, minimalist implementations of common utilities.