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 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