gwitch 0.0.1 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +44 -15
- data/bin/gwitch +24 -0
- data/lib/gwitch.rb +2 -2
- data/lib/gwitch/cli.rb +56 -0
- data/lib/gwitch/country.rb +16 -13
- data/lib/gwitch/game.rb +8 -15
- data/lib/gwitch/region.rb +15 -9
- data/lib/gwitch/region/americas.rb +3 -8
- data/lib/gwitch/region/asia.rb +3 -5
- data/lib/gwitch/region/europe.rb +3 -5
- data/lib/gwitch/version.rb +2 -4
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82b6169c6117ff674bb11ac60e62d9eadaa6445755e6b6ebc0c1ea23d62a0254
|
4
|
+
data.tar.gz: 1b83dd4d0243c328917d997f6c9463cc4b464711560172d8cf2afb6d45167a1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eff925c25baaba1530f03d0389669e337249a4997420e2ca22760950e2ecaf5055e7c724ccbf407d1f0cd3b1702de0a93eab734cdd680e2adb532f883df9d4a3
|
7
|
+
data.tar.gz: b3099b85d58a4c74ac6aa6a6d5bf971b038484d03b501da5c6f6026f37b3758b1f4ddf8ad5565fff49993c3b278dd7cea816730ea6ed5e2e43d7b20e9b347106
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## [1.0.0](https://github.com/dounx/gwitch/releases/tag/1.0.0) (2020-05-25)
|
2
|
+
|
3
|
+
* Fix typo
|
4
|
+
* Fix a bug
|
5
|
+
* Update gemspec
|
6
|
+
* Update readme
|
7
|
+
* Refactor code
|
8
|
+
* Add some rake tasks
|
9
|
+
* Add gitignore
|
10
|
+
* Add mutex for multi threads
|
11
|
+
* Remove redundant comments
|
12
|
+
* Make get all games simultaneously
|
13
|
+
* Add cli
|
14
|
+
* Add some tests
|
15
|
+
|
1
16
|
## [0.0.1](https://github.com/dounx/gwitch/releases/tag/0.0.1) (2020-05-21)
|
2
17
|
|
3
18
|
* Initial import
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Gwitch
|
2
2
|
|
3
|
-
Gwitch can get switch games info (including price) from nintendo official API.
|
3
|
+
Gwitch can get switch games' info (including price) from nintendo official API.
|
4
4
|
|
5
5
|
## Prerequisites
|
6
6
|
|
@@ -24,21 +24,37 @@ And then execute:
|
|
24
24
|
|
25
25
|
## Basic Usage
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
### Bash
|
28
|
+
|
29
|
+
```
|
30
|
+
Usage: gwitch [options]
|
31
|
+
-g, --games Get all games (without price info)
|
32
|
+
-p, --price alpha2,nsuid1,nsuid2 Get games' price (Max 50 nsuids)
|
33
|
+
-c, --countries Get avaliable countries' alpha2 code
|
34
|
+
-v, --version Print version and exit
|
35
|
+
-h, --help Show help
|
36
|
+
```
|
37
|
+
|
38
|
+
The returned data will always be in json format.
|
39
|
+
|
40
|
+
Can be used with pipes and redirects.
|
41
|
+
|
42
|
+
eg.
|
43
|
+
|
44
|
+
```bash
|
45
|
+
gwitch -g >> games.json
|
29
46
|
```
|
30
47
|
|
31
|
-
|
48
|
+
### Ruby
|
32
49
|
|
33
50
|
```ruby
|
34
|
-
|
51
|
+
require 'gwitch'
|
35
52
|
```
|
36
53
|
|
37
|
-
Get all games
|
54
|
+
Get all games.
|
38
55
|
|
39
56
|
```ruby
|
40
|
-
|
41
|
-
games = Gwitch::Game.all('Americas')
|
57
|
+
games = Gwitch::Game.all
|
42
58
|
```
|
43
59
|
|
44
60
|
Get all avaliable countries.
|
@@ -50,16 +66,21 @@ countries = Gwitch::Country.all
|
|
50
66
|
Get country's info.
|
51
67
|
|
52
68
|
```ruby
|
53
|
-
country =
|
54
|
-
country.alpha2
|
55
|
-
country.region
|
56
|
-
country.currency
|
69
|
+
country = countries.first
|
70
|
+
country.alpha2 # => 'US'
|
71
|
+
country.region # => 'Americas'
|
72
|
+
country.currency # => 'USD'
|
73
|
+
country.avaliable? # => true
|
57
74
|
```
|
58
75
|
|
59
|
-
Query
|
76
|
+
Query games' price (Max 50 games).
|
60
77
|
|
61
78
|
```ruby
|
62
|
-
|
79
|
+
prices = Gwitch::Game.price('US', 'en', '70010000000141,70010000000142')
|
80
|
+
|
81
|
+
prices = Gwitch::Game.price('US', 'en', ['70010000000141', '70010000000142'])
|
82
|
+
|
83
|
+
prices = Gwitch::Game.price('US', 'en', [70010000000141, 70010000000142])
|
63
84
|
```
|
64
85
|
|
65
86
|
## Build
|
@@ -68,7 +89,15 @@ price = Gwitch::Game.price('US', 'en', '70010000000141')
|
|
68
89
|
git clone https://github.com/Dounx/gwitch
|
69
90
|
cd gwitch
|
70
91
|
gem build gwitch.gemspec
|
71
|
-
gem install --local gwitch
|
92
|
+
gem install --local gwitch-*.gem
|
93
|
+
```
|
94
|
+
|
95
|
+
## Rake
|
96
|
+
|
97
|
+
List of available tasks
|
98
|
+
|
99
|
+
```bash
|
100
|
+
rake --tasks
|
72
101
|
```
|
73
102
|
|
74
103
|
## License
|
data/bin/gwitch
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative "../lib/gwitch"
|
6
|
+
require_relative "../lib/gwitch/cli"
|
7
|
+
|
8
|
+
cli = Gwitch::CLI.new
|
9
|
+
cli.parse
|
10
|
+
|
11
|
+
options = cli.options
|
12
|
+
|
13
|
+
if options[:game]
|
14
|
+
puts Gwitch::Game.all.to_json
|
15
|
+
elsif options[:price]
|
16
|
+
opts = options[:price]
|
17
|
+
country = Gwitch::Country.new opts[0]
|
18
|
+
nsuids = opts.drop(1).map(&:to_i)
|
19
|
+
puts Gwitch::Game.price(country.alpha2, nsuids.join(',')).to_json
|
20
|
+
elsif options[:country]
|
21
|
+
puts Gwitch::Country.all.map(&:alpha2).to_json
|
22
|
+
else
|
23
|
+
puts cli.parser
|
24
|
+
end
|
data/lib/gwitch.rb
CHANGED
data/lib/gwitch/cli.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "optparse"
|
4
|
+
require_relative "version"
|
5
|
+
|
6
|
+
module Gwitch
|
7
|
+
class CLI
|
8
|
+
attr_reader :options, :parser
|
9
|
+
|
10
|
+
def parse(args = ARGV)
|
11
|
+
@options = setup_options(args)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def setup_options(args)
|
17
|
+
parse_options(args)
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_options(argv)
|
21
|
+
opts = {}
|
22
|
+
@parser = option_parser(opts)
|
23
|
+
@parser.parse!(argv)
|
24
|
+
opts
|
25
|
+
end
|
26
|
+
|
27
|
+
def option_parser(opts)
|
28
|
+
parser = OptionParser.new { |o|
|
29
|
+
o.on "-g", "--games", "Get all games (without price info)" do |arg|
|
30
|
+
opts[:game] = arg
|
31
|
+
end
|
32
|
+
|
33
|
+
o.on "-p", "--price alpha2,nsuid1,nsuid2", Array, "Get games' price (Max 50 nsuids)" do |arg|
|
34
|
+
opts[:price] = arg
|
35
|
+
end
|
36
|
+
|
37
|
+
o.on "-c", "--countries", "Get avaliable countries' alpha2 code" do |arg|
|
38
|
+
opts[:country] = arg
|
39
|
+
end
|
40
|
+
|
41
|
+
o.on "-v", "--version", "Print version and exit" do |arg|
|
42
|
+
puts "Gwitch #{VERSION}"
|
43
|
+
exit 0
|
44
|
+
end
|
45
|
+
}
|
46
|
+
|
47
|
+
parser.banner = "Usage: gwitch [options]"
|
48
|
+
parser.on_tail "-h", "--help", "Show help" do
|
49
|
+
puts parser
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
parser
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/gwitch/country.rb
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require_relative
|
3
|
+
require "countries"
|
4
|
+
require_relative "game"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Country
|
8
|
+
InvaildAlpha2CodeError = Class.new(StandardError)
|
9
|
+
|
8
10
|
class << self
|
9
11
|
# All avaliable countries
|
10
12
|
def all
|
11
|
-
ISO3166::Country.all.map
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
13
|
+
countries = ISO3166::Country.all.map do |country|
|
14
|
+
Country.new(country.alpha2)
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
# An americas game
|
20
|
-
nsuid = '70010000000141'
|
21
|
-
|
22
|
-
!Game.price(alpha2, nsuid).nil?
|
17
|
+
countries.select{ |country| country.avaliable? }
|
23
18
|
end
|
24
19
|
end
|
25
20
|
|
26
21
|
def initialize(alpha2)
|
27
22
|
@country = ISO3166::Country[alpha2]
|
23
|
+
raise InvaildAlpha2CodeError unless @country
|
28
24
|
end
|
29
25
|
|
30
26
|
def alpha2
|
@@ -38,5 +34,12 @@ module Gwitch
|
|
38
34
|
def currency
|
39
35
|
@country.currency_code
|
40
36
|
end
|
37
|
+
|
38
|
+
def avaliable?
|
39
|
+
# An americas game
|
40
|
+
nsuid = '70010000000141'
|
41
|
+
|
42
|
+
!Game.price(alpha2, nsuid).nil?
|
43
|
+
end
|
41
44
|
end
|
42
45
|
end
|
data/lib/gwitch/game.rb
CHANGED
@@ -1,34 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "region"
|
4
4
|
|
5
5
|
module Gwitch
|
6
6
|
class Game
|
7
7
|
IdsExceedMaxError = Class.new(StandardError)
|
8
8
|
|
9
|
+
MAX_IDS_SIZE = 50
|
10
|
+
|
9
11
|
class << self
|
10
|
-
def all
|
11
|
-
|
12
|
-
when 'Americas'
|
13
|
-
Region::Americas.games
|
14
|
-
when 'Asia'
|
15
|
-
Region::Asia.games
|
16
|
-
when 'Europe'
|
17
|
-
Region::Europe.games
|
18
|
-
else
|
19
|
-
Region.games
|
20
|
-
end
|
12
|
+
def all
|
13
|
+
Region.games
|
21
14
|
end
|
22
15
|
|
23
|
-
# ids can be String or Array
|
24
16
|
def price(alpha2, ids, lang = 'en')
|
25
|
-
|
17
|
+
ids = ids.split(',') if ids.is_a?(String)
|
18
|
+
raise IdsExceedMaxError if ids.size > MAX_IDS_SIZE
|
26
19
|
|
27
20
|
api_url = 'https://api.ec.nintendo.com/v1/price'
|
28
21
|
queries = {
|
29
22
|
country: alpha2,
|
30
23
|
lang: lang,
|
31
|
-
ids: ids
|
24
|
+
ids: ids.join(',')
|
32
25
|
}
|
33
26
|
|
34
27
|
uri = URI.parse(api_url)
|
data/lib/gwitch/region.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
3
|
+
require_relative "region/americas"
|
4
|
+
require_relative "region/asia"
|
5
|
+
require_relative "region/europe"
|
6
6
|
|
7
7
|
module Gwitch
|
8
|
-
|
9
|
-
# Get all games from americas, asia and europe eshops
|
10
8
|
class Region
|
11
9
|
def self.games
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
semaphore = Mutex.new
|
11
|
+
games = []
|
12
|
+
|
13
|
+
threads =
|
14
|
+
[Americas, Asia, Europe].map do |region|
|
15
|
+
Thread.new do
|
16
|
+
semaphore.synchronize {
|
17
|
+
games += region.games
|
18
|
+
}
|
19
|
+
end
|
15
20
|
end
|
16
|
-
|
21
|
+
threads.each(&:join)
|
22
|
+
games
|
17
23
|
end
|
18
24
|
end
|
19
25
|
end
|
@@ -1,11 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "algoliasearch"
|
4
4
|
|
5
5
|
module Gwitch
|
6
6
|
class Region
|
7
|
-
|
8
|
-
# A class which get games from americas eshop.
|
9
7
|
class Americas
|
10
8
|
CLIENT = Algolia::Client.new(
|
11
9
|
application_id: 'U3B6GR4UA3',
|
@@ -18,10 +16,8 @@ module Gwitch
|
|
18
16
|
|
19
17
|
# Trick for API limitation.
|
20
18
|
# Nintendo limit each facet can only get 1000 results.
|
21
|
-
# So
|
19
|
+
# So use facets as much as possible to get results.
|
22
20
|
# Maybe incompletely got.
|
23
|
-
# DON'T use this directly.
|
24
|
-
# Use filters method.
|
25
21
|
FACETS = {
|
26
22
|
generalFilters: ['Deals', 'DLC available', 'Demo available', 'Online Play via Nintendo Switch Online', 'Nintendo Switch Game Voucher'],
|
27
23
|
availability: ['New releases', 'Available now', 'Pre-purchase', 'Coming soon'],
|
@@ -78,8 +74,6 @@ module Gwitch
|
|
78
74
|
hits
|
79
75
|
end
|
80
76
|
|
81
|
-
# GalleryParsedError = Class.new
|
82
|
-
|
83
77
|
def parse(raw)
|
84
78
|
host = 'https://www.nintendo.com'
|
85
79
|
microsite_host = 'https://assets.nintendo.com/image/upload/f_auto,q_auto,w_960,h_540'
|
@@ -132,6 +126,7 @@ module Gwitch
|
|
132
126
|
categories: game['categories'],
|
133
127
|
maker: game['publishers']&.join(', '),
|
134
128
|
player: game['players'],
|
129
|
+
region: 'Americas',
|
135
130
|
images: image_urls,
|
136
131
|
url: url,
|
137
132
|
release_at: game['releaseDateMask']
|
data/lib/gwitch/region/asia.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "open-uri"
|
4
|
+
require "json"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Region
|
8
|
-
|
9
|
-
# A class which get games from asia eshop.
|
10
8
|
class Asia
|
11
9
|
API_URL = 'https://search.nintendo.jp/nintendo_soft/search.json'
|
12
10
|
QUERIES = {
|
@@ -17,7 +15,6 @@ module Gwitch
|
|
17
15
|
}.freeze
|
18
16
|
|
19
17
|
class << self
|
20
|
-
# Get all games from asia eshop.
|
21
18
|
def games
|
22
19
|
games = []
|
23
20
|
uri = URI.parse(API_URL)
|
@@ -66,6 +63,7 @@ module Gwitch
|
|
66
63
|
languages: game['lang'],
|
67
64
|
modes: modes,
|
68
65
|
dlcs: game['cnsuid'] || [],
|
66
|
+
region: 'Asia',
|
69
67
|
images: image_urls,
|
70
68
|
url: url,
|
71
69
|
release_at: game['pdate']
|
data/lib/gwitch/region/europe.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "open-uri"
|
4
|
+
require "json"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Region
|
8
|
-
|
9
|
-
# A class which get games from europe eshop.
|
10
8
|
class Europe
|
11
9
|
RowsTooSmallError = Class.new(StandardError)
|
12
10
|
|
@@ -23,7 +21,6 @@ module Gwitch
|
|
23
21
|
}.freeze
|
24
22
|
|
25
23
|
class << self
|
26
|
-
# Get all games from asia eshop.
|
27
24
|
def games
|
28
25
|
uri = URI.parse(API_URL)
|
29
26
|
uri.query = URI.encode_www_form(QUERIES)
|
@@ -62,6 +59,7 @@ module Gwitch
|
|
62
59
|
languages: game['language_availability']&.first&.split(',') || [],
|
63
60
|
modes: modes,
|
64
61
|
cloud_save: game['cloud_saves_b'],
|
62
|
+
region: 'Europe',
|
65
63
|
images: [
|
66
64
|
schema + game['image_url'],
|
67
65
|
schema + game['image_url_sq_s'],
|
data/lib/gwitch/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gwitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dounx
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algoliasearch
|
@@ -38,16 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.0'
|
41
|
-
description:
|
41
|
+
description: Gwitch can get switch games' info (including price) from nintendo official
|
42
|
+
API.
|
42
43
|
email: imdounx@gmail.com
|
43
|
-
executables:
|
44
|
+
executables:
|
45
|
+
- gwitch
|
44
46
|
extensions: []
|
45
47
|
extra_rdoc_files: []
|
46
48
|
files:
|
47
49
|
- CHANGELOG.md
|
48
50
|
- LICENSE
|
49
51
|
- README.md
|
52
|
+
- bin/gwitch
|
50
53
|
- lib/gwitch.rb
|
54
|
+
- lib/gwitch/cli.rb
|
51
55
|
- lib/gwitch/country.rb
|
52
56
|
- lib/gwitch/game.rb
|
53
57
|
- lib/gwitch/region.rb
|
@@ -81,5 +85,5 @@ requirements: []
|
|
81
85
|
rubygems_version: 3.1.2
|
82
86
|
signing_key:
|
83
87
|
specification_version: 4
|
84
|
-
summary: Nintendo switch
|
88
|
+
summary: Nintendo switch games' info API.
|
85
89
|
test_files: []
|