cw_card_utils 0.1.5 → 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.
@@ -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.new)
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
- class ScryfallCmcData
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
- @data = JSON.parse(File.read(File.expand_path("../../data/scryfall.cards.cmc.json", __dir__)))
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
- @data.find { |card| card["name"] == name }
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 cmc_for_card(name)
56
- @found_cards[name] ||= find_card(name)
57
- @found_cards[name]["cmc"]
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
- def toughness_for_card(name)
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 power_for_card(name)
84
- @found_cards[name] ||= find_card(name)
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
- def oracle_text_for_card(name)
91
- @found_cards[name] ||= find_card(name)
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 type_for_card(name)
98
- @found_cards[name] ||= find_card(name)
99
- type = @found_cards[name]["type_line"]
100
- if type.include?("Land")
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 cmc_data
110
- @data
156
+ def linear_search(name)
157
+ @data.find { |card| card["name"] == name }
111
158
  end
112
159
  end
113
160
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CwCardUtils
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.7"
5
5
  end
data/lib/cw_card_utils.rb CHANGED
@@ -4,6 +4,7 @@ require_relative "cw_card_utils/version"
4
4
  require_relative "cw_card_utils/curve_calculator"
5
5
  require_relative "cw_card_utils/decklist_parser"
6
6
  require_relative "cw_card_utils/scryfall_cmc_data"
7
+ require_relative "cw_card_utils/deck_comparator"
7
8
 
8
9
  module CwCardUtils
9
10
  class Error < StandardError; 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.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Stenhouse
@@ -38,7 +38,14 @@ files:
38
38
  - data/scryfall.cards.cmc.json
39
39
  - lib/cw_card_utils.rb
40
40
  - lib/cw_card_utils/curve_calculator.rb
41
+ - lib/cw_card_utils/deck_comparator.rb
41
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
42
49
  - lib/cw_card_utils/scryfall_cmc_data.rb
43
50
  - lib/cw_card_utils/version.rb
44
51
  - sig/cw_card_utils.rbs