wcc-jsonapi 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,244 +1,66 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wcc-jsonapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Watermark Dev
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-19 00:00:00.000000000 Z
11
+ date: 2022-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: openapi_parser
14
+ name: actionpack-action_caching
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.11.1
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '1.0'
19
+ version: '1.2'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 0.11.1
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '1.0'
33
- - !ruby/object:Gem::Dependency
34
- name: bundler
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '1.6'
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '1.6'
47
- - !ruby/object:Gem::Dependency
48
- name: dotenv
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: 0.10.0
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: 0.10.0
61
- - !ruby/object:Gem::Dependency
62
- name: faraday
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '0.9'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '0.9'
26
+ version: '1.2'
75
27
  - !ruby/object:Gem::Dependency
76
- name: guard
28
+ name: rails
77
29
  requirement: !ruby/object:Gem::Requirement
78
30
  requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '2.15'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '2.15'
89
- - !ruby/object:Gem::Dependency
90
- name: guard-rspec
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '4.7'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '4.7'
103
- - !ruby/object:Gem::Dependency
104
- name: guard-rubocop
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '1.3'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '1.3'
117
- - !ruby/object:Gem::Dependency
118
- name: httplog
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '1.0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '1.0'
131
- - !ruby/object:Gem::Dependency
132
- name: rake
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '12.3'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: '12.3'
145
- - !ruby/object:Gem::Dependency
146
- name: rspec
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '3.3'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '3.3'
159
- - !ruby/object:Gem::Dependency
160
- name: rspec_junit_formatter
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: 0.3.0
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: 0.3.0
173
- - !ruby/object:Gem::Dependency
174
- name: rubocop
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - '='
178
- - !ruby/object:Gem::Version
179
- version: 0.69.0
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - '='
185
- - !ruby/object:Gem::Version
186
- version: 0.69.0
187
- - !ruby/object:Gem::Dependency
188
- name: typhoeus
189
- requirement: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - "~>"
192
- - !ruby/object:Gem::Version
193
- version: '1.3'
194
- type: :development
195
- prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - "~>"
199
- - !ruby/object:Gem::Version
200
- version: '1.3'
201
- - !ruby/object:Gem::Dependency
202
- name: webmock
203
- requirement: !ruby/object:Gem::Requirement
204
- requirements:
205
- - - "~>"
31
+ - - ">="
206
32
  - !ruby/object:Gem::Version
207
- version: '3.0'
208
- type: :development
33
+ version: '4'
34
+ type: :runtime
209
35
  prerelease: false
210
36
  version_requirements: !ruby/object:Gem::Requirement
211
37
  requirements:
212
- - - "~>"
38
+ - - ">="
213
39
  - !ruby/object:Gem::Version
214
- version: '3.0'
215
- description: Generates ruby clients for OpenAPI endpoints conformingto the JsonAPI
216
- convention
40
+ version: '4'
41
+ description: Helpers for creating APIs which conform to the JsonAPI standard
217
42
  email:
218
43
  - dev@watermark.org
219
44
  executables: []
220
45
  extensions: []
221
46
  extra_rdoc_files: []
222
47
  files:
223
- - ".gitignore"
224
- - Gemfile
225
- - LICENSE.txt
226
48
  - README.md
227
49
  - Rakefile
228
- - lib/generators/wcc/json_api/client_generator.rb
229
- - lib/wcc/json_api/active_record_shim.rb
230
- - lib/wcc/json_api/base_client.rb
231
- - lib/wcc/json_api/base_client/api_error.rb
232
- - lib/wcc/json_api/base_client/base_response.rb
233
- - lib/wcc/json_api/base_client/http_adapter.rb
234
- - lib/wcc/json_api/base_client/typhoeus_adapter.rb
235
- - lib/wcc/json_api/version.rb
236
- - wcc-jsonapi.gemspec
237
- homepage: https://github.com/watermarkchurch/wcc-api
50
+ - lib/wcc-jsonapi.rb
51
+ - lib/wcc/jsonapi.rb
52
+ - lib/wcc/jsonapi/concerns/api_action_caching.rb
53
+ - lib/wcc/jsonapi/concerns/pagination_helper.rb
54
+ - lib/wcc/jsonapi/concerns/serializer_with_caching.rb
55
+ - lib/wcc/jsonapi/rspec.rb
56
+ - lib/wcc/jsonapi/rspec/api_cache_control_examples.rb
57
+ - lib/wcc/jsonapi/rspec/snapshot_helper.rb
58
+ - lib/wcc/jsonapi/version.rb
59
+ homepage: https://www.github.com/watermarkchurch/paper-signs
238
60
  licenses:
239
61
  - MIT
240
62
  metadata: {}
241
- post_install_message:
63
+ post_install_message:
242
64
  rdoc_options: []
243
65
  require_paths:
244
66
  - lib
@@ -253,9 +75,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
75
  - !ruby/object:Gem::Version
254
76
  version: '0'
255
77
  requirements: []
256
- rubyforge_project:
257
- rubygems_version: 2.5.2.3
258
- signing_key:
78
+ rubygems_version: 3.1.6
79
+ signing_key:
259
80
  specification_version: 4
260
- summary: Generates ruby clients for OpenAPI endpoints conformingto the JsonAPI convention
81
+ summary: Helpers for creating APIs which conform to the JsonAPI standard
261
82
  test_files: []
data/.gitignore DELETED
@@ -1,14 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Specify your gem's dependencies in wcc-api.gemspec
6
- gemspec
data/LICENSE.txt DELETED
File without changes
@@ -1,9 +0,0 @@
1
- module WCC::JsonAPI
2
- class ClientGenerator < Rails::Generators::Base
3
- desc "Generates a client from an OpenAPI specification"
4
-
5
- def do_something
6
- puts self.inspect
7
- end
8
- end
9
- end
@@ -1,54 +0,0 @@
1
- module WCC::API::ActiveRecordShim
2
- def self.included(base)
3
- base.public_send :include, InstanceMethods
4
- base.extend ClassMethods
5
- end
6
-
7
- module InstanceMethods
8
- def attributes
9
- raw.keys.each_with_object({}) do |key, h|
10
- next unless respond_to?(key)
11
-
12
- val = public_send(key)
13
- h[key] =
14
- if val.is_a? Array
15
- val.map { |v| v.respond_to?(:to_h) ? v.to_h : v }
16
- else
17
- val.respond_to?(:to_h) ? val.to_h : val
18
- end
19
- end
20
- end
21
- end
22
-
23
- module ClassMethods
24
- def model_name
25
- name
26
- end
27
-
28
- def table_name
29
- endpoint
30
- end
31
-
32
- def unscoped
33
- yield
34
- end
35
-
36
- def find_in_batches(options, &block)
37
- options = options ? options.dup : {}
38
- batch_size = options.delete(:batch_size) || 1000
39
-
40
- filter = {
41
- limit: batch_size,
42
- offset: options.delete(:start) || 0
43
- }
44
-
45
- find_all(filter).each_slice(batch_size, &block)
46
- end
47
-
48
- def where(**conditions)
49
- # TODO: return a Query object that implements more of the ActiveRecord query interface
50
- # https://guides.rubyonrails.org/active_record_querying.html#conditions
51
- find_all(conditions)
52
- end
53
- end
54
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module WCC::JsonAPI
4
- class BaseClient
5
- class ApiError < StandardError
6
- attr_reader :response
7
-
8
- def self.[](code)
9
- case code
10
- when 404
11
- NotFoundError
12
- else
13
- ApiError
14
- end
15
- end
16
-
17
- def initialize(response)
18
- @response = response
19
- super(response.error_message)
20
- end
21
- end
22
-
23
- class NotFoundError < ApiError
24
- end
25
- end
26
- end
@@ -1,127 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'forwardable'
4
- require_relative 'api_error'
5
-
6
- module WCC::JsonAPI
7
- class BaseClient
8
- class BaseResponse
9
- extend ::Forwardable
10
-
11
- attr_reader :raw_response
12
- attr_reader :raw_body
13
- attr_reader :client
14
- attr_reader :request
15
-
16
- def_delegators :raw_response, :status, :headers
17
- alias_method :code, :status
18
-
19
- def body
20
- @body ||= ::JSON.parse(raw_body)
21
- end
22
- alias_method :to_json, :body
23
-
24
- def initialize(client, request, raw_response)
25
- @client = client
26
- @request = request
27
- @raw_response = raw_response
28
- @raw_body = raw_response.body.to_s
29
- end
30
-
31
- def skip
32
- body.dig('meta', 'skip')
33
- end
34
-
35
- def count
36
- body.dig('meta', 'total')
37
- end
38
-
39
- def data
40
- body['data']
41
- end
42
-
43
- def links
44
- @links ||= OpenStruct.new(body['links'])
45
- end
46
-
47
- def collection_response?
48
- data.is_a?(Array) ? true : false
49
- end
50
-
51
- def error_message
52
- parsed_message =
53
- begin
54
- body.dig('error', 'message') || body.dig('message')
55
- rescue ::JSON::ParserError
56
- nil
57
- end
58
- parsed_message || "#{code}: #{raw_response.body}"
59
- end
60
-
61
- def next_page?
62
- return false unless collection_response?
63
- return false if count.nil?
64
-
65
- page_items.length + skip < count
66
- end
67
-
68
- def next_page
69
- return unless next_page?
70
-
71
- @next_page ||= @client.get(
72
- @request[:url],
73
- (@request[:query] || {}).merge(next_page_query)
74
- )
75
- @next_page.assert_ok!
76
- end
77
-
78
- def assert_ok!
79
- return self if code >= 200 && code < 300
80
-
81
- raise ApiError[code], self
82
- end
83
-
84
- # This method has a bit of complexity that is better kept in one location
85
- def each_page(&block)
86
- raise ArgumentError, 'Not a collection response' unless collection_response?
87
-
88
- ret =
89
- Enumerator.new do |y|
90
- y << self
91
-
92
- if next_page?
93
- next_page.each_page.each do |page|
94
- y << page
95
- end
96
- end
97
- end
98
-
99
- if block_given?
100
- ret.map(&block)
101
- else
102
- ret.lazy
103
- end
104
- end
105
-
106
- def items
107
- return unless collection_response?
108
-
109
- each_page.flat_map(&:page_items)
110
- end
111
-
112
- def first
113
- raise ArgumentError, 'Not a collection response' unless collection_response?
114
-
115
- page_items.first
116
- end
117
-
118
- def next_page_query
119
- return unless collection_response?
120
-
121
- {
122
- skip: page_items.length + skip
123
- }
124
- end
125
- end
126
- end
127
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- gem 'http'
4
- require 'http'
5
-
6
- module WCC::JsonAPI
7
- class BaseClient
8
- class HttpAdapter
9
- def call(url, query, headers = {}, proxy = {})
10
- if proxy[:host]
11
- HTTP[headers].via(proxy[:host], proxy[:port], proxy[:username], proxy[:password])
12
- .get(url, params: query)
13
- else
14
- HTTP[headers].get(url, params: query)
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'forwardable'
4
- gem 'typhoeus'
5
- require 'typhoeus'
6
-
7
- class WCC::JsonAPI::BaseClient::TyphoeusAdapter
8
- def get(url, params = {}, headers = {})
9
- req = OpenStruct.new(params: params, headers: headers)
10
- yield req if block_given?
11
- Response.new(
12
- Typhoeus.get(
13
- url,
14
- params: req.params,
15
- headers: req.headers
16
- )
17
- )
18
- end
19
-
20
- def post(url, body, headers = {})
21
- Response.new(
22
- Typhoeus.post(
23
- url,
24
- body: body.is_a?(String) ? body : body.to_json,
25
- headers: headers
26
- )
27
- )
28
- end
29
-
30
- def put(url, body, headers = {})
31
- Response.new(
32
- Typhoeus.put(
33
- url,
34
- body: body.is_a?(String) ? body : body.to_json,
35
- headers: headers
36
- )
37
- )
38
- end
39
-
40
- def delete(url, query = {}, headers = {})
41
- Response.new(
42
- Typhoeus.delete(
43
- url,
44
- headers: headers
45
- )
46
- )
47
- end
48
-
49
- class Response < SimpleDelegator
50
- def raw
51
- __getobj__
52
- end
53
-
54
- def to_s
55
- body&.to_s
56
- end
57
-
58
- def status
59
- code
60
- end
61
- end
62
- end
63
-