mangadex 5.3.2 → 5.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/lib/mangadex/api/context.rb +27 -0
- data/lib/mangadex/api/response.rb +8 -0
- data/lib/mangadex/author.rb +10 -0
- data/lib/mangadex/chapter.rb +10 -0
- data/lib/mangadex/content_rating.rb +1 -1
- data/lib/mangadex/cover_art.rb +11 -0
- data/lib/mangadex/custom_list.rb +19 -0
- data/lib/mangadex/internal/definition.rb +14 -1
- data/lib/mangadex/internal/request.rb +12 -4
- data/lib/mangadex/internal/with_attributes.rb +11 -2
- data/lib/mangadex/manga.rb +18 -0
- data/lib/mangadex/relationship.rb +35 -13
- data/lib/mangadex/scanlation_group.rb +7 -0
- data/lib/mangadex/sorbet.rb +2 -1
- data/lib/mangadex/upload.rb +10 -0
- data/lib/mangadex/user.rb +6 -0
- data/lib/mangadex/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 166fb230b0125992e5168515129718a28f7d545c3c1cb07f9bc81e837ad8c2c7
|
4
|
+
data.tar.gz: cf310df080bb7fdce3df2fd885aa478de4ae050272e58d97ce6fdbe0b60459af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4babccf80e64908e70f612d5afb152b00fef108c827cbfc75a273478ee2f1230b6b2366318bab5a3fadb3b2025e0e7a64bed88746c04484d18a9c1a62a241e2a
|
7
|
+
data.tar.gz: aebcdeed93c99b1beb9e4723e8371875c21da6629311270cbf2b6ca5c58c55b0dca39e8a222bcd886180ee7b1059e40853948f90a25553da4dea8f1d261b4f44
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mangadex (5.3.
|
4
|
+
mangadex (5.3.2)
|
5
5
|
activesupport (~> 6.1)
|
6
6
|
psych (~> 4.0.1)
|
7
7
|
rest-client (~> 2.1)
|
@@ -82,7 +82,7 @@ GEM
|
|
82
82
|
smart_properties (1.16.3)
|
83
83
|
sorbet (0.5.9152)
|
84
84
|
sorbet-static (= 0.5.9152)
|
85
|
-
sorbet-runtime (0.5.
|
85
|
+
sorbet-runtime (0.5.9161)
|
86
86
|
sorbet-static (0.5.9152-universal-darwin-20)
|
87
87
|
sorbet-static (0.5.9152-x86_64-linux)
|
88
88
|
tilt (2.0.10)
|
data/lib/mangadex/api/context.rb
CHANGED
@@ -6,6 +6,7 @@ module Mangadex
|
|
6
6
|
|
7
7
|
@@user = nil
|
8
8
|
@@version = nil
|
9
|
+
@@force_raw_requests = nil
|
9
10
|
|
10
11
|
sig { returns(T.nilable(String)) }
|
11
12
|
def self.version
|
@@ -58,6 +59,32 @@ module Mangadex
|
|
58
59
|
yield
|
59
60
|
end
|
60
61
|
end
|
62
|
+
|
63
|
+
def self.force_raw_requests(&block)
|
64
|
+
if block_given?
|
65
|
+
temp_force_raw_requests do
|
66
|
+
yield
|
67
|
+
end
|
68
|
+
else
|
69
|
+
!!@@force_raw_requests
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.force_raw_requests=(value)
|
74
|
+
@@force_raw_requests = value
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def self.temp_force_raw_requests(&block)
|
80
|
+
current_force_raw_requests = @@force_raw_requests
|
81
|
+
@@force_raw_requests = true
|
82
|
+
response = yield
|
83
|
+
@@force_raw_requests = current_force_raw_requests
|
84
|
+
response
|
85
|
+
ensure
|
86
|
+
@@force_raw_requests = current_force_raw_requests
|
87
|
+
end
|
61
88
|
end
|
62
89
|
end
|
63
90
|
end
|
@@ -7,6 +7,7 @@ module Mangadex
|
|
7
7
|
|
8
8
|
attr_accessor :result, :response, :errors, :data
|
9
9
|
attr_accessor :limit, :offset, :total
|
10
|
+
attr_accessor :raw_data
|
10
11
|
|
11
12
|
def self.attributes_to_inspect
|
12
13
|
%i(result errors limit offset total data)
|
@@ -44,6 +45,10 @@ module Mangadex
|
|
44
45
|
Array(errors).any?
|
45
46
|
end
|
46
47
|
|
48
|
+
def as_json(*)
|
49
|
+
Hash(raw_data)
|
50
|
+
end
|
51
|
+
|
47
52
|
private
|
48
53
|
|
49
54
|
def self.coerce_errors(data)
|
@@ -60,6 +65,7 @@ module Mangadex
|
|
60
65
|
)
|
61
66
|
end
|
62
67
|
),
|
68
|
+
raw_data: data,
|
63
69
|
)
|
64
70
|
end
|
65
71
|
|
@@ -75,6 +81,7 @@ module Mangadex
|
|
75
81
|
result: data['result'],
|
76
82
|
response: data['response'],
|
77
83
|
data: klass.from_data(data['data'] || data),
|
84
|
+
raw_data: data,
|
78
85
|
)
|
79
86
|
end
|
80
87
|
|
@@ -97,6 +104,7 @@ module Mangadex
|
|
97
104
|
end
|
98
105
|
)
|
99
106
|
),
|
107
|
+
raw_data: data,
|
100
108
|
)
|
101
109
|
end
|
102
110
|
end
|
data/lib/mangadex/author.rb
CHANGED
@@ -66,6 +66,8 @@ module Mangadex
|
|
66
66
|
# @return [Mangadex::Api::Response] with a entity of author
|
67
67
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[Author]) }
|
68
68
|
def self.get(id, **args)
|
69
|
+
Mangadex::Internal::Definition.must(id)
|
70
|
+
|
69
71
|
Mangadex::Internal::Request.get(
|
70
72
|
format('/author/%{id}', id: id),
|
71
73
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -81,6 +83,8 @@ module Mangadex
|
|
81
83
|
# @return [Mangadex::Api::Response] with a entity of author
|
82
84
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[Author]) }
|
83
85
|
def self.update(id, **args)
|
86
|
+
Mangadex::Internal::Definition.must(id)
|
87
|
+
|
84
88
|
Mangadex::Internal::Request.put(
|
85
89
|
format('/author/%{id}', id: id),
|
86
90
|
payload: Mangadex::Internal::Definition.validate(args, {
|
@@ -98,6 +102,8 @@ module Mangadex
|
|
98
102
|
# @return [Hash]
|
99
103
|
sig { params(id: String).returns(Hash) }
|
100
104
|
def self.delete(id)
|
105
|
+
Mangadex::Internal::Definition.must(id)
|
106
|
+
|
101
107
|
Mangadex::Internal::Request.delete(
|
102
108
|
format('/author/%{id}', id: id)
|
103
109
|
)
|
@@ -107,6 +113,10 @@ module Mangadex
|
|
107
113
|
[:name]
|
108
114
|
end
|
109
115
|
|
116
|
+
class << self
|
117
|
+
alias_method :view, :get
|
118
|
+
end
|
119
|
+
|
110
120
|
# Indicates if this is an artist
|
111
121
|
#
|
112
122
|
# @return [Boolean] whether this is an artist or not.
|
data/lib/mangadex/chapter.rb
CHANGED
@@ -31,6 +31,8 @@ module Mangadex
|
|
31
31
|
|
32
32
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[Chapter]) }
|
33
33
|
def self.get(id, **args)
|
34
|
+
Mangadex::Internal::Definition.must(id)
|
35
|
+
|
34
36
|
Mangadex::Internal::Request.get(
|
35
37
|
'/chapter/%{id}' % {id: id},
|
36
38
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -41,6 +43,8 @@ module Mangadex
|
|
41
43
|
|
42
44
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[Chapter]) }
|
43
45
|
def self.update(id, **args)
|
46
|
+
Mangadex::Internal::Definition.must(id)
|
47
|
+
|
44
48
|
Mangadex::Internal::Request.put(
|
45
49
|
'/chapter/%{id}' % {id: id},
|
46
50
|
payload: Mangadex::Internal::Definition.validate(args, {
|
@@ -56,11 +60,17 @@ module Mangadex
|
|
56
60
|
|
57
61
|
sig { params(id: String).returns(Hash) }
|
58
62
|
def self.delete(id)
|
63
|
+
Mangadex::Internal::Definition.must(id)
|
64
|
+
|
59
65
|
Mangadex::Internal::Request.delete(
|
60
66
|
'/chapter/%{id}' % {id: id},
|
61
67
|
)
|
62
68
|
end
|
63
69
|
|
70
|
+
class << self
|
71
|
+
alias_method :view, :get
|
72
|
+
end
|
73
|
+
|
64
74
|
sig { returns(String) }
|
65
75
|
def title
|
66
76
|
attributes&.title.presence || chapter.presence && "Chapter #{chapter}" || "N/A"
|
@@ -64,7 +64,7 @@ module Mangadex
|
|
64
64
|
|
65
65
|
private
|
66
66
|
|
67
|
-
sig { params(value: T.any(T::Api::Text, T::Api::ContentRating)).
|
67
|
+
sig { params(value: T.any(T::Api::Text, T::Api::ContentRating)).returns(T.any(T::Api::Text, T::Api::ContentRating)) }
|
68
68
|
def ensure_value!(value)
|
69
69
|
return value if value.is_a?(ContentRating)
|
70
70
|
return value if VALUES.include?(value)
|
data/lib/mangadex/cover_art.rb
CHANGED
@@ -47,6 +47,8 @@ module Mangadex
|
|
47
47
|
|
48
48
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[CoverArt]) }
|
49
49
|
def self.get(id, **args)
|
50
|
+
Mangadex::Internal::Definition.must(id)
|
51
|
+
|
50
52
|
Mangadex::Internal::Request.get(
|
51
53
|
'/cover/%{id}' % {id: id},
|
52
54
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -57,6 +59,8 @@ module Mangadex
|
|
57
59
|
|
58
60
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[CoverArt]) }
|
59
61
|
def self.edit(id, **args)
|
62
|
+
Mangadex::Internal::Definition.must(id)
|
63
|
+
|
60
64
|
Mangadex::Internal::Request.put(
|
61
65
|
'/cover/%{id}' % {id: id},
|
62
66
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -69,11 +73,18 @@ module Mangadex
|
|
69
73
|
|
70
74
|
sig { params(id: String).returns(Hash) }
|
71
75
|
def self.delete(id)
|
76
|
+
Mangadex::Internal::Definition.must(id)
|
77
|
+
|
72
78
|
Mangadex::Internal::Request.delete(
|
73
79
|
'/cover/%{id}' % {id: id},
|
74
80
|
)
|
75
81
|
end
|
76
82
|
|
83
|
+
class << self
|
84
|
+
alias_method :view, :get
|
85
|
+
alias_method :update, :edit
|
86
|
+
end
|
87
|
+
|
77
88
|
sig { params(size: T::Api::Text).returns(T.nilable(String)) }
|
78
89
|
def image_url(size: :small)
|
79
90
|
return unless manga.present?
|
data/lib/mangadex/custom_list.rb
CHANGED
@@ -24,6 +24,8 @@ module Mangadex
|
|
24
24
|
|
25
25
|
sig { params(id: String).returns(Mangadex::Api::Response[CustomList]) }
|
26
26
|
def self.get(id)
|
27
|
+
Mangadex::Internal::Definition.must(id)
|
28
|
+
|
27
29
|
Mangadex::Internal::Request.get(
|
28
30
|
'/list/%{id}' % {id: id},
|
29
31
|
)
|
@@ -31,6 +33,8 @@ module Mangadex
|
|
31
33
|
|
32
34
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[CustomList]) }
|
33
35
|
def self.update(id, **args)
|
36
|
+
Mangadex::Internal::Definition.must(id)
|
37
|
+
|
34
38
|
Mangadex::Internal::Request.put(
|
35
39
|
'/list/%{id}' % {id: id},
|
36
40
|
payload: Mangadex::Internal::Definition.validate(args, {
|
@@ -44,6 +48,8 @@ module Mangadex
|
|
44
48
|
|
45
49
|
sig { params(id: String).returns(T::Boolean) }
|
46
50
|
def self.delete(id)
|
51
|
+
Mangadex::Internal::Definition.must(id)
|
52
|
+
|
47
53
|
Mangadex::Internal::Request.delete(
|
48
54
|
'/list/%{id}' % {id: id},
|
49
55
|
)
|
@@ -51,6 +57,8 @@ module Mangadex
|
|
51
57
|
|
52
58
|
sig { params(id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[Chapter]) }
|
53
59
|
def self.feed(id, **args)
|
60
|
+
Mangadex::Internal::Definition.must(id)
|
61
|
+
|
54
62
|
Mangadex::Internal::Request.get(
|
55
63
|
'/list/%{id}/feed' % {id: id},
|
56
64
|
Mangadex::Internal::Definition.chapter_list(args),
|
@@ -59,6 +67,8 @@ module Mangadex
|
|
59
67
|
|
60
68
|
sig { params(id: String, list_id: String).returns(T::Boolean) }
|
61
69
|
def self.add_manga(id, list_id:)
|
70
|
+
Mangadex::Internal::Definition.must(id)
|
71
|
+
|
62
72
|
response = Mangadex::Internal::Request.post(
|
63
73
|
'/manga/%{id}/list/%{list_id}' % {id: id, list_id: list_id},
|
64
74
|
)
|
@@ -71,6 +81,8 @@ module Mangadex
|
|
71
81
|
|
72
82
|
sig { params(id: String, list_id: String).returns(T::Boolean) }
|
73
83
|
def self.remove_manga(id, list_id:)
|
84
|
+
Mangadex::Internal::Definition.must(id)
|
85
|
+
|
74
86
|
response = Mangadex::Internal::Request.delete(
|
75
87
|
'/manga/%{id}/list/%{list_id}' % {id: id, list_id: list_id},
|
76
88
|
)
|
@@ -94,6 +106,8 @@ module Mangadex
|
|
94
106
|
|
95
107
|
sig { params(user_id: String, args: T::Api::Arguments).returns(Mangadex::Api::Response[CustomList]) }
|
96
108
|
def self.user_list(user_id, **args)
|
109
|
+
Mangadex::Internal::Definition.must(user_id)
|
110
|
+
|
97
111
|
Mangadex::Internal::Request.get(
|
98
112
|
'/user/%{id}/list' % {id: user_id},
|
99
113
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -103,6 +117,11 @@ module Mangadex
|
|
103
117
|
)
|
104
118
|
end
|
105
119
|
|
120
|
+
class << self
|
121
|
+
alias_method :view, :get
|
122
|
+
alias_method :edit, :update
|
123
|
+
end
|
124
|
+
|
106
125
|
sig { params(id: String).returns(T::Boolean) }
|
107
126
|
def add_manga(id)
|
108
127
|
Mangadex::CustomList.add_manga(id, list_id: self.id)
|
@@ -120,6 +120,19 @@ module Mangadex
|
|
120
120
|
)
|
121
121
|
end
|
122
122
|
|
123
|
+
def must(*args)
|
124
|
+
args = args.each_with_index.map do |arg, index|
|
125
|
+
["arg_at_position_#{index}".to_sym, arg]
|
126
|
+
end.to_h
|
127
|
+
|
128
|
+
definition = args.keys.map do |key|
|
129
|
+
[key, { required: true }]
|
130
|
+
end.to_h
|
131
|
+
|
132
|
+
validate(args, definition)
|
133
|
+
args.values
|
134
|
+
end
|
135
|
+
|
123
136
|
def validate(args, definition)
|
124
137
|
args = Hash(args).with_indifferent_access
|
125
138
|
definition = Hash(definition).with_indifferent_access
|
@@ -144,7 +157,7 @@ module Mangadex
|
|
144
157
|
if errors.any?
|
145
158
|
error_message = errors.map do |error|
|
146
159
|
if error[:extra]
|
147
|
-
"
|
160
|
+
"paalidate_required!rams[:#{error[:extra]}] does not exist and cannot be passed to this request"
|
148
161
|
elsif error[:message]
|
149
162
|
error[:message]
|
150
163
|
else
|
@@ -62,13 +62,15 @@ module Mangadex
|
|
62
62
|
end_time = Time.now
|
63
63
|
elapsed_time = ((end_time - start_time) * 1000).to_i
|
64
64
|
puts("[#{self.class.name}] took #{elapsed_time} ms")
|
65
|
+
|
66
|
+
raw_request = raw || Mangadex::Api::Context.force_raw_requests
|
65
67
|
|
66
|
-
if @response.body
|
67
|
-
|
68
|
+
if (body = @response.body)
|
69
|
+
raw_request ? try_json(body) : Mangadex::Api::Response.coerce(try_json(body))
|
68
70
|
end
|
69
71
|
rescue RestClient::Exception => error
|
70
|
-
if error.response.body
|
71
|
-
|
72
|
+
if (body = error.response.body)
|
73
|
+
raw_request ? try_json(body) : Mangadex::Api::Response.coerce(JSON.parse(body)) rescue raise error
|
72
74
|
else
|
73
75
|
raise error
|
74
76
|
end
|
@@ -116,6 +118,12 @@ module Mangadex
|
|
116
118
|
|
117
119
|
raise "Invalid method: #{method}. Must be one of: #{ALLOWED_METHODS}"
|
118
120
|
end
|
121
|
+
|
122
|
+
def try_json(body)
|
123
|
+
JSON.parse(body)
|
124
|
+
rescue JSON::ParserError
|
125
|
+
body
|
126
|
+
end
|
119
127
|
end
|
120
128
|
end
|
121
129
|
end
|
@@ -11,7 +11,8 @@ module Mangadex
|
|
11
11
|
:id,
|
12
12
|
:type,
|
13
13
|
:attributes,
|
14
|
-
:relationships
|
14
|
+
:relationships,
|
15
|
+
:related_type
|
15
16
|
|
16
17
|
class_methods do
|
17
18
|
USING_ATTRIBUTES = {}
|
@@ -30,7 +31,7 @@ module Mangadex
|
|
30
31
|
self.name.split('::').last.underscore
|
31
32
|
end
|
32
33
|
|
33
|
-
def from_data(data)
|
34
|
+
def from_data(data, related_type: nil)
|
34
35
|
base_class_name = self.name.gsub('::', '_')
|
35
36
|
klass_name = self.name
|
36
37
|
target_attributes_class_name = "#{base_class_name}_Attributes"
|
@@ -65,6 +66,7 @@ module Mangadex
|
|
65
66
|
id: data['id'],
|
66
67
|
type: data['type'] || self.type,
|
67
68
|
attributes: attributes,
|
69
|
+
related_type: related_type,
|
68
70
|
}
|
69
71
|
|
70
72
|
initialize_hash.merge!({relationships: relationships}) if relationships.present?
|
@@ -110,6 +112,13 @@ module Mangadex
|
|
110
112
|
else
|
111
113
|
super
|
112
114
|
end
|
115
|
+
elsif !related_type.nil?
|
116
|
+
return super unless method_name.end_with?("?")
|
117
|
+
|
118
|
+
looking_for_related = method_name.to_s.split("?").first
|
119
|
+
return super unless Mangadex::Relationship::RELATED_VALUES.include?(looking_for_related)
|
120
|
+
|
121
|
+
related_type == looking_for_related
|
113
122
|
else
|
114
123
|
super
|
115
124
|
end
|
data/lib/mangadex/manga.rb
CHANGED
@@ -66,6 +66,8 @@ module Mangadex
|
|
66
66
|
|
67
67
|
sig { params(id: String, args: T::Api::Arguments).returns(T::Api::MangaResponse) }
|
68
68
|
def self.view(id, **args)
|
69
|
+
Mangadex::Internal::Definition.must(id)
|
70
|
+
|
69
71
|
Mangadex::Internal::Request.get(
|
70
72
|
'/manga/%{id}' % {id: id},
|
71
73
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -76,6 +78,8 @@ module Mangadex
|
|
76
78
|
|
77
79
|
sig { params(id: String).returns(T.any(Hash, Mangadex::Api::Response)) }
|
78
80
|
def self.unfollow(id)
|
81
|
+
Mangadex::Internal::Definition.must(id)
|
82
|
+
|
79
83
|
Mangadex::Internal::Request.delete(
|
80
84
|
'/manga/%{id}/follow' % {id: id},
|
81
85
|
)
|
@@ -83,6 +87,8 @@ module Mangadex
|
|
83
87
|
|
84
88
|
sig { params(id: String).returns(T.any(Hash, Mangadex::Api::Response)) }
|
85
89
|
def self.follow(id)
|
90
|
+
Mangadex::Internal::Definition.must(id)
|
91
|
+
|
86
92
|
Mangadex::Internal::Request.post(
|
87
93
|
'/manga/%{id}/follow' % {id: id},
|
88
94
|
)
|
@@ -90,6 +96,8 @@ module Mangadex
|
|
90
96
|
|
91
97
|
sig { params(id: String, args: T::Api::Arguments).returns(T::Api::ChapterResponse) }
|
92
98
|
def self.feed(id, **args)
|
99
|
+
Mangadex::Internal::Definition.must(id)
|
100
|
+
|
93
101
|
Mangadex::Internal::Request.get(
|
94
102
|
'/manga/%{id}/feed' % {id: id},
|
95
103
|
Mangadex::Internal::Definition.chapter_list(args),
|
@@ -128,6 +136,8 @@ module Mangadex
|
|
128
136
|
|
129
137
|
sig { params(id: String).returns(T::Api::GenericResponse) }
|
130
138
|
def self.reading_status(id)
|
139
|
+
Mangadex::Internal::Definition.must(id)
|
140
|
+
|
131
141
|
Mangadex::Internal::Request.get(
|
132
142
|
'/manga/%{id}/status' % {id: id},
|
133
143
|
)
|
@@ -135,6 +145,8 @@ module Mangadex
|
|
135
145
|
|
136
146
|
sig { params(id: String, status: String).returns(T::Api::GenericResponse) }
|
137
147
|
def self.update_reading_status(id, status)
|
148
|
+
Mangadex::Internal::Definition.must(id)
|
149
|
+
|
138
150
|
Mangadex::Internal::Request.post(
|
139
151
|
'/manga/%{id}/status' % {id: id},
|
140
152
|
payload: Mangadex::Internal::Definition.validate({status: status}, {
|
@@ -149,11 +161,15 @@ module Mangadex
|
|
149
161
|
# Untested API endpoints
|
150
162
|
sig { params(id: String, args: T::Api::Arguments).returns(T::Api::MangaResponse) }
|
151
163
|
def self.update(id, **args)
|
164
|
+
Mangadex::Internal::Definition.must(id)
|
165
|
+
|
152
166
|
Mangadex::Internal::Request.put('/manga/%{id}' % {id: id}, payload: args)
|
153
167
|
end
|
154
168
|
|
155
169
|
sig { params(id: String).returns(Hash) }
|
156
170
|
def self.delete(id)
|
171
|
+
Mangadex::Internal::Definition.must(id)
|
172
|
+
|
157
173
|
Mangadex::Internal::Request.delete(
|
158
174
|
'/manga/%{id}' % {id: id},
|
159
175
|
)
|
@@ -169,6 +185,8 @@ module Mangadex
|
|
169
185
|
|
170
186
|
class << self
|
171
187
|
alias_method :aggregate, :volumes_and_chapters
|
188
|
+
alias_method :get, :view
|
189
|
+
alias_method :edit, :update
|
172
190
|
end
|
173
191
|
|
174
192
|
sig { returns(T.nilable(ContentRating)) }
|
@@ -1,33 +1,45 @@
|
|
1
1
|
# typed: false
|
2
2
|
module Mangadex
|
3
3
|
class Relationship < MangadexObject
|
4
|
-
attr_accessor :id, :type, :attributes
|
4
|
+
attr_accessor :id, :type, :related, :attributes
|
5
|
+
|
6
|
+
RELATED_VALUES = %w(
|
7
|
+
monochrome
|
8
|
+
main_story
|
9
|
+
adapted_from
|
10
|
+
based_on
|
11
|
+
prequel
|
12
|
+
side_story
|
13
|
+
doujinshi
|
14
|
+
same_franchise
|
15
|
+
shared_universe
|
16
|
+
sequel
|
17
|
+
spin_off
|
18
|
+
alternate_story
|
19
|
+
preserialization
|
20
|
+
colored
|
21
|
+
serialization
|
22
|
+
).freeze
|
5
23
|
|
6
24
|
class << self
|
7
25
|
def from_data(data)
|
8
26
|
data = data.with_indifferent_access
|
9
27
|
klass = class_for_relationship_type(data['type'])
|
10
28
|
|
11
|
-
|
29
|
+
if klass && data['attributes']&.any?
|
30
|
+
return klass.from_data(data, related_type: data['related'])
|
31
|
+
end
|
12
32
|
|
13
33
|
new(
|
14
34
|
id: data['id'],
|
15
35
|
type: data['type'],
|
16
36
|
attributes: OpenStruct.new(data['attributes']),
|
37
|
+
related: data['related'],
|
17
38
|
)
|
18
39
|
end
|
19
40
|
|
20
41
|
private
|
21
42
|
|
22
|
-
def build_attributes(data)
|
23
|
-
klass = class_for_relationship_type(data['type'])
|
24
|
-
if klass.present?
|
25
|
-
klass.from_data(data)
|
26
|
-
else
|
27
|
-
OpenStruct.new(data['attributes'])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
43
|
def class_for_relationship_type(type)
|
32
44
|
module_parts = self.name.split('::')
|
33
45
|
module_name = module_parts.take(module_parts.size - 1).join('::')
|
@@ -39,8 +51,18 @@ module Mangadex
|
|
39
51
|
end
|
40
52
|
end
|
41
53
|
|
42
|
-
def
|
43
|
-
|
54
|
+
def self.attributes_to_inspect
|
55
|
+
[:id, :type, :related]
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def method_missing(value)
|
60
|
+
return super unless value.end_with?("?")
|
61
|
+
|
62
|
+
looking_for_related = value.to_s.split("?").first
|
63
|
+
return super unless RELATED_VALUES.include?(looking_for_related)
|
64
|
+
|
65
|
+
!related.nil? && related == looking_for_related
|
44
66
|
end
|
45
67
|
end
|
46
68
|
end
|
@@ -48,6 +48,8 @@ module Mangadex
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def view(id)
|
51
|
+
Mangadex::Internal::Definition.must(id)
|
52
|
+
|
51
53
|
Mangadex::Internal::Request.get(
|
52
54
|
'/group/%{id}' % {id: id},
|
53
55
|
Mangadex::Internal::Definition.validate(args, {
|
@@ -92,6 +94,11 @@ module Mangadex
|
|
92
94
|
end
|
93
95
|
end
|
94
96
|
|
97
|
+
class << self
|
98
|
+
alias_method :get, :view
|
99
|
+
alias_method :edit, :update
|
100
|
+
end
|
101
|
+
|
95
102
|
def self.inspect_attributes
|
96
103
|
self.attributes - [:version, :created_at, :updated_at]
|
97
104
|
end
|
data/lib/mangadex/sorbet.rb
CHANGED
@@ -17,7 +17,8 @@ module T
|
|
17
17
|
MangaResponse = T.type_alias do
|
18
18
|
T.any(
|
19
19
|
Mangadex::Api::Response[Mangadex::Manga],
|
20
|
-
Mangadex::Api::Response[T::Array[Mangadex::Manga]]
|
20
|
+
Mangadex::Api::Response[T::Array[Mangadex::Manga]],
|
21
|
+
Hash,
|
21
22
|
)
|
22
23
|
end
|
23
24
|
ChapterResponse = T.type_alias do
|
data/lib/mangadex/upload.rb
CHANGED
@@ -28,6 +28,8 @@ module Mangadex
|
|
28
28
|
alias_method :begin, :start
|
29
29
|
|
30
30
|
def upload_images(upload_session_id)
|
31
|
+
Mangadex::Internal::Definition.must(upload_session_id)
|
32
|
+
|
31
33
|
Mangadex::Internal::Request.post(
|
32
34
|
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
33
35
|
payload: Mangadex::Internal::Definition.validate(args, {
|
@@ -37,6 +39,8 @@ module Mangadex
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def abandon(upload_session_id)
|
42
|
+
Mangadex::Internal::Definition.must(upload_session_id)
|
43
|
+
|
40
44
|
Mangadex::Internal::Request.delete(
|
41
45
|
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
42
46
|
)
|
@@ -44,6 +48,8 @@ module Mangadex
|
|
44
48
|
alias_method :stop, :abandon
|
45
49
|
|
46
50
|
def commit(upload_session_id, **args)
|
51
|
+
Mangadex::Internal::Definition.must(upload_session_id)
|
52
|
+
|
47
53
|
Mangadex::Internal::Request.post(
|
48
54
|
'/upload/%{upload_session_id}/commit' % {upload_session_id: upload_session_id},
|
49
55
|
payload: Mangadex::Internal::Definition.validate(args, {
|
@@ -54,6 +60,8 @@ module Mangadex
|
|
54
60
|
end
|
55
61
|
|
56
62
|
def delete_uploaded_image(upload_session_id, upload_session_file_id)
|
63
|
+
Mangadex::Internal::Definition.must(upload_session_id)
|
64
|
+
|
57
65
|
Mangadex::Internal::Request.delete(
|
58
66
|
'/upload/%{upload_session_id}/%{upload_session_file_id}' % {
|
59
67
|
upload_session_id: upload_session_id,
|
@@ -63,6 +71,8 @@ module Mangadex
|
|
63
71
|
end
|
64
72
|
|
65
73
|
def delete_uploaded_images(upload_session_id, upload_session_file_ids)
|
74
|
+
Mangadex::Internal::Definition.must(upload_session_id)
|
75
|
+
|
66
76
|
Mangadex::Internal::Request.delete(
|
67
77
|
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
68
78
|
payload: Array(upload_session_file_id),
|
data/lib/mangadex/user.rb
CHANGED
@@ -30,6 +30,8 @@ module Mangadex
|
|
30
30
|
|
31
31
|
sig { params(id: String).returns(T::Boolean) }
|
32
32
|
def self.follows_group(id)
|
33
|
+
Mangadex::Internal::Definition.must(id)
|
34
|
+
|
33
35
|
data = Mangadex::Internal::Request.get(
|
34
36
|
'/user/follows/group/%{id}' % {id: id},
|
35
37
|
raw: true,
|
@@ -55,6 +57,8 @@ module Mangadex
|
|
55
57
|
|
56
58
|
sig { params(id: String).returns(T::Boolean) }
|
57
59
|
def self.follows_user(id)
|
60
|
+
Mangadex::Internal::Definition.must(id)
|
61
|
+
|
58
62
|
return if Mangadex::Api::Context.user.nil?
|
59
63
|
|
60
64
|
data = Mangadex::Internal::Request.get(
|
@@ -83,6 +87,8 @@ module Mangadex
|
|
83
87
|
|
84
88
|
sig { params(id: String).returns(T::Boolean) }
|
85
89
|
def self.follows_manga(id)
|
90
|
+
Mangadex::Internal::Definition.must(id)
|
91
|
+
|
86
92
|
return if Mangadex::Api::Context.user.nil?
|
87
93
|
|
88
94
|
data = Mangadex::Internal::Request.get(
|
data/lib/mangadex/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mangadex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.3.
|
4
|
+
version: 5.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akinyele Cafe-Febrissy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: psych
|