dev_ruby 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +9 -0
- data/Gemfile.lock +15 -0
- data/lib/dev_ruby/client.rb +31 -0
- data/lib/dev_ruby/collection.rb +21 -0
- data/lib/dev_ruby/error.rb +5 -0
- data/lib/dev_ruby/helpers.rb +11 -0
- data/lib/dev_ruby/objects/article.rb +8 -0
- data/lib/dev_ruby/objects/base_object.rb +24 -0
- data/lib/dev_ruby/resources/articles_resource.rb +167 -0
- data/lib/dev_ruby/resources/base_resource.rb +49 -0
- data/lib/dev_ruby/version.rb +1 -1
- data/lib/dev_ruby.rb +14 -2
- metadata +9 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c72c665418cd3f98071b63f5192ca1b74bc1b0cb3805baf8bcb0908de56f5dc0
|
4
|
+
data.tar.gz: 3634d40cf94496c311baaac15b82262d05c7a171eb1e72ebcd6db0287eb1da30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9b600c9fbff1e4f974641774ea691153d6b177f7e6ba924895fd2f3ad581193a7e0374c586eef5317f51b8589df73ed2912605529a626ad91c9a5dfa484aad4
|
7
|
+
data.tar.gz: 1ff3ba0012d7a8cc59cf0a8daf8fcb655befa2f197ceaceadb5bee7900e1b0aefc84bacf8df7deeb81c752f925ca4670c2fc7faba79d5a2c022df2572a61c5ca
|
data/Gemfile
CHANGED
@@ -10,3 +10,12 @@ gem 'rake', '~> 13.0'
|
|
10
10
|
gem 'minitest', '~> 5.0'
|
11
11
|
|
12
12
|
gem 'rubocop', '~> 1.21'
|
13
|
+
|
14
|
+
# HTTP/REST API client library [https://github.com/lostisland/faraday]
|
15
|
+
gem 'faraday', '~> 2.2'
|
16
|
+
|
17
|
+
# Common monads for Ruby [https://github.com/dry-rb/dry-monads]
|
18
|
+
gem 'dry-monads', '~> 1.4'
|
19
|
+
|
20
|
+
# Pretty print Ruby objects with proper indentation and colors [https://github.com/awesome-print/awesome_print]
|
21
|
+
gem 'awesome_print'
|
data/Gemfile.lock
CHANGED
@@ -7,6 +7,17 @@ GEM
|
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
|
+
awesome_print (1.9.2)
|
11
|
+
concurrent-ruby (1.1.10)
|
12
|
+
dry-core (0.7.1)
|
13
|
+
concurrent-ruby (~> 1.0)
|
14
|
+
dry-monads (1.4.0)
|
15
|
+
concurrent-ruby (~> 1.0)
|
16
|
+
dry-core (~> 0.7)
|
17
|
+
faraday (2.3.0)
|
18
|
+
faraday-net_http (~> 2.0)
|
19
|
+
ruby2_keywords (>= 0.0.4)
|
20
|
+
faraday-net_http (2.0.2)
|
10
21
|
minitest (5.15.0)
|
11
22
|
parallel (1.22.1)
|
12
23
|
parser (3.1.2.0)
|
@@ -27,13 +38,17 @@ GEM
|
|
27
38
|
rubocop-ast (1.17.0)
|
28
39
|
parser (>= 3.1.1.0)
|
29
40
|
ruby-progressbar (1.11.0)
|
41
|
+
ruby2_keywords (0.0.5)
|
30
42
|
unicode-display_width (2.1.0)
|
31
43
|
|
32
44
|
PLATFORMS
|
33
45
|
arm64-darwin-21
|
34
46
|
|
35
47
|
DEPENDENCIES
|
48
|
+
awesome_print
|
36
49
|
dev_ruby!
|
50
|
+
dry-monads (~> 1.4)
|
51
|
+
faraday (~> 2.2)
|
37
52
|
minitest (~> 5.0)
|
38
53
|
rake (~> 13.0)
|
39
54
|
rubocop (~> 1.21)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevRuby
|
4
|
+
class Client
|
5
|
+
BASE_URL = 'https://dev.to/api'
|
6
|
+
API_KEY = 'api-key'
|
7
|
+
|
8
|
+
attr_reader :api_key, :adapter
|
9
|
+
|
10
|
+
def initialize(api_key:, adapter: Faraday.default_adapter, stubs: nil)
|
11
|
+
@api_key = api_key
|
12
|
+
@adapter = adapter
|
13
|
+
|
14
|
+
# Test stubs for requests
|
15
|
+
@stubs = stubs
|
16
|
+
end
|
17
|
+
|
18
|
+
def articles
|
19
|
+
DevRuby::Resources::ArticlesResource.new(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
def connection
|
23
|
+
@connection ||= Faraday.new(BASE_URL) do |conn|
|
24
|
+
conn.headers[API_KEY] = api_key
|
25
|
+
conn.request :json
|
26
|
+
conn.response :json, content_type: 'application/json'
|
27
|
+
conn.adapter adapter, @stubs
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DevRuby
|
4
|
+
class Collection
|
5
|
+
attr_reader :page, :per_page, :next_page, :prev_page, :data
|
6
|
+
|
7
|
+
def self.from_response(response:, type:, params:)
|
8
|
+
new(data: response.body.map { |attrs| type.new(attrs) },
|
9
|
+
page: params[:page],
|
10
|
+
per_page: params[:per_page])
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(data:, page:, per_page:)
|
14
|
+
@data = data
|
15
|
+
@page = page
|
16
|
+
@per_page = per_page
|
17
|
+
@next_page = data.count.positive? ? (page + 1) : nil
|
18
|
+
@prev_page = page.positive? ? (page - 1) : nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module DevRuby
|
6
|
+
module Objects
|
7
|
+
class BaseObject < OpenStruct
|
8
|
+
def initialize(attributes)
|
9
|
+
super to_ostruct(attributes)
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_ostruct(obj)
|
13
|
+
case obj
|
14
|
+
when Hash
|
15
|
+
OpenStruct.new(obj.transform_values { |val| to_ostruct(val) })
|
16
|
+
when Array
|
17
|
+
obj.map { |o| to_ostruct(o) }
|
18
|
+
else # Assumed to be a primitive value
|
19
|
+
obj
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
4
|
+
module DevRuby
|
5
|
+
module Resources
|
6
|
+
class ArticlesResource < BaseResource
|
7
|
+
attr_reader :client
|
8
|
+
|
9
|
+
def published(**params)
|
10
|
+
params = to_default_pagination_params(params)
|
11
|
+
|
12
|
+
response = get_request('articles', params: params)
|
13
|
+
|
14
|
+
if Helpers.expected_response?(response, 200)
|
15
|
+
collection = Collection.from_response(response: response,
|
16
|
+
type: DevRuby::Objects::Article,
|
17
|
+
params: params)
|
18
|
+
|
19
|
+
Success(collection)
|
20
|
+
else
|
21
|
+
Failure(error_parser(response))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create(**body)
|
26
|
+
response = post_request('articles', body: { article: body })
|
27
|
+
|
28
|
+
if Helpers.expected_response?(response, 201)
|
29
|
+
article = DevRuby::Objects::Article.new(response.body)
|
30
|
+
|
31
|
+
Success(article)
|
32
|
+
else
|
33
|
+
Failure(error_parser(response))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def latest_published(**params)
|
38
|
+
params = to_default_pagination_params(params)
|
39
|
+
|
40
|
+
response = get_request('articles/latest', params: params)
|
41
|
+
|
42
|
+
if Helpers.expected_response?(response, 200)
|
43
|
+
collection = Collection.from_response(response: response,
|
44
|
+
type: DevRuby::Objects::Article,
|
45
|
+
params: params)
|
46
|
+
|
47
|
+
Success(collection)
|
48
|
+
else
|
49
|
+
Failure(error_parser(response))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def find(id)
|
54
|
+
response = get_request("articles/#{id}")
|
55
|
+
|
56
|
+
if Helpers.expected_response?(response, 200)
|
57
|
+
article = DevRuby::Objects::Article.new(response.body)
|
58
|
+
|
59
|
+
Success(article)
|
60
|
+
else
|
61
|
+
Failure(error_parser(response))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def update(id, **body)
|
66
|
+
response = put_request("articles/#{id}", body: { article: body })
|
67
|
+
|
68
|
+
if Helpers.expected_response?(response, 200)
|
69
|
+
article = DevRuby::Objects::Article.new(response.body)
|
70
|
+
|
71
|
+
Success(article)
|
72
|
+
else
|
73
|
+
Failure(error_parser(response))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def find_by_path(username:, slug:)
|
78
|
+
response = get_request("articles/#{username}/#{slug}")
|
79
|
+
|
80
|
+
if Helpers.expected_response?(response, 200)
|
81
|
+
article = DevRuby::Objects::Article.new(response.body)
|
82
|
+
|
83
|
+
Success(article)
|
84
|
+
else
|
85
|
+
Failure(error_parser(response))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def me
|
90
|
+
response = get_request('articles/me')
|
91
|
+
|
92
|
+
if Helpers.expected_response?(response, 200)
|
93
|
+
article = DevRuby::Objects::Article.new(response.body)
|
94
|
+
|
95
|
+
Success(article)
|
96
|
+
else
|
97
|
+
Failure(error_parser(response))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def me_published(**params)
|
102
|
+
params = to_default_pagination_params(params)
|
103
|
+
|
104
|
+
response = get_request('articles/me/published', params: params)
|
105
|
+
|
106
|
+
if Helpers.expected_response?(response, 200)
|
107
|
+
collection = Collection.from_response(response: response,
|
108
|
+
type: DevRuby::Objects::Article,
|
109
|
+
params: params)
|
110
|
+
|
111
|
+
Success(collection)
|
112
|
+
else
|
113
|
+
Failure(error_parser(response))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def me_unpublished(**params)
|
118
|
+
params = to_default_pagination_params(params)
|
119
|
+
|
120
|
+
response = get_request('articles/me/unpublished', params: params)
|
121
|
+
|
122
|
+
if Helpers.expected_response?(response, 200)
|
123
|
+
collection = Collection.from_response(response: response,
|
124
|
+
type: DevRuby::Objects::Article,
|
125
|
+
params: params)
|
126
|
+
|
127
|
+
Success(collection)
|
128
|
+
else
|
129
|
+
Failure(error_parser(response))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def me_all(**params)
|
134
|
+
params = to_default_pagination_params(params)
|
135
|
+
|
136
|
+
response = get_request('articles/me/all', params: params)
|
137
|
+
|
138
|
+
if Helpers.expected_response?(response, 200)
|
139
|
+
collection = Collection.from_response(response: response,
|
140
|
+
type: DevRuby::Objects::Article,
|
141
|
+
params: params)
|
142
|
+
|
143
|
+
Success(collection)
|
144
|
+
else
|
145
|
+
Failure(error_parser(response))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def videos(**params)
|
150
|
+
params = to_default_pagination_params(params)
|
151
|
+
|
152
|
+
response = get_request('videos', params: params)
|
153
|
+
|
154
|
+
if Helpers.expected_response?(response, 200)
|
155
|
+
collection = Collection.from_response(response: response,
|
156
|
+
type: DevRuby::Objects::Article,
|
157
|
+
params: params)
|
158
|
+
|
159
|
+
Success(collection)
|
160
|
+
else
|
161
|
+
Failure(error_parser(response))
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dry/monads'
|
4
|
+
|
5
|
+
module DevRuby
|
6
|
+
module Resources
|
7
|
+
class BaseResource
|
8
|
+
include Dry::Monads[:result]
|
9
|
+
|
10
|
+
attr_reader :client
|
11
|
+
|
12
|
+
def initialize(client)
|
13
|
+
@client = client
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def get_request(url, params: {}, headers: {})
|
19
|
+
client.connection.get(url, params, headers)
|
20
|
+
end
|
21
|
+
|
22
|
+
def post_request(url, body:, headers: {})
|
23
|
+
client.connection.post(url, body, headers)
|
24
|
+
end
|
25
|
+
|
26
|
+
def patch_request(url, body:, headers: {})
|
27
|
+
client.connection.patch(url, body, headers)
|
28
|
+
end
|
29
|
+
|
30
|
+
def put_request(url, body:, headers: {})
|
31
|
+
client.connection.put(url, body, headers)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete_request(url, params: {}, headers: {})
|
35
|
+
client.connection.delete(url, params, headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
def error_parser(response)
|
39
|
+
OpenStruct.new(status: response.status, body: response.body)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_default_pagination_params(params)
|
43
|
+
params[:page] ||= 1
|
44
|
+
params[:per_page] ||= 20
|
45
|
+
params
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/dev_ruby/version.rb
CHANGED
data/lib/dev_ruby.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'faraday'
|
4
|
+
require 'awesome_print'
|
3
5
|
require_relative 'dev_ruby/version'
|
4
6
|
|
5
7
|
module DevRuby
|
6
|
-
|
7
|
-
|
8
|
+
require_relative 'dev_ruby/helpers'
|
9
|
+
require_relative 'dev_ruby/error'
|
10
|
+
require_relative 'dev_ruby/client'
|
11
|
+
require_relative 'dev_ruby/collection'
|
12
|
+
|
13
|
+
# Resources
|
14
|
+
require_relative 'dev_ruby/resources/base_resource'
|
15
|
+
require_relative 'dev_ruby/resources/articles_resource'
|
16
|
+
|
17
|
+
# Objects
|
18
|
+
require_relative 'dev_ruby/objects/base_object'
|
19
|
+
require_relative 'dev_ruby/objects/article'
|
8
20
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dev_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nejdetkadir
|
@@ -27,6 +27,14 @@ files:
|
|
27
27
|
- Rakefile
|
28
28
|
- dev_ruby.gemspec
|
29
29
|
- lib/dev_ruby.rb
|
30
|
+
- lib/dev_ruby/client.rb
|
31
|
+
- lib/dev_ruby/collection.rb
|
32
|
+
- lib/dev_ruby/error.rb
|
33
|
+
- lib/dev_ruby/helpers.rb
|
34
|
+
- lib/dev_ruby/objects/article.rb
|
35
|
+
- lib/dev_ruby/objects/base_object.rb
|
36
|
+
- lib/dev_ruby/resources/articles_resource.rb
|
37
|
+
- lib/dev_ruby/resources/base_resource.rb
|
30
38
|
- lib/dev_ruby/version.rb
|
31
39
|
- sig/dev_ruby.rbs
|
32
40
|
homepage: https://github.com/nejdetkadir/dev-ruby
|