ygoprodeck 1.0.5 → 1.0.7
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 +4 -4
- data/README.md +10 -5
- data/Rakefile +4 -2
- data/examples/{try_archetype.rb → archetype.rb} +1 -1
- data/examples/banlist.rb +5 -0
- data/examples/check_db.rb +3 -0
- data/examples/list.rb +3 -0
- data/examples/random.rb +18 -0
- data/examples/search.rb +27 -0
- data/examples/search_fuzzy.rb +27 -0
- data/examples/set.rb +3 -0
- data/lib/ygoprodeck/search/archetype.rb +27 -20
- data/lib/ygoprodeck/search/assets/names_card.json +13719 -0
- data/lib/ygoprodeck/search/banlist.rb +36 -24
- data/lib/ygoprodeck/search/card_sets.rb +26 -10
- data/lib/ygoprodeck/search/check_db_version.rb +31 -9
- data/lib/ygoprodeck/search/fuzzy_name.rb +18 -19
- data/lib/ygoprodeck/search/list.rb +46 -20
- data/lib/ygoprodeck/search/match.rb +35 -0
- data/lib/ygoprodeck/search/name.rb +20 -19
- data/lib/ygoprodeck/search/random.rb +18 -10
- data/lib/ygoprodeck/version.rb +1 -1
- data/lib/ygoprodeck.rb +3 -0
- data/spec/spec_helper.rb +1 -1
- data/ygoprodeck.gemspec +3 -2
- metadata +29 -10
- data/examples/try.rb +0 -21
@@ -1,26 +1,38 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
2
|
+
class Banlist
|
3
|
+
def self.fetch_banlist(format)
|
4
|
+
url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?banlist=#{format}"
|
5
|
+
uri = URI(url)
|
6
|
+
|
7
|
+
begin
|
8
|
+
response = Net::HTTP.get(uri)
|
9
|
+
load = JSON.parse(response)
|
10
|
+
|
11
|
+
if load.has_key?('error')
|
12
|
+
{ 'error' => load['error'] }
|
13
|
+
else
|
14
|
+
load
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue JSON::ParserError => e
|
18
|
+
{ 'error' => 'Failed to parse JSON response' }
|
19
|
+
rescue SocketError => e
|
20
|
+
{ 'error' => 'Network connection error' }
|
21
|
+
rescue StandardError => e
|
22
|
+
{ 'error' => "An unexpected error occurred: #{e.message}" }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.tcg
|
27
|
+
fetch_banlist('tcg')
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.ocg
|
31
|
+
fetch_banlist('ocg')
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.goat
|
35
|
+
fetch_banlist('goat')
|
36
|
+
end
|
37
|
+
end
|
26
38
|
end
|
@@ -1,12 +1,28 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
class Card
|
3
|
+
def self.sets
|
4
|
+
url = "https://db.ygoprodeck.com/api/v7/cardsets.php"
|
5
|
+
uri = URI(url)
|
6
|
+
|
7
|
+
begin
|
8
|
+
response = Net::HTTP.get(uri)
|
9
|
+
load = JSON.parse(response)
|
10
|
+
|
11
|
+
if load.is_a?(Hash) && load.has_key?('error')
|
12
|
+
{ 'error' => load['error'] }
|
13
|
+
else
|
14
|
+
load
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue JSON::ParserError => e
|
18
|
+
{ 'error' => 'Failed to parse JSON response' }
|
19
|
+
rescue SocketError => e
|
20
|
+
{ 'error' => 'Network connection error' }
|
21
|
+
rescue Timeout::Error => e
|
22
|
+
{ 'error' => 'Request timed out' }
|
23
|
+
rescue StandardError => e
|
24
|
+
{ 'error' => "An unexpected error occurred: #{e.message}" }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
12
28
|
end
|
@@ -1,11 +1,33 @@
|
|
1
1
|
module Ygoprodeck
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
2
|
+
class CheckDbVer
|
3
|
+
def self.info
|
4
|
+
url = "https://db.ygoprodeck.com/api/v7/checkDBVer.php"
|
5
|
+
uri = URI(url)
|
6
|
+
|
7
|
+
begin
|
8
|
+
response = Net::HTTP.get_response(uri)
|
9
|
+
|
10
|
+
unless response.is_a?(Net::HTTPSuccess)
|
11
|
+
return { 'error' => "HTTP request failed with status code: #{response.code}" }
|
12
|
+
end
|
13
|
+
|
14
|
+
load = JSON.parse(response.body)
|
15
|
+
|
16
|
+
if load.is_a?(Hash) && load.has_key?('error')
|
17
|
+
{ 'error' => load['error'] }
|
18
|
+
else
|
19
|
+
load
|
20
|
+
end
|
21
|
+
|
22
|
+
rescue JSON::ParserError => e
|
23
|
+
{ 'error' => 'Failed to parse JSON response' }
|
24
|
+
rescue SocketError => e
|
25
|
+
{ 'error' => 'Network connection error' }
|
26
|
+
rescue Net::ReadTimeout => e
|
27
|
+
{ 'error' => 'Request timed out' }
|
28
|
+
rescue StandardError => e
|
29
|
+
{ 'error' => "An unexpected error occurred: #{e.message}" }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
11
33
|
end
|
@@ -1,21 +1,20 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
2
|
+
class Fname
|
3
|
+
def self.is(f_name)
|
4
|
+
url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?fname=#{URI.encode_www_form_component(f_name)}"
|
5
|
+
uri = URI(url)
|
6
|
+
|
7
|
+
begin
|
8
|
+
response = Net::HTTP.get(uri)
|
9
|
+
load = JSON.parse(response)
|
10
|
+
|
11
|
+
return nil if load["data"].nil? || load["data"].empty?
|
12
|
+
|
13
|
+
load["data"][0]
|
21
14
|
|
15
|
+
rescue JSON::ParserError, SocketError, StandardError => e
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,21 +1,47 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
2
|
+
class List
|
3
|
+
attr_reader :list
|
4
|
+
|
5
|
+
def self.is(list)
|
6
|
+
begin
|
7
|
+
# Encode query parameter to handle special characters properly
|
8
|
+
url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?fname=#{URI.encode_www_form_component(list)}"
|
9
|
+
uri = URI(url)
|
10
|
+
|
11
|
+
# Use timeout to prevent hanging on slow connections
|
12
|
+
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', open_timeout: 10, read_timeout: 10) do |http|
|
13
|
+
http.get(uri.request_uri)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Check HTTP status code first
|
17
|
+
case response
|
18
|
+
when Net::HTTPSuccess
|
19
|
+
load = JSON.parse(response.body)
|
20
|
+
|
21
|
+
if load.has_key?('error')
|
22
|
+
return { 'error' => load['error'] }
|
23
|
+
elsif load['data'].nil? || load['data'].empty?
|
24
|
+
return { 'error' => 'No card matching your query was found in the database.' }
|
25
|
+
else
|
26
|
+
return load['data']
|
27
|
+
end
|
28
|
+
else
|
29
|
+
return { 'error' => "HTTP request failed with status code: #{response.code}" }
|
30
|
+
end
|
31
|
+
|
32
|
+
rescue URI::InvalidURIError => e
|
33
|
+
{ 'error' => 'Invalid URL or search term' }
|
34
|
+
rescue JSON::ParserError => e
|
35
|
+
{ 'error' => 'Failed to parse JSON response' }
|
36
|
+
rescue Net::OpenTimeout => e
|
37
|
+
{ 'error' => 'Connection timed out' }
|
38
|
+
rescue Net::ReadTimeout => e
|
39
|
+
{ 'error' => 'Request timed out' }
|
40
|
+
rescue SocketError => e
|
41
|
+
{ 'error' => 'Network connection error' }
|
42
|
+
rescue StandardError => e
|
43
|
+
{ 'error' => "An unexpected error occurred: #{e.message}" }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Ygoprodeck
|
2
|
+
class Match
|
3
|
+
def self.normalize(text)
|
4
|
+
text.downcase.gsub(/[^a-z0-9\s\-]/, '').strip
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.is(name_card)
|
8
|
+
json_path = File.expand_path('assets/names_card.json', __dir__)
|
9
|
+
names = JSON.parse(File.read(json_path))
|
10
|
+
|
11
|
+
normalized_input = normalize(name_card)
|
12
|
+
input_words = normalized_input.split
|
13
|
+
|
14
|
+
substring_matches = names.select { |name| normalize(name).include?(normalized_input) }
|
15
|
+
|
16
|
+
if !substring_matches.empty?
|
17
|
+
best_match = substring_matches.min_by { |name| normalize(name).length }
|
18
|
+
else
|
19
|
+
word_matches = names.select do |name|
|
20
|
+
name_words = normalize(name).split
|
21
|
+
input_words.all? { |word| name_words.any? { |nw| nw.include?(word) } }
|
22
|
+
end
|
23
|
+
|
24
|
+
if !word_matches.empty?
|
25
|
+
best_match = word_matches.min_by { |name| normalize(name).length }
|
26
|
+
else
|
27
|
+
matcher = Levenshtein.new(normalized_input)
|
28
|
+
best_match = names.min_by { |name| matcher.match(normalize(name)) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
best_match
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,21 +1,22 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
2
|
+
class Name
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def self.is(name)
|
6
|
+
url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?name=#{URI.encode_www_form_component(name)}"
|
7
|
+
uri = URI(url)
|
8
|
+
|
9
|
+
begin
|
10
|
+
response = Net::HTTP.get(uri)
|
11
|
+
load = JSON.parse(response)
|
12
|
+
|
13
|
+
return nil if load["data"].nil? || load["data"].empty?
|
14
|
+
|
15
|
+
load["data"][0]
|
21
16
|
|
17
|
+
rescue JSON::ParserError, SocketError, StandardError => e
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,12 +1,20 @@
|
|
1
|
-
|
2
1
|
module Ygoprodeck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
class Card
|
3
|
+
def self.random
|
4
|
+
url = "https://db.ygoprodeck.com/api/v7/cardinfo.php?num=1&offset=0&sort=random&cachebust"
|
5
|
+
uri = URI(url)
|
6
|
+
|
7
|
+
begin
|
8
|
+
response = Net::HTTP.get(uri)
|
9
|
+
load = JSON.parse(response)
|
10
|
+
|
11
|
+
return nil if load["data"].nil? || load["data"].empty?
|
12
|
+
|
13
|
+
load["data"][0]
|
14
|
+
|
15
|
+
rescue JSON::ParserError, SocketError, StandardError => e
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
12
20
|
end
|
data/lib/ygoprodeck/version.rb
CHANGED
data/lib/ygoprodeck.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'open-uri'
|
2
2
|
require 'net/http'
|
3
3
|
require 'json'
|
4
|
+
require 'amatch'
|
4
5
|
require 'ygoprodeck/version'
|
5
6
|
require 'ygoprodeck/errors'
|
6
7
|
require 'ygoprodeck/search/client/endpoint'
|
@@ -10,10 +11,12 @@ require 'ygoprodeck/search/card_sets'
|
|
10
11
|
require 'ygoprodeck/search/random'
|
11
12
|
require 'ygoprodeck/search/name'
|
12
13
|
require 'ygoprodeck/search/list'
|
14
|
+
require 'ygoprodeck/search/match'
|
13
15
|
require 'ygoprodeck/search/fuzzy_name'
|
14
16
|
require 'ygoprodeck/search/archetype'
|
15
17
|
require 'ygoprodeck/search/banlist'
|
16
18
|
require 'ygoprodeck/search/check_db_version'
|
19
|
+
include Amatch
|
17
20
|
|
18
21
|
module Ygoprodeck
|
19
22
|
end
|
data/spec/spec_helper.rb
CHANGED
data/ygoprodeck.gemspec
CHANGED
@@ -18,8 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.required_ruby_version = '>= 2.0.0'
|
21
|
-
|
22
|
-
spec.
|
21
|
+
|
22
|
+
spec.add_dependency "amatch", "~> 0.4.1"
|
23
|
+
spec.add_development_dependency "bundler", "~> 2.5.23"
|
23
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
25
26
|
spec.add_development_dependency 'rspec-prof', '~> 0.0.7'
|
metadata
CHANGED
@@ -1,29 +1,42 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ygoprodeck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rokhimin Wahid
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-05-15 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: amatch
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - "~>"
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 0.4.1
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - "~>"
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.4.1
|
13
26
|
- !ruby/object:Gem::Dependency
|
14
27
|
name: bundler
|
15
28
|
requirement: !ruby/object:Gem::Requirement
|
16
29
|
requirements:
|
17
30
|
- - "~>"
|
18
31
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
32
|
+
version: 2.5.23
|
20
33
|
type: :development
|
21
34
|
prerelease: false
|
22
35
|
version_requirements: !ruby/object:Gem::Requirement
|
23
36
|
requirements:
|
24
37
|
- - "~>"
|
25
38
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
39
|
+
version: 2.5.23
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
41
|
name: rake
|
29
42
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,12 +126,19 @@ files:
|
|
113
126
|
- Rakefile
|
114
127
|
- bin/console
|
115
128
|
- bin/setup
|
116
|
-
- examples/
|
117
|
-
- examples/
|
129
|
+
- examples/archetype.rb
|
130
|
+
- examples/banlist.rb
|
131
|
+
- examples/check_db.rb
|
132
|
+
- examples/list.rb
|
133
|
+
- examples/random.rb
|
134
|
+
- examples/search.rb
|
135
|
+
- examples/search_fuzzy.rb
|
136
|
+
- examples/set.rb
|
118
137
|
- lib/ygoprodeck.rb
|
119
138
|
- lib/ygoprodeck/errors.rb
|
120
139
|
- lib/ygoprodeck/search/all_card.rb
|
121
140
|
- lib/ygoprodeck/search/archetype.rb
|
141
|
+
- lib/ygoprodeck/search/assets/names_card.json
|
122
142
|
- lib/ygoprodeck/search/banlist.rb
|
123
143
|
- lib/ygoprodeck/search/card_sets.rb
|
124
144
|
- lib/ygoprodeck/search/check_db_version.rb
|
@@ -126,6 +146,7 @@ files:
|
|
126
146
|
- lib/ygoprodeck/search/client/image_gapis.rb
|
127
147
|
- lib/ygoprodeck/search/fuzzy_name.rb
|
128
148
|
- lib/ygoprodeck/search/list.rb
|
149
|
+
- lib/ygoprodeck/search/match.rb
|
129
150
|
- lib/ygoprodeck/search/name.rb
|
130
151
|
- lib/ygoprodeck/search/random.rb
|
131
152
|
- lib/ygoprodeck/version.rb
|
@@ -146,7 +167,6 @@ homepage: http://github.com/rokhimin/ygoprodeck
|
|
146
167
|
licenses:
|
147
168
|
- MIT
|
148
169
|
metadata: {}
|
149
|
-
post_install_message:
|
150
170
|
rdoc_options: []
|
151
171
|
require_paths:
|
152
172
|
- lib
|
@@ -161,8 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
181
|
- !ruby/object:Gem::Version
|
162
182
|
version: '0'
|
163
183
|
requirements: []
|
164
|
-
rubygems_version: 3.
|
165
|
-
signing_key:
|
184
|
+
rubygems_version: 3.6.3
|
166
185
|
specification_version: 4
|
167
186
|
summary: ygoprodeck API wrapper for search yugioh's card
|
168
187
|
test_files: []
|
data/examples/try.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'ygoprodeck'
|
2
|
-
|
3
|
-
# yugi is example, you free to change variable name
|
4
|
-
yugi = Ygoprodeck::Fname.is('dark magician') # example I wanna search 'dark magician' using fuzzy search
|
5
|
-
|
6
|
-
puts yugi # => get all information of dark magician (name,id,level,attr,atk,def,etc)
|
7
|
-
|
8
|
-
puts '#' *10
|
9
|
-
|
10
|
-
# => get specific information of dark magician
|
11
|
-
puts yugi['id']
|
12
|
-
puts yugi['name']
|
13
|
-
puts yugi['attribute']
|
14
|
-
puts yugi['type']
|
15
|
-
puts yugi['race']
|
16
|
-
puts yugi['level']
|
17
|
-
puts yugi['desc']
|
18
|
-
puts yugi['atk']
|
19
|
-
puts yugi['def']
|
20
|
-
puts Ygoprodeck::Image.is(yugi['id']) # => use id from yugi['id'] to get dark magician image
|
21
|
-
puts Ygoprodeck::Image_small.is(yugi['id']) # => small version
|