cw_card_utils 0.1.6 → 0.1.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/lib/cw_card_utils/deck_comparator.rb +1 -1
- data/lib/cw_card_utils/decklist_parser/archetype_detector.rb +117 -0
- data/lib/cw_card_utils/decklist_parser/card.rb +60 -0
- data/lib/cw_card_utils/decklist_parser/card_tagger.rb +141 -0
- data/lib/cw_card_utils/decklist_parser/color_identity_resolver.rb +51 -0
- data/lib/cw_card_utils/decklist_parser/deck.rb +223 -0
- data/lib/cw_card_utils/decklist_parser/parser.rb +51 -0
- data/lib/cw_card_utils/decklist_parser.rb +6 -590
- data/lib/cw_card_utils/scryfall_cmc_data.rb +98 -51
- data/lib/cw_card_utils/version.rb +1 -1
- metadata +7 -1
@@ -1,11 +1,85 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "json"
|
4
|
+
require "singleton"
|
4
5
|
|
5
6
|
module CwCardUtils
|
7
|
+
# Abstract base class for card data sources
|
8
|
+
class CardDataSource
|
9
|
+
def find_card(name)
|
10
|
+
raise NotImplementedError, "Subclasses must implement find_card"
|
11
|
+
end
|
12
|
+
|
13
|
+
def cmc_for_card(name)
|
14
|
+
card = find_card(name)
|
15
|
+
card&.dig("cmc")
|
16
|
+
rescue StandardError
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def color_identity_for_card(name)
|
21
|
+
card = find_card(name)
|
22
|
+
card&.dig("color_identity") || []
|
23
|
+
rescue StandardError
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
27
|
+
def keywords_for_card(name)
|
28
|
+
card = find_card(name)
|
29
|
+
card&.dig("keywords") || []
|
30
|
+
rescue StandardError
|
31
|
+
[]
|
32
|
+
end
|
33
|
+
|
34
|
+
def toughness_for_card(name)
|
35
|
+
card = find_card(name)
|
36
|
+
card&.dig("toughness")
|
37
|
+
rescue StandardError
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def power_for_card(name)
|
42
|
+
card = find_card(name)
|
43
|
+
card&.dig("power")
|
44
|
+
rescue StandardError
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def oracle_text_for_card(name)
|
49
|
+
card = find_card(name)
|
50
|
+
card&.dig("oracle_text")
|
51
|
+
rescue StandardError
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def type_for_card(name)
|
56
|
+
card = find_card(name)
|
57
|
+
type = card&.dig("type_line")
|
58
|
+
return nil if type&.include?("Land")
|
59
|
+
type
|
60
|
+
rescue StandardError
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Example MongoDB data source implementation
|
66
|
+
# Users can implement their own data sources by inheriting from CardDataSource
|
67
|
+
class MongoCardDataSource < CardDataSource
|
68
|
+
def initialize(collection)
|
69
|
+
super()
|
70
|
+
@collection = collection
|
71
|
+
end
|
72
|
+
|
73
|
+
def find_card(name)
|
74
|
+
@collection.find_one({ "name" => name })
|
75
|
+
rescue StandardError
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
6
80
|
# Represents a card with Scryfall data
|
7
81
|
class ScryfallCard
|
8
|
-
def initialize(name, data_source = ScryfallCmcData.
|
82
|
+
def initialize(name, data_source = ScryfallCmcData.instance)
|
9
83
|
@name = name
|
10
84
|
@data = data_source.find_card(@name) || {}
|
11
85
|
end
|
@@ -40,74 +114,47 @@ module CwCardUtils
|
|
40
114
|
end
|
41
115
|
|
42
116
|
# Handles conversion mana cost (CMC) data for Magic: The Gathering cards
|
43
|
-
|
117
|
+
# Uses Singleton pattern to avoid loading the large JSON file multiple times
|
118
|
+
class ScryfallCmcData < CardDataSource
|
119
|
+
include Singleton
|
120
|
+
|
44
121
|
def initialize
|
45
|
-
|
122
|
+
super
|
123
|
+
@data = nil
|
124
|
+
@card_index = nil
|
46
125
|
@found_cards = {}
|
47
126
|
end
|
48
127
|
|
49
128
|
def find_card(name)
|
50
|
-
|
129
|
+
load_data_if_needed
|
130
|
+
@card_index[name] || @found_cards[name] ||= linear_search(name)
|
51
131
|
rescue StandardError
|
52
132
|
nil
|
53
133
|
end
|
54
134
|
|
55
|
-
def
|
56
|
-
|
57
|
-
@
|
58
|
-
rescue StandardError
|
59
|
-
nil
|
60
|
-
end
|
61
|
-
|
62
|
-
def color_identity_for_card(name)
|
63
|
-
@found_cards[name] ||= find_card(name)
|
64
|
-
@found_cards[name]["color_identity"]
|
65
|
-
rescue StandardError
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
|
69
|
-
def keywords_for_card(name)
|
70
|
-
@found_cards[name] ||= find_card(name)
|
71
|
-
@found_cards[name]["keywords"]
|
72
|
-
rescue StandardError
|
73
|
-
nil
|
135
|
+
def cmc_data
|
136
|
+
load_data_if_needed
|
137
|
+
@data
|
74
138
|
end
|
75
139
|
|
76
|
-
|
77
|
-
@found_cards[name] ||= find_card(name)
|
78
|
-
@found_cards[name]["toughness"]
|
79
|
-
rescue StandardError
|
80
|
-
nil
|
81
|
-
end
|
140
|
+
private
|
82
141
|
|
83
|
-
def
|
84
|
-
|
85
|
-
@found_cards[name]["power"]
|
86
|
-
rescue StandardError
|
87
|
-
nil
|
88
|
-
end
|
142
|
+
def load_data_if_needed
|
143
|
+
return if @data
|
89
144
|
|
90
|
-
|
91
|
-
|
92
|
-
@found_cards[name]["oracle_text"]
|
93
|
-
rescue StandardError
|
94
|
-
nil
|
145
|
+
@data = JSON.parse(File.read(File.expand_path("../../data/scryfall.cards.cmc.json", __dir__)))
|
146
|
+
build_card_index
|
95
147
|
end
|
96
148
|
|
97
|
-
def
|
98
|
-
@
|
99
|
-
|
100
|
-
|
101
|
-
type = nil
|
149
|
+
def build_card_index
|
150
|
+
@card_index = {}
|
151
|
+
@data.each do |card|
|
152
|
+
@card_index[card["name"]] = card
|
102
153
|
end
|
103
|
-
|
104
|
-
type
|
105
|
-
rescue StandardError
|
106
|
-
nil
|
107
154
|
end
|
108
155
|
|
109
|
-
def
|
110
|
-
@data
|
156
|
+
def linear_search(name)
|
157
|
+
@data.find { |card| card["name"] == name }
|
111
158
|
end
|
112
159
|
end
|
113
160
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cw_card_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Stenhouse
|
@@ -40,6 +40,12 @@ files:
|
|
40
40
|
- lib/cw_card_utils/curve_calculator.rb
|
41
41
|
- lib/cw_card_utils/deck_comparator.rb
|
42
42
|
- lib/cw_card_utils/decklist_parser.rb
|
43
|
+
- lib/cw_card_utils/decklist_parser/archetype_detector.rb
|
44
|
+
- lib/cw_card_utils/decklist_parser/card.rb
|
45
|
+
- lib/cw_card_utils/decklist_parser/card_tagger.rb
|
46
|
+
- lib/cw_card_utils/decklist_parser/color_identity_resolver.rb
|
47
|
+
- lib/cw_card_utils/decklist_parser/deck.rb
|
48
|
+
- lib/cw_card_utils/decklist_parser/parser.rb
|
43
49
|
- lib/cw_card_utils/scryfall_cmc_data.rb
|
44
50
|
- lib/cw_card_utils/version.rb
|
45
51
|
- sig/cw_card_utils.rbs
|