dev_ruby 0.1.0 → 0.1.2

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: c97ff734180da46570fffd2b2cbf21b6c4b43ab1fb776a9c5bc6961581286dd6
4
- data.tar.gz: bd6d656db14a79f310e2428aeecc3df77382488879c1fec011045334284124ef
3
+ metadata.gz: c72c665418cd3f98071b63f5192ca1b74bc1b0cb3805baf8bcb0908de56f5dc0
4
+ data.tar.gz: 3634d40cf94496c311baaac15b82262d05c7a171eb1e72ebcd6db0287eb1da30
5
5
  SHA512:
6
- metadata.gz: 24293c5d54863cf0743d08117a071ebe5f52bcd2cc5807fb428b390c85ffb0f8bb32b0c1ff035e519bfaf6f1cb3147dc17f21dc13a7e258d31740f9de0414688
7
- data.tar.gz: 68fdd8fac1d3211556cd7c79a5389acd4e240e30ee68f82c218c08fffb322b93302d27126680aed885a9c1e07d8b313d24d54ef25bf231ee6aa2082e5862a04c
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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevRuby
4
+ class Error < StandardError; end
5
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevRuby
4
+ class Helpers
5
+ class << self
6
+ def expected_response?(response, expected_status)
7
+ response.status == expected_status
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevRuby
4
+ module Objects
5
+ class Article < BaseObject
6
+ end
7
+ end
8
+ 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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DevRuby
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.2'
5
5
  end
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
- class Error < StandardError; end
7
- # Your code goes here...
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.0
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