mangadex 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +81 -0
- data/LICENSE.txt +21 -0
- data/README.md +42 -0
- data/Rakefile +6 -0
- data/bin/console +23 -0
- data/bin/setup +8 -0
- data/lib/extensions.rb +12 -0
- data/lib/mangadex/README.md +93 -0
- data/lib/mangadex/api/context.rb +53 -0
- data/lib/mangadex/api/response.rb +104 -0
- data/lib/mangadex/api/user.rb +48 -0
- data/lib/mangadex/api/version.rb +21 -0
- data/lib/mangadex/api.rb +5 -0
- data/lib/mangadex/artist.rb +13 -0
- data/lib/mangadex/auth.rb +56 -0
- data/lib/mangadex/author.rb +101 -0
- data/lib/mangadex/chapter.rb +105 -0
- data/lib/mangadex/content_rating.rb +75 -0
- data/lib/mangadex/cover_art.rb +93 -0
- data/lib/mangadex/custom_list.rb +127 -0
- data/lib/mangadex/internal/definition.rb +162 -0
- data/lib/mangadex/internal/request.rb +121 -0
- data/lib/mangadex/internal/with_attributes.rb +120 -0
- data/lib/mangadex/internal.rb +3 -0
- data/lib/mangadex/manga.rb +188 -0
- data/lib/mangadex/mangadex_object.rb +62 -0
- data/lib/mangadex/relationship.rb +46 -0
- data/lib/mangadex/report_reason.rb +39 -0
- data/lib/mangadex/scanlation_group.rb +97 -0
- data/lib/mangadex/sorbet.rb +42 -0
- data/lib/mangadex/tag.rb +10 -0
- data/lib/mangadex/types.rb +24 -0
- data/lib/mangadex/upload.rb +78 -0
- data/lib/mangadex/user.rb +103 -0
- data/lib/mangadex/version.rb +4 -0
- data/lib/mangadex.rb +35 -0
- data/mangadex.gemspec +35 -0
- data/sorbet/config +3 -0
- data/sorbet/rbi/gems/activesupport.rbi +1267 -0
- data/sorbet/rbi/gems/coderay.rbi +285 -0
- data/sorbet/rbi/gems/concurrent-ruby.rbi +1662 -0
- data/sorbet/rbi/gems/domain_name.rbi +52 -0
- data/sorbet/rbi/gems/http-accept.rbi +101 -0
- data/sorbet/rbi/gems/http-cookie.rbi +119 -0
- data/sorbet/rbi/gems/i18n.rbi +133 -0
- data/sorbet/rbi/gems/method_source.rbi +64 -0
- data/sorbet/rbi/gems/mime-types-data.rbi +17 -0
- data/sorbet/rbi/gems/mime-types.rbi +218 -0
- data/sorbet/rbi/gems/netrc.rbi +51 -0
- data/sorbet/rbi/gems/pry.rbi +1898 -0
- data/sorbet/rbi/gems/psych.rbi +471 -0
- data/sorbet/rbi/gems/rake.rbi +660 -0
- data/sorbet/rbi/gems/rest-client.rbi +454 -0
- data/sorbet/rbi/gems/rspec-core.rbi +1939 -0
- data/sorbet/rbi/gems/rspec-expectations.rbi +1150 -0
- data/sorbet/rbi/gems/rspec-mocks.rbi +1100 -0
- data/sorbet/rbi/gems/rspec-support.rbi +280 -0
- data/sorbet/rbi/gems/rspec.rbi +15 -0
- data/sorbet/rbi/gems/tzinfo.rbi +586 -0
- data/sorbet/rbi/gems/unf.rbi +19 -0
- data/sorbet/rbi/hidden-definitions/errors.txt +3942 -0
- data/sorbet/rbi/hidden-definitions/hidden.rbi +8210 -0
- data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6/activesupport.rbi +37 -0
- data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1850 -0
- data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +108 -0
- data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +645 -0
- data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +1891 -0
- data/sorbet/rbi/todo.rbi +7 -0
- metadata +243 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Mangadex
|
3
|
+
class ReportReason < MangadexObject
|
4
|
+
has_attributes \
|
5
|
+
:reason,
|
6
|
+
:details_required,
|
7
|
+
:category,
|
8
|
+
:version
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def list(category)
|
12
|
+
args = Mangadex::Internal::Definition.validate({category: category}, {
|
13
|
+
category: { accepts: %w(manga chapter scanlation_group user), required: true },
|
14
|
+
})
|
15
|
+
|
16
|
+
Mangadex::Internal::Request.get(
|
17
|
+
'/report/reasons/%{category}' % args,
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def create(**args)
|
22
|
+
Mangadex::Internal::Request.post(
|
23
|
+
'/report',
|
24
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
25
|
+
category: { accepts: %w(manga chapter scanlation_group user), required: true },
|
26
|
+
reason: { accepts: String, required: true },
|
27
|
+
object_id: { accepts: String, required: true },
|
28
|
+
details: { accepts: String },
|
29
|
+
}),
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.attributes_to_inspect
|
35
|
+
self.attributes
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# typed: false
|
2
|
+
module Mangadex
|
3
|
+
class ScanlationGroup < MangadexObject
|
4
|
+
has_attributes \
|
5
|
+
:name,
|
6
|
+
:website,
|
7
|
+
:irc_channel,
|
8
|
+
:irc_server,
|
9
|
+
:discord,
|
10
|
+
:contact_email,
|
11
|
+
:description,
|
12
|
+
:locked,
|
13
|
+
:official,
|
14
|
+
:verified,
|
15
|
+
:version,
|
16
|
+
:created_at,
|
17
|
+
:updated_at
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def list(**args)
|
21
|
+
Mangadex::Internal::Request.get(
|
22
|
+
'/group',
|
23
|
+
Mangadex::Internal::Definition.validate(args, {
|
24
|
+
limit: { accepts: Integer },
|
25
|
+
offset: { accepts: Integer },
|
26
|
+
ids: { accepts: [String] },
|
27
|
+
name: { accepts: String },
|
28
|
+
includes: { accepts: [String] },
|
29
|
+
}),
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def create(**args)
|
34
|
+
Mangadex::Internal::Request.post(
|
35
|
+
'/group',
|
36
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
37
|
+
name: { accepts: String, required: true },
|
38
|
+
website: { accepts: String },
|
39
|
+
irc_server: { accepts: String },
|
40
|
+
irc_channel: { accepts: String },
|
41
|
+
discord: { accepts: String },
|
42
|
+
contact_email: { accepts: String },
|
43
|
+
description: { accepts: String },
|
44
|
+
}),
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def view(id)
|
49
|
+
Mangadex::Internal::Request.get(
|
50
|
+
'/group/%{id}' % {id: id},
|
51
|
+
Mangadex::Internal::Definition.validate(args, {
|
52
|
+
includes: { accepts: [String] },
|
53
|
+
}),
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def update(id, **args)
|
58
|
+
Mangadex::Internal::Request.put(
|
59
|
+
'/group/%{id}' % {id: id},
|
60
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
61
|
+
name: { accepts: String },
|
62
|
+
website: { accepts: String },
|
63
|
+
irc_server: { accepts: String },
|
64
|
+
irc_channel: { accepts: String },
|
65
|
+
discord: { accepts: String },
|
66
|
+
contact_email: { accepts: String },
|
67
|
+
description: { accepts: String },
|
68
|
+
locked: { accepts: [true, false] },
|
69
|
+
version: { accepts: Integer, required: true },
|
70
|
+
}),
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete(id)
|
75
|
+
Mangadex::Internal::Request.delete(
|
76
|
+
'/group/%{id}' % {id: id},
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
def follow(id)
|
81
|
+
Mangadex::Internal::Request.post(
|
82
|
+
'/group/%{id}/follow' % {id: id},
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def unfollow(id)
|
87
|
+
Mangadex::Internal::Request.delete(
|
88
|
+
'/group/%{id}/follow' % {id: id},
|
89
|
+
)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.inspect_attributes
|
94
|
+
self.attributes - [:version, :created_at, :updated_at]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: false
|
2
|
+
|
3
|
+
# These are custom alias Sorbet types
|
4
|
+
|
5
|
+
module T
|
6
|
+
module Api
|
7
|
+
Text = T.type_alias { T.any(String, Symbol) }
|
8
|
+
|
9
|
+
Arguments = T.type_alias do
|
10
|
+
T.any(
|
11
|
+
Text,
|
12
|
+
T::Array[Text],
|
13
|
+
Integer,
|
14
|
+
T::Hash[Text, Text],
|
15
|
+
)
|
16
|
+
end
|
17
|
+
MangaResponse = T.type_alias do
|
18
|
+
T.any(
|
19
|
+
Mangadex::Api::Response[Mangadex::Manga],
|
20
|
+
Mangadex::Api::Response[T::Array[Mangadex::Manga]]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
ChapterResponse = T.type_alias do
|
24
|
+
T.any(
|
25
|
+
Mangadex::Api::Response[Mangadex::Chapter],
|
26
|
+
Mangadex::Api::Response[T::Array[Mangadex::Chapter]]
|
27
|
+
)
|
28
|
+
end
|
29
|
+
GenericResponse = T.type_alias do
|
30
|
+
T.any(
|
31
|
+
::Hash,
|
32
|
+
Mangadex::Api::Response,
|
33
|
+
)
|
34
|
+
end
|
35
|
+
ContentRating = T.type_alias do
|
36
|
+
T.any(
|
37
|
+
String,
|
38
|
+
::Mangadex::ContentRating,
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/mangadex/tag.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# Utilitary classes
|
3
|
+
require_relative "sorbet"
|
4
|
+
require_relative "content_rating"
|
5
|
+
require_relative "mangadex_object"
|
6
|
+
|
7
|
+
# Authorization
|
8
|
+
require_relative "auth"
|
9
|
+
|
10
|
+
# Mangadex objects
|
11
|
+
require_relative "author"
|
12
|
+
require_relative "artist"
|
13
|
+
require_relative "chapter"
|
14
|
+
require_relative "cover_art"
|
15
|
+
require_relative "custom_list"
|
16
|
+
require_relative "manga"
|
17
|
+
require_relative "upload"
|
18
|
+
require_relative "user"
|
19
|
+
require_relative "tag"
|
20
|
+
require_relative "scanlation_group"
|
21
|
+
require_relative "report_reason"
|
22
|
+
|
23
|
+
# Relationship
|
24
|
+
require_relative "relationship"
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# typed: false
|
2
|
+
module Mangadex
|
3
|
+
class Upload < MangadexObject
|
4
|
+
has_attributes \
|
5
|
+
:is_committed,
|
6
|
+
:is_processed,
|
7
|
+
:is_deleted,
|
8
|
+
:version,
|
9
|
+
:created_at,
|
10
|
+
:updated_at
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def current
|
14
|
+
Mangadex::Internal::Request.get(
|
15
|
+
'/upload',
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def start(**args)
|
20
|
+
Mangadex::Internal::Request.post(
|
21
|
+
'/upload/begin',
|
22
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
23
|
+
groups: { accepts: [String], required: true },
|
24
|
+
manga: { accepts: String, required: true },
|
25
|
+
}),
|
26
|
+
)
|
27
|
+
end
|
28
|
+
alias_method :begin, :start
|
29
|
+
|
30
|
+
def upload_images(upload_session_id)
|
31
|
+
Mangadex::Internal::Request.post(
|
32
|
+
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
33
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
34
|
+
file: { accepts: String },
|
35
|
+
}),
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def abandon(upload_session_id)
|
40
|
+
Mangadex::Internal::Request.delete(
|
41
|
+
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
42
|
+
)
|
43
|
+
end
|
44
|
+
alias_method :stop, :abandon
|
45
|
+
|
46
|
+
def commit(upload_session_id, **args)
|
47
|
+
Mangadex::Internal::Request.post(
|
48
|
+
'/upload/%{upload_session_id}/commit' % {upload_session_id: upload_session_id},
|
49
|
+
payload: Mangadex::Internal::Definition.validate(args, {
|
50
|
+
chapter_draft: { accepts: Hash }, # todo enforce chapter_draft content?
|
51
|
+
page_order: { accepts: [String] },
|
52
|
+
}),
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def delete_uploaded_image(upload_session_id, upload_session_file_id)
|
57
|
+
Mangadex::Internal::Request.delete(
|
58
|
+
'/upload/%{upload_session_id}/%{upload_session_file_id}' % {
|
59
|
+
upload_session_id: upload_session_id,
|
60
|
+
upload_session_file_id: upload_session_file_id,
|
61
|
+
},
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
def delete_uploaded_images(upload_session_id, upload_session_file_ids)
|
66
|
+
Mangadex::Internal::Request.delete(
|
67
|
+
'/upload/%{upload_session_id}' % {upload_session_id: upload_session_id},
|
68
|
+
payload: Array(upload_session_file_id),
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.inspect_attributes
|
74
|
+
[:is_committed, :is_processed, :is_deleted]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# typed: false
|
2
|
+
module Mangadex
|
3
|
+
class User < MangadexObject
|
4
|
+
has_attributes \
|
5
|
+
:username,
|
6
|
+
:roles,
|
7
|
+
:version
|
8
|
+
|
9
|
+
sig { params(args: T::Api::Arguments).returns(Mangadex::Api::Response[Mangadex::Chapter]) }
|
10
|
+
def self.feed(**args)
|
11
|
+
Mangadex::Internal::Request.get(
|
12
|
+
'/user/follows/manga/feed',
|
13
|
+
Mangadex::Internal::Definition.chapter_list(args),
|
14
|
+
auth: true,
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { params(args: T::Api::Arguments).returns(Mangadex::Api::Response[Mangadex::ScanlationGroup]) }
|
19
|
+
def self.followed_groups(**args)
|
20
|
+
Mangadex::Internal::Request.get(
|
21
|
+
'/user/follows/group',
|
22
|
+
Mangadex::Internal::Definition.validate(args, {
|
23
|
+
limit: { accepts: Integer },
|
24
|
+
offset: { accepts: Integer },
|
25
|
+
includes: { accepts: Array },
|
26
|
+
}),
|
27
|
+
auth: true,
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
sig { params(id: String).returns(T::Boolean) }
|
32
|
+
def self.follows_group(id)
|
33
|
+
data = Mangadex::Internal::Request.get(
|
34
|
+
'/user/follows/group/%{id}' % {id: id},
|
35
|
+
raw: true,
|
36
|
+
auth: true,
|
37
|
+
)
|
38
|
+
JSON.parse(data)['result'] == 'ok'
|
39
|
+
rescue JSON::ParserError => error
|
40
|
+
warn(error)
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
sig { params(args: T::Api::Arguments).returns(Mangadex::Api::Response[Mangadex::User]) }
|
45
|
+
def self.followed_users(**args)
|
46
|
+
Mangadex::Internal::Request.get(
|
47
|
+
'/user/follows/user',
|
48
|
+
Mangadex::Internal::Definition.validate(args, {
|
49
|
+
limit: { accepts: Integer },
|
50
|
+
offset: { accepts: Integer },
|
51
|
+
}),
|
52
|
+
auth: true,
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
sig { params(id: String).returns(T::Boolean) }
|
57
|
+
def self.follows_user(id)
|
58
|
+
return if Mangadex::Api::Context.user.nil?
|
59
|
+
|
60
|
+
data = Mangadex::Internal::Request.get(
|
61
|
+
'/user/follows/user/%{id}' % {id: id},
|
62
|
+
raw: true,
|
63
|
+
auth: true,
|
64
|
+
)
|
65
|
+
JSON.parse(data)['result'] == 'ok'
|
66
|
+
rescue JSON::ParserError => error
|
67
|
+
warn(error)
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
sig { params(args: T::Api::Arguments).returns(Mangadex::Api::Response[Mangadex::Manga]) }
|
72
|
+
def self.followed_manga(**args)
|
73
|
+
Mangadex::Internal::Request.get(
|
74
|
+
'/user/follows/manga',
|
75
|
+
Mangadex::Internal::Definition.validate(args, {
|
76
|
+
limit: { accepts: Integer },
|
77
|
+
offset: { accepts: Integer },
|
78
|
+
includes: { accepts: Array },
|
79
|
+
}),
|
80
|
+
auth: true,
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
sig { params(id: String).returns(T::Boolean) }
|
85
|
+
def self.follows_manga(id)
|
86
|
+
return if Mangadex::Api::Context.user.nil?
|
87
|
+
|
88
|
+
data = Mangadex::Internal::Request.get(
|
89
|
+
'/user/follows/manga/%{id}' % {id: id},
|
90
|
+
raw: true,
|
91
|
+
auth: true,
|
92
|
+
)
|
93
|
+
JSON.parse(data)['result'] == 'ok'
|
94
|
+
rescue JSON::ParserError => error
|
95
|
+
warn(error)
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.attributes_to_inspect
|
100
|
+
[:username, :roles]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/mangadex.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# typed: strict
|
2
|
+
require 'sorbet-runtime'
|
3
|
+
|
4
|
+
require 'active_support'
|
5
|
+
require_relative 'extensions'
|
6
|
+
|
7
|
+
# The insides of the gem
|
8
|
+
require "mangadex/version"
|
9
|
+
require "mangadex/internal"
|
10
|
+
|
11
|
+
# Types that represent all of the resources (ie: objects)
|
12
|
+
require "mangadex/types"
|
13
|
+
|
14
|
+
# API, to interact with Mangadex
|
15
|
+
require "mangadex/api"
|
16
|
+
|
17
|
+
# Namespace for classes and modules for this gem.
|
18
|
+
# @since 5.3.0
|
19
|
+
|
20
|
+
module Mangadex
|
21
|
+
# Standard error class for this gem.
|
22
|
+
#
|
23
|
+
# @author thedrummeraki
|
24
|
+
# @since 0.6.0
|
25
|
+
class Error < StandardError
|
26
|
+
extend T::Sig
|
27
|
+
end
|
28
|
+
|
29
|
+
class UserNotLoggedIn < Error
|
30
|
+
sig { returns(String) }
|
31
|
+
def message
|
32
|
+
"You are not logged in. Use [Mangadex::Auth.login] to log in."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/mangadex.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "mangadex/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mangadex"
|
8
|
+
spec.version = Mangadex::VERSION
|
9
|
+
spec.authors = ["Akinyele Cafe-Febrissy"]
|
10
|
+
spec.email = ["me@akinyele.ca"]
|
11
|
+
|
12
|
+
spec.summary = "Your next favourite Ruby gem for interacting with Mangadex.org"
|
13
|
+
spec.homepage = "https://github.com/thedrummeraki/mangadex"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
# Specify which files should be added to the gem when it is released.
|
17
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
18
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
19
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
+
end
|
21
|
+
spec.bindir = "exe"
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
|
25
|
+
spec.add_dependency "psych", "~> 4.0.1"
|
26
|
+
spec.add_dependency "rest-client", "~> 2.1"
|
27
|
+
spec.add_dependency "activesupport", "~> 6.1"
|
28
|
+
spec.add_dependency "sorbet-runtime"
|
29
|
+
|
30
|
+
spec.add_development_dependency "bundler", "~> 2.2.19"
|
31
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
32
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
33
|
+
spec.add_development_dependency "pry"
|
34
|
+
spec.add_development_dependency "sorbet"
|
35
|
+
end
|
data/sorbet/config
ADDED