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.
@@ -1,26 +1,38 @@
1
-
2
1
  module Ygoprodeck
3
- class Banlist
4
- def self.tcg
5
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?banlist=tcg"
6
- uri = URI(url)
7
- response = Net::HTTP.get(uri)
8
- load = JSON.parse(response)
9
- load
10
- end
11
- def self.ocg
12
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?banlist=ocg"
13
- uri = URI(url)
14
- response = Net::HTTP.get(uri)
15
- load = JSON.parse(response)
16
- load
17
- end
18
- def self.goat
19
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?banlist=goat"
20
- uri = URI(url)
21
- response = Net::HTTP.get(uri)
22
- load = JSON.parse(response)
23
- load
24
- end
25
- end
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
- class Card
4
- def self.sets
5
- url = "https://db.ygoprodeck.com/api/v7/cardsets.php"
6
- uri = URI(url)
7
- response = Net::HTTP.get(uri)
8
- load = JSON.parse(response)
9
- load
10
- end
11
- end
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
- class CheckDbVer
3
- def self.info
4
- url = "https://db.ygoprodeck.com/api/v7/checkDBVer.php"
5
- uri = URI(url)
6
- response = Net::HTTP.get(uri)
7
- load = JSON.parse(response)
8
- load
9
- end
10
- end
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
- class Fname
4
- attr_reader :f_name
5
- def self.is(f_name)
6
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?fname=#{f_name}"
7
- uri = URI(url)
8
- response = Net::HTTP.get(uri)
9
- load = JSON.parse(response)
10
-
11
- if load['data'][0] == nil
12
- '{"error"=>"No card matching your query was found in the database."}'
13
- else
14
- load['data'][0]
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
- class List
4
- attr_reader :list
5
- def self.is(list)
6
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?fname=#{list}"
7
- uri = URI(url)
8
- response = Net::HTTP.get(uri)
9
- load = JSON.parse(response)
10
-
11
- if load['data'] == nil
12
- '{"error"=>"No card matching your query was found in the database."}'
13
- else
14
- load['data']
15
- end
16
-
17
- end
18
- end
19
-
20
- end
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
- class Name
4
- attr_reader :name
5
- def self.is(name)
6
- url = "#{Ygoprodeck::Endpoint.is}cardinfo.php?name=#{name}"
7
- uri = URI(url)
8
- response = Net::HTTP.get(uri)
9
- load = JSON.parse(response)
10
-
11
- if load['data'][0] == nil
12
- '{"error"=>"No card matching your query was found in the database."}'
13
- else
14
- load['data'][0]
15
- end
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
- class Card
4
- def self.random
5
- url = "https://db.ygoprodeck.com/api/v7/cardinfo.php?num=1&offset=0&sort=random&cachebust"
6
- uri = URI(url)
7
- response = Net::HTTP.get(uri)
8
- load = JSON.parse(response)
9
- load['data'][0]
10
- end
11
- end
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
@@ -1,3 +1,3 @@
1
1
  module Ygoprodeck
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.7"
3
3
  end
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
@@ -1,4 +1,4 @@
1
- require "bundler/setup"
1
+ require "bundler"
2
2
  require "ygoprodeck"
3
3
 
4
4
  RSpec.configure do |config|
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.add_development_dependency "bundler", "~> 2.2.3"
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.5
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: 2024-12-30 00:00:00.000000000 Z
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.2.3
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.2.3
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/try.rb
117
- - examples/try_archetype.rb
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.2.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