rublox 0.1.0 → 0.2.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.
@@ -1,95 +1,95 @@
1
- # frozen_string_literal: true
2
-
3
- require "http"
4
- require "json"
5
-
6
- require "rublox/util/errors"
7
-
8
- module Rublox
9
- # @note Only use if you have an use case that the library doesn't cover (and
10
- # create an issue and perhaps we'll implement it!).
11
- # The {HTTPClient} is a wrapper around the http library, designed specifically
12
- # for the Roblox API. It automatically handles the X-CSRF-TOKEN and the
13
- # .ROBLOSECURITY cookie.
14
- class HTTPClient
15
- # @param roblosecurity [String]
16
- def initialize(roblosecurity = "")
17
- @client = HTTP.cookies(
18
- {
19
- ".ROBLOSECURITY": roblosecurity
20
- }
21
- )
22
- end
23
-
24
- # Send a GET request to the specified URL.
25
- # @param url [String]
26
- # @return [Hash]
27
- def get(url, *args)
28
- request(:get, url, *args)
29
- end
30
-
31
- # Send a POST request to the specified URL.
32
- # @param url [String]
33
- # @return [Hash]
34
- def post(url, *args)
35
- request(:post, url, *args)
36
- end
37
-
38
- # Send a PATCH request to the specified URL.
39
- # @param url [String]
40
- # @return [Hash]
41
- def patch(url, *args)
42
- request(:patch, url, *args)
43
- end
44
-
45
- # Send a DELETE request to the specified URL.
46
- # @param url [String]
47
- # @return [Hash]
48
- def delete(url, *args)
49
- request(:delete, url, *args)
50
- end
51
-
52
- private
53
-
54
- # @param verb [Symbol]
55
- # @param url [String]
56
- # @return [Hash]
57
- def request(verb, url, *args)
58
- response = @client.request(verb, url, *args)
59
- return JSON.parse(response.body) if response.status == 200
60
-
61
- handle_status_code(response, verb, url, *args)
62
- end
63
-
64
- # @param response [HTTP::Response]
65
- def handle_status_code(response, verb, url, *args)
66
- case response.status
67
- # token validation failed
68
- when 403
69
- @client = @client.headers(
70
- {
71
- "x-csrf-token": response.headers["x-csrf-token"]
72
- }
73
- )
74
- # retry the request
75
- request(verb, url, *args)
76
- # invalid .ROBLOSECURITY cookie
77
- when 401
78
- raise Errors::InvalidROBLOSECURITYError
79
- else
80
- raise Errors::UnhandledStatusCodeError.new(response.status, get_errors_from_response(response))
81
- end
82
- end
83
-
84
- # @param response [HTTP::Response]
85
- def get_errors_from_response(response)
86
- body = JSON.parse(response.body)
87
- rescue JSON::ParserError
88
- "\ncould not parse errors, raw body:\n#{response.body}\n"
89
- else
90
- body["errors"].reduce("") do |error_message, error|
91
- error_message + "\tCode: #{error['code']}\n\tMessage: #{error['message']}\n\n"
92
- end
93
- end
94
- end
95
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "http"
4
+ require "json"
5
+
6
+ require "rublox/util/errors"
7
+
8
+ module Rublox
9
+ # @note Only use if you have an use case that the library doesn't cover (and
10
+ # create an issue and perhaps we'll implement it!).
11
+ # The {HTTPClient} is a wrapper around the http library, designed specifically
12
+ # for the Roblox API. It automatically handles the X-CSRF-TOKEN and the
13
+ # .ROBLOSECURITY cookie.
14
+ class HTTPClient
15
+ # @param roblosecurity [String]
16
+ def initialize(roblosecurity = "")
17
+ @client = HTTP.cookies(
18
+ {
19
+ ".ROBLOSECURITY": roblosecurity
20
+ }
21
+ )
22
+ end
23
+
24
+ # Send a GET request to the specified URL.
25
+ # @param url [String]
26
+ # @return [Hash]
27
+ def get(url, *args)
28
+ request(:get, url, *args)
29
+ end
30
+
31
+ # Send a POST request to the specified URL.
32
+ # @param url [String]
33
+ # @return [Hash]
34
+ def post(url, *args)
35
+ request(:post, url, *args)
36
+ end
37
+
38
+ # Send a PATCH request to the specified URL.
39
+ # @param url [String]
40
+ # @return [Hash]
41
+ def patch(url, *args)
42
+ request(:patch, url, *args)
43
+ end
44
+
45
+ # Send a DELETE request to the specified URL.
46
+ # @param url [String]
47
+ # @return [Hash]
48
+ def delete(url, *args)
49
+ request(:delete, url, *args)
50
+ end
51
+
52
+ private
53
+
54
+ # @param verb [Symbol]
55
+ # @param url [String]
56
+ # @return [Hash]
57
+ def request(verb, url, *args)
58
+ response = @client.request(verb, url, *args)
59
+ return JSON.parse(response.body) if response.status == 200
60
+
61
+ handle_status_code(response, verb, url, *args)
62
+ end
63
+
64
+ # @param response [HTTP::Response]
65
+ def handle_status_code(response, verb, url, *args)
66
+ case response.status
67
+ # token validation failed
68
+ when 403
69
+ @client = @client.headers(
70
+ {
71
+ "x-csrf-token": response.headers["x-csrf-token"]
72
+ }
73
+ )
74
+ # retry the request
75
+ request(verb, url, *args)
76
+ # invalid .ROBLOSECURITY cookie
77
+ when 401
78
+ raise Errors::InvalidROBLOSECURITYError
79
+ else
80
+ raise Errors::UnhandledStatusCodeError.new(response.status, get_errors_from_response(response))
81
+ end
82
+ end
83
+
84
+ # @param response [HTTP::Response]
85
+ def get_errors_from_response(response)
86
+ body = JSON.parse(response.body)
87
+ rescue JSON::ParserError
88
+ "\ncould not parse errors, raw body:\n#{response.body}\n"
89
+ else
90
+ body["errors"].reduce("") do |error_message, error|
91
+ error_message + "\tCode: #{error['code']}\n\tMessage: #{error['message']}\n\n"
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,85 +1,85 @@
1
- # frozen_string_literal: true
2
-
3
- require "rublox/util/url"
4
- require "rublox/util/cache"
5
-
6
- module Rublox
7
- # The order to sort pages in.
8
- module SortOrder
9
- # Sort the pages ina ascending order.
10
- ASCENDING = "Asc"
11
- # Sort the pages in descending order.
12
- DESCENDING = "Desc"
13
- end
14
-
15
- # The {Pages} class acts as an iterator over pages returned by the API.
16
- # @!visibility private
17
- # @todo Make more customizable, polish and battle-test
18
- # @note Only use if you have an use case that the library doesn't cover (and
19
- # create an issue and perhaps we'll implement it!).
20
- class Pages
21
- # How many items are returned per page
22
- PAGE_DATA_LIMIT = 100
23
-
24
- # @!visibility private
25
- DEFAULT_REQUEST_PARAMETERS = {
26
- params: {
27
- sortOrder: SortOrder::DESCENDING,
28
- limit: PAGE_DATA_LIMIT
29
- }
30
- }.freeze
31
-
32
- # @param client [Client]
33
- # @param initial_data [Hash]
34
- # @param url [String]
35
- # @param request_params [Hash]
36
- def initialize(client, initial_data, url, request_params = {}, &data_handler)
37
- request_params[:params] = DEFAULT_REQUEST_PARAMETERS[:params].merge(
38
- request_params
39
- )
40
-
41
- @client = client
42
- @raw_data = initial_data
43
- @url = url
44
- @request_parameters = request_parameters
45
- @data_handler = data_handler
46
-
47
- @data = []
48
- end
49
-
50
- # Iterate over the pages
51
- def each
52
- raise unless block_given?
53
- # i = 0
54
-
55
- # until @raw_data
56
- # if i == @data.length
57
- # i = 0
58
- # data = Cache.get(Cache::PAGE, @raw_data["nextPageCursor"])
59
- # if data
60
- # @data = data
61
- # else
62
- # @raw_data, @data = next_page
63
- # break if @raw_data.empty?
64
-
65
- # Cache.set(Cache::PAGE, @raw_data["nextPageCursor"], @data)
66
- # end
67
- # end
68
-
69
- # yield @data[i]
70
- # i += 1
71
- # end
72
- end
73
-
74
- private
75
-
76
- # @return [Array] tuple {raw data, processed data}
77
- def next_page
78
- @request_parameters[:params][:cursor] = @raw_data["nextPageCursor"]
79
-
80
- data = @client.http_client.get(@url, @request_parameters)
81
-
82
- [data["data"], @data_handler.call(data["data"])]
83
- end
84
- end
85
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "rublox/util/url"
4
+ require "rublox/util/cache"
5
+
6
+ module Rublox
7
+ # The order to sort pages in.
8
+ module SortOrder
9
+ # Sort the pages ina ascending order.
10
+ ASCENDING = "Asc"
11
+ # Sort the pages in descending order.
12
+ DESCENDING = "Desc"
13
+ end
14
+
15
+ # The {Pages} class acts as an iterator over pages returned by the API.
16
+ # @!visibility private
17
+ # @todo Make more customizable, polish and battle-test
18
+ # @note Only use if you have an use case that the library doesn't cover (and
19
+ # create an issue and perhaps we'll implement it!).
20
+ class Pages
21
+ # How many items are returned per page
22
+ PAGE_DATA_LIMIT = 100
23
+
24
+ # @!visibility private
25
+ DEFAULT_REQUEST_PARAMETERS = {
26
+ params: {
27
+ sortOrder: SortOrder::DESCENDING,
28
+ limit: PAGE_DATA_LIMIT
29
+ }
30
+ }.freeze
31
+
32
+ # @param client [Client]
33
+ # @param initial_data [Hash]
34
+ # @param url [String]
35
+ # @param request_params [Hash]
36
+ def initialize(client, initial_data, url, request_params = {}, &data_handler)
37
+ request_params[:params] = DEFAULT_REQUEST_PARAMETERS[:params].merge(
38
+ request_params
39
+ )
40
+
41
+ @client = client
42
+ @raw_data = initial_data
43
+ @url = url
44
+ @request_parameters = request_parameters
45
+ @data_handler = data_handler
46
+
47
+ @data = []
48
+ end
49
+
50
+ # Iterate over the pages
51
+ def each
52
+ raise unless block_given?
53
+ # i = 0
54
+
55
+ # until @raw_data
56
+ # if i == @data.length
57
+ # i = 0
58
+ # data = Cache.get(Cache::PAGE, @raw_data["nextPageCursor"])
59
+ # if data
60
+ # @data = data
61
+ # else
62
+ # @raw_data, @data = next_page
63
+ # break if @raw_data.empty?
64
+
65
+ # Cache.set(Cache::PAGE, @raw_data["nextPageCursor"], @data)
66
+ # end
67
+ # end
68
+
69
+ # yield @data[i]
70
+ # i += 1
71
+ # end
72
+ end
73
+
74
+ private
75
+
76
+ # @return [Array] tuple {raw data, processed data}
77
+ def next_page
78
+ @request_parameters[:params][:cursor] = @raw_data["nextPageCursor"]
79
+
80
+ data = @client.http_client.get(@url, @request_parameters)
81
+
82
+ [data["data"], @data_handler.call(data["data"])]
83
+ end
84
+ end
85
+ end
@@ -1,25 +1,25 @@
1
- # frozen_string_literal: true
2
-
3
- module Rublox
4
- # Module for making URLs.
5
- module URL
6
- # The base URL to be used. If using a proxy, you can change the URL as long
7
- # as it follows Roblox's API structure:
8
- # https://users.roblox.com/v1/users/1
9
- # Bad:
10
- # https://myproxy.test/get-user/1
11
- # https://myproxy.test/users/1
12
- # https://users.myproxy.test/users/1
13
- # Good:
14
- # https://users.myproxy.test/v1/users/1
15
- BASE_URL = "roblox.com"
16
-
17
- # Creates an endpoint URL from the the given ApiSite and path.
18
- # @param api_site [String] ApiSite
19
- # @param path [String]
20
- # @return [String] the endpoint
21
- def self.endpoint(api_site, path)
22
- "https://#{api_site}.#{BASE_URL}/#{path}"
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Rublox
4
+ # Module for making URLs.
5
+ module URL
6
+ # The base URL to be used. If using a proxy, you can change the URL as long
7
+ # as it follows Roblox's API structure:
8
+ # https://users.roblox.com/v1/users/1
9
+ # Bad:
10
+ # https://myproxy.test/get-user/1
11
+ # https://myproxy.test/users/1
12
+ # https://users.myproxy.test/users/1
13
+ # Good:
14
+ # https://users.myproxy.test/v1/users/1
15
+ BASE_URL = "roblox.com"
16
+
17
+ # Creates an endpoint URL from the the given ApiSite and path.
18
+ # @param api_site [String] ApiSite
19
+ # @param path [String]
20
+ # @return [String] the endpoint
21
+ def self.endpoint(api_site, path)
22
+ "https://#{api_site}.#{BASE_URL}/#{path}"
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
- module Rublox
4
- # Current version of rublox
5
- VERSION = "0.1.0"
6
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Rublox
4
+ # Current version of rublox
5
+ VERSION = "0.2.0"
6
+ end