carddb 0.4.5 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fb43b6e9dec309a8ad488be46032c6085d30762cfb5063a5dca074b4fab0dc2
4
- data.tar.gz: 680dc414532152208d5044d8400810ac77db75ea338d1d311ae7ac3b3d61ab43
3
+ metadata.gz: ceef6d739c3216a5580fbdb226d56bb0e06f0ac383bf602338116f6373f3d6f8
4
+ data.tar.gz: 27d48679aa8a00933df584e9879e3edfa9d15f6e66c85657741a950fae7fb89a
5
5
  SHA512:
6
- metadata.gz: 9c1c6f9a924d66b680dcf7b02cb00e7b3c61635d28e4993ccfc6cdc89d679ec3cc2b4409e53dc1e3cf8d5d847937db3e745c60971e15d262970c10684148d5d0
7
- data.tar.gz: eed25e8f62c187140ad46acea7adb83116bc70ec7d584306226728c93bbb8062deb05d303809fbde589ad47dc521aed5505958695164bc66045dbb61bc75b509
6
+ metadata.gz: 503f9bec588094aab1460dca8128f352108c60bd95ece2ab4316a6fc1989f0b5b96a935bbb210cac3b70e9148a847bd812646eaf5594ae055e0f203d5733ed06
7
+ data.tar.gz: 91f1ba2dcf4401a31c03b581fa756e5dc4a3fa039809bc40ea008651b04766f62f9df53cc5da2d8f24799f807d5b2e4f2ce244bd643ff0d57f8f67c55488f1d3
data/.rspec_status CHANGED
@@ -1,189 +1,202 @@
1
1
  example_id | status | run_time |
2
2
  ---------------------------------------------------------- | ------ | --------------- |
3
- ./spec/carddb/batch_spec.rb[1:1] | passed | 0.00945 seconds |
3
+ ./spec/carddb/batch_spec.rb[1:1] | passed | 0.00897 seconds |
4
4
  ./spec/carddb/client_spec.rb[1:1:1] | passed | 0.00005 seconds |
5
- ./spec/carddb/client_spec.rb[1:1:2] | passed | 0.00004 seconds |
6
- ./spec/carddb/client_spec.rb[1:1:3] | passed | 0.00004 seconds |
5
+ ./spec/carddb/client_spec.rb[1:1:2] | passed | 0.00003 seconds |
6
+ ./spec/carddb/client_spec.rb[1:1:3] | passed | 0.00003 seconds |
7
7
  ./spec/carddb/client_spec.rb[1:1:4] | passed | 0.00003 seconds |
8
- ./spec/carddb/client_spec.rb[1:2:1] | passed | 0.00015 seconds |
9
- ./spec/carddb/client_spec.rb[1:2:2] | passed | 0.00018 seconds |
10
- ./spec/carddb/client_spec.rb[1:3:1] | passed | 0.00004 seconds |
11
- ./spec/carddb/client_spec.rb[1:4:1] | passed | 0.00004 seconds |
8
+ ./spec/carddb/client_spec.rb[1:2:1] | passed | 0.00013 seconds |
9
+ ./spec/carddb/client_spec.rb[1:2:2] | passed | 0.00035 seconds |
10
+ ./spec/carddb/client_spec.rb[1:3:1] | passed | 0.00003 seconds |
11
+ ./spec/carddb/client_spec.rb[1:4:1] | passed | 0.00003 seconds |
12
12
  ./spec/carddb/client_spec.rb[1:5:1] | passed | 0.00004 seconds |
13
13
  ./spec/carddb/client_spec.rb[1:6:1] | passed | 0.00004 seconds |
14
14
  ./spec/carddb/client_spec.rb[1:7:1] | passed | 0.00003 seconds |
15
15
  ./spec/carddb/client_spec.rb[1:8:1] | passed | 0.00003 seconds |
16
- ./spec/carddb/client_spec.rb[1:9:1] | passed | 0.00004 seconds |
16
+ ./spec/carddb/client_spec.rb[1:9:1] | passed | 0.00003 seconds |
17
17
  ./spec/carddb/client_spec.rb[1:10:1] | passed | 0.00003 seconds |
18
- ./spec/carddb/client_spec.rb[1:11:1] | passed | 0.00004 seconds |
19
- ./spec/carddb/client_spec.rb[1:12:1] | passed | 0.00003 seconds |
20
- ./spec/carddb/client_spec.rb[1:13:1] | passed | 0.00025 seconds |
21
- ./spec/carddb/client_spec.rb[1:13:2] | passed | 0.00411 seconds |
18
+ ./spec/carddb/client_spec.rb[1:11:1] | passed | 0.00003 seconds |
19
+ ./spec/carddb/client_spec.rb[1:12:1] | passed | 0.00004 seconds |
20
+ ./spec/carddb/client_spec.rb[1:13:1] | passed | 0.00003 seconds |
21
+ ./spec/carddb/client_spec.rb[1:14:1] | passed | 0.00041 seconds |
22
+ ./spec/carddb/client_spec.rb[1:14:2] | passed | 0.0038 seconds |
22
23
  ./spec/carddb/collection_spec.rb[1:1:1] | passed | 0.00005 seconds |
23
- ./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.00004 seconds |
24
- ./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.00195 seconds |
25
- ./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.00015 seconds |
26
- ./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.00033 seconds |
27
- ./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.00033 seconds |
24
+ ./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.00003 seconds |
25
+ ./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.00266 seconds |
26
+ ./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.00014 seconds |
27
+ ./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.00038 seconds |
28
+ ./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.00048 seconds |
28
29
  ./spec/carddb/collection_spec.rb[3:1:5] | passed | 0.00004 seconds |
29
- ./spec/carddb/collection_spec.rb[4:1:1] | passed | 0.00015 seconds |
30
- ./spec/carddb/collection_spec.rb[4:1:2] | passed | 0.00016 seconds |
30
+ ./spec/carddb/collection_spec.rb[4:1:1] | passed | 0.00014 seconds |
31
+ ./spec/carddb/collection_spec.rb[4:1:2] | passed | 0.00014 seconds |
31
32
  ./spec/carddb/collection_spec.rb[4:1:3] | passed | 0.00014 seconds |
32
33
  ./spec/carddb/collection_spec.rb[4:1:4] | passed | 0.00004 seconds |
33
- ./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.00005 seconds |
34
- ./spec/carddb/configuration_spec.rb[1:1:2] | passed | 0.00004 seconds |
34
+ ./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.00003 seconds |
35
+ ./spec/carddb/configuration_spec.rb[1:1:2] | passed | 0.00003 seconds |
35
36
  ./spec/carddb/configuration_spec.rb[1:1:3] | passed | 0.00003 seconds |
36
- ./spec/carddb/configuration_spec.rb[1:1:4] | passed | 0.00003 seconds |
37
+ ./spec/carddb/configuration_spec.rb[1:1:4] | passed | 0.00004 seconds |
37
38
  ./spec/carddb/configuration_spec.rb[1:1:5] | passed | 0.00003 seconds |
38
39
  ./spec/carddb/configuration_spec.rb[1:1:6] | passed | 0.00003 seconds |
39
40
  ./spec/carddb/configuration_spec.rb[1:2:1:1] | passed | 0.00004 seconds |
40
41
  ./spec/carddb/configuration_spec.rb[1:2:2:1] | passed | 0.00003 seconds |
41
- ./spec/carddb/configuration_spec.rb[1:2:2:2] | passed | 0.00005 seconds |
42
- ./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
42
+ ./spec/carddb/configuration_spec.rb[1:2:2:2] | passed | 0.00004 seconds |
43
+ ./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.00003 seconds |
43
44
  ./spec/carddb/configuration_spec.rb[1:3:2:1] | passed | 0.00003 seconds |
44
- ./spec/carddb/configuration_spec.rb[1:3:2:2] | passed | 0.00004 seconds |
45
+ ./spec/carddb/configuration_spec.rb[1:3:2:2] | passed | 0.00005 seconds |
45
46
  ./spec/carddb/configuration_spec.rb[1:3:2:3] | passed | 0.00003 seconds |
46
47
  ./spec/carddb/configuration_spec.rb[1:4:1] | passed | 0.00003 seconds |
47
48
  ./spec/carddb/configuration_spec.rb[1:4:2] | passed | 0.00003 seconds |
48
49
  ./spec/carddb/configuration_spec.rb[1:5:1] | passed | 0.00003 seconds |
49
50
  ./spec/carddb/configuration_spec.rb[1:6:1] | passed | 0.00003 seconds |
50
- ./spec/carddb/configuration_spec.rb[1:6:2] | passed | 0.00004 seconds |
51
+ ./spec/carddb/configuration_spec.rb[1:6:2] | passed | 0.00003 seconds |
51
52
  ./spec/carddb/configuration_spec.rb[1:6:3] | passed | 0.00003 seconds |
52
53
  ./spec/carddb/configuration_spec.rb[1:7:1] | passed | 0.00003 seconds |
53
- ./spec/carddb/configuration_spec.rb[1:7:2] | passed | 0.00003 seconds |
54
+ ./spec/carddb/configuration_spec.rb[1:7:2] | passed | 0.00004 seconds |
54
55
  ./spec/carddb/configuration_spec.rb[1:7:3] | passed | 0.00004 seconds |
55
- ./spec/carddb/deck_tokens_spec.rb[1:1:1] | passed | 0.00061 seconds |
56
- ./spec/carddb/deck_tokens_spec.rb[1:2:1] | passed | 0.00074 seconds |
57
- ./spec/carddb/deck_tokens_spec.rb[1:2:2] | passed | 0.00023 seconds |
58
- ./spec/carddb/deck_tokens_spec.rb[1:2:3] | passed | 0.00007 seconds |
56
+ ./spec/carddb/deck_tokens_spec.rb[1:1:1] | passed | 0.00085 seconds |
57
+ ./spec/carddb/deck_tokens_spec.rb[1:2:1] | passed | 0.00073 seconds |
58
+ ./spec/carddb/deck_tokens_spec.rb[1:2:2] | passed | 0.00024 seconds |
59
+ ./spec/carddb/deck_tokens_spec.rb[1:2:3] | passed | 0.00006 seconds |
59
60
  ./spec/carddb/filter_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
60
61
  ./spec/carddb/filter_builder_spec.rb[1:1:2] | passed | 0.00003 seconds |
61
- ./spec/carddb/filter_builder_spec.rb[1:1:3] | passed | 0.00003 seconds |
62
- ./spec/carddb/filter_builder_spec.rb[1:1:4] | passed | 0.00003 seconds |
62
+ ./spec/carddb/filter_builder_spec.rb[1:1:3] | passed | 0.00364 seconds |
63
+ ./spec/carddb/filter_builder_spec.rb[1:1:4] | passed | 0.00004 seconds |
63
64
  ./spec/carddb/filter_builder_spec.rb[1:1:5] | passed | 0.00003 seconds |
64
- ./spec/carddb/filter_builder_spec.rb[1:1:6] | passed | 0.00004 seconds |
65
- ./spec/carddb/filter_builder_spec.rb[1:1:7] | passed | 0.00004 seconds |
65
+ ./spec/carddb/filter_builder_spec.rb[1:1:6] | passed | 0.00003 seconds |
66
+ ./spec/carddb/filter_builder_spec.rb[1:1:7] | passed | 0.00003 seconds |
66
67
  ./spec/carddb/filter_builder_spec.rb[1:1:8] | passed | 0.00003 seconds |
67
- ./spec/carddb/filter_builder_spec.rb[1:2:1] | passed | 0.00004 seconds |
68
+ ./spec/carddb/filter_builder_spec.rb[1:2:1] | passed | 0.00003 seconds |
68
69
  ./spec/carddb/filter_builder_spec.rb[1:2:2] | passed | 0.00003 seconds |
69
70
  ./spec/carddb/filter_builder_spec.rb[1:2:3] | passed | 0.00003 seconds |
70
- ./spec/carddb/filter_builder_spec.rb[1:2:4] | passed | 0.00002 seconds |
71
+ ./spec/carddb/filter_builder_spec.rb[1:2:4] | passed | 0.00003 seconds |
71
72
  ./spec/carddb/filter_builder_spec.rb[1:2:5] | passed | 0.00003 seconds |
72
- ./spec/carddb/filter_builder_spec.rb[1:2:6] | passed | 0.00002 seconds |
73
+ ./spec/carddb/filter_builder_spec.rb[1:2:6] | passed | 0.00003 seconds |
73
74
  ./spec/carddb/filter_builder_spec.rb[1:2:7] | passed | 0.00003 seconds |
74
75
  ./spec/carddb/filter_builder_spec.rb[1:2:8] | passed | 0.00003 seconds |
75
76
  ./spec/carddb/filter_builder_spec.rb[1:2:9] | passed | 0.00003 seconds |
76
77
  ./spec/carddb/filter_builder_spec.rb[1:2:10] | passed | 0.00003 seconds |
77
78
  ./spec/carddb/filter_builder_spec.rb[1:2:11] | passed | 0.00003 seconds |
78
- ./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.00004 seconds |
79
+ ./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.00003 seconds |
79
80
  ./spec/carddb/filter_builder_spec.rb[1:2:13] | passed | 0.00003 seconds |
80
- ./spec/carddb/query_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
81
+ ./spec/carddb/query_builder_spec.rb[1:1:1] | passed | 0.00005 seconds |
81
82
  ./spec/carddb/query_builder_spec.rb[1:1:2] | passed | 0.00004 seconds |
82
83
  ./spec/carddb/query_builder_spec.rb[1:1:3] | passed | 0.00004 seconds |
83
- ./spec/carddb/query_builder_spec.rb[1:2:1:1] | passed | 0.00006 seconds |
84
+ ./spec/carddb/query_builder_spec.rb[1:2:1:1] | passed | 0.00004 seconds |
84
85
  ./spec/carddb/query_builder_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
85
86
  ./spec/carddb/query_builder_spec.rb[1:3:1] | passed | 0.00004 seconds |
86
87
  ./spec/carddb/query_builder_spec.rb[1:3:2] | passed | 0.00004 seconds |
87
88
  ./spec/carddb/query_builder_spec.rb[1:4:1] | passed | 0.00004 seconds |
88
89
  ./spec/carddb/query_builder_spec.rb[1:4:2] | passed | 0.00004 seconds |
89
90
  ./spec/carddb/query_builder_spec.rb[1:5:1] | passed | 0.00003 seconds |
90
- ./spec/carddb/query_builder_spec.rb[1:5:2] | passed | 0.00005 seconds |
91
- ./spec/carddb/query_builder_spec.rb[1:5:3] | passed | 0.00008 seconds |
92
- ./spec/carddb/query_builder_spec.rb[1:5:4] | passed | 0.00004 seconds |
93
- ./spec/carddb/query_builder_spec.rb[1:5:5] | passed | 0.00005 seconds |
94
- ./spec/carddb/query_builder_spec.rb[1:5:6] | passed | 0.00004 seconds |
95
- ./spec/carddb/query_builder_spec.rb[1:5:7] | passed | 0.00004 seconds |
91
+ ./spec/carddb/query_builder_spec.rb[1:5:2] | passed | 0.00004 seconds |
92
+ ./spec/carddb/query_builder_spec.rb[1:5:3] | passed | 0.00004 seconds |
93
+ ./spec/carddb/query_builder_spec.rb[1:5:4] | passed | 0.00003 seconds |
94
+ ./spec/carddb/query_builder_spec.rb[1:5:5] | passed | 0.00004 seconds |
95
+ ./spec/carddb/query_builder_spec.rb[1:5:6] | passed | 0.00003 seconds |
96
+ ./spec/carddb/query_builder_spec.rb[1:5:7] | passed | 0.00003 seconds |
96
97
  ./spec/carddb/query_builder_spec.rb[1:5:8] | passed | 0.00003 seconds |
97
98
  ./spec/carddb/query_builder_spec.rb[1:5:9] | passed | 0.00004 seconds |
98
- ./spec/carddb/query_builder_spec.rb[1:6:1] | passed | 0.00006 seconds |
99
- ./spec/carddb/query_builder_spec.rb[1:6:2] | passed | 0.00006 seconds |
100
- ./spec/carddb/query_builder_spec.rb[1:6:3] | passed | 0.00005 seconds |
101
- ./spec/carddb/query_builder_spec.rb[1:6:4] | passed | 0.00004 seconds |
102
- ./spec/carddb/query_builder_spec.rb[1:6:5] | passed | 0.00003 seconds |
103
- ./spec/carddb/query_builder_spec.rb[1:6:6] | passed | 0.0004 seconds |
104
- ./spec/carddb/resources/datasets_spec.rb[1:1:1] | passed | 0.00431 seconds |
105
- ./spec/carddb/resources/datasets_spec.rb[1:1:2] | passed | 0.00415 seconds |
106
- ./spec/carddb/resources/datasets_spec.rb[1:2:1] | passed | 0.00408 seconds |
107
- ./spec/carddb/resources/decks_spec.rb[1:1:1] | passed | 0.00418 seconds |
108
- ./spec/carddb/resources/decks_spec.rb[1:1:2] | passed | 0.00409 seconds |
109
- ./spec/carddb/resources/decks_spec.rb[1:1:3] | passed | 0.00382 seconds |
110
- ./spec/carddb/resources/decks_spec.rb[1:1:4] | passed | 0.00393 seconds |
111
- ./spec/carddb/resources/decks_spec.rb[1:2:1] | passed | 0.00463 seconds |
112
- ./spec/carddb/resources/decks_spec.rb[1:2:2] | passed | 0.00805 seconds |
113
- ./spec/carddb/resources/decks_spec.rb[1:2:3] | passed | 0.00006 seconds |
114
- ./spec/carddb/resources/decks_spec.rb[1:3:1] | passed | 0.00384 seconds |
115
- ./spec/carddb/resources/decks_spec.rb[1:4:1] | passed | 0.0038 seconds |
116
- ./spec/carddb/resources/decks_spec.rb[1:5:1] | passed | 0.00393 seconds |
117
- ./spec/carddb/resources/decks_spec.rb[1:6:1] | passed | 0.00386 seconds |
118
- ./spec/carddb/resources/decks_spec.rb[1:6:2] | passed | 0.00382 seconds |
119
- ./spec/carddb/resources/decks_spec.rb[1:6:3] | passed | 0.00388 seconds |
120
- ./spec/carddb/resources/decks_spec.rb[1:6:4] | passed | 0.00007 seconds |
121
- ./spec/carddb/resources/decks_spec.rb[1:7:1] | passed | 0.00386 seconds |
122
- ./spec/carddb/resources/decks_spec.rb[1:8:1] | passed | 0.00377 seconds |
123
- ./spec/carddb/resources/decks_spec.rb[1:9:1] | passed | 0.00379 seconds |
124
- ./spec/carddb/resources/decks_spec.rb[1:10:1] | passed | 0.00396 seconds |
125
- ./spec/carddb/resources/decks_spec.rb[1:10:2] | passed | 0.00388 seconds |
126
- ./spec/carddb/resources/decks_spec.rb[1:10:3] | passed | 0.00415 seconds |
127
- ./spec/carddb/resources/decks_spec.rb[1:10:4] | passed | 0.00394 seconds |
128
- ./spec/carddb/resources/decks_spec.rb[1:11:1] | passed | 0.00374 seconds |
129
- ./spec/carddb/resources/decks_spec.rb[1:12:1] | passed | 0.00373 seconds |
130
- ./spec/carddb/resources/decks_spec.rb[1:12:2] | passed | 0.00375 seconds |
131
- ./spec/carddb/resources/decks_spec.rb[1:12:3] | passed | 0.00392 seconds |
99
+ ./spec/carddb/query_builder_spec.rb[1:6:1] | passed | 0.0001 seconds |
100
+ ./spec/carddb/query_builder_spec.rb[1:6:2] | passed | 0.00003 seconds |
101
+ ./spec/carddb/query_builder_spec.rb[1:6:3] | passed | 0.00004 seconds |
102
+ ./spec/carddb/query_builder_spec.rb[1:6:4] | passed | 0.00003 seconds |
103
+ ./spec/carddb/query_builder_spec.rb[1:6:5] | passed | 0.00005 seconds |
104
+ ./spec/carddb/query_builder_spec.rb[1:6:6] | passed | 0.00005 seconds |
105
+ ./spec/carddb/query_builder_spec.rb[1:6:7] | passed | 0.00005 seconds |
106
+ ./spec/carddb/query_builder_spec.rb[1:6:8] | passed | 0.00003 seconds |
107
+ ./spec/carddb/query_builder_spec.rb[1:6:9] | passed | 0.00003 seconds |
108
+ ./spec/carddb/query_builder_spec.rb[1:6:10] | passed | 0.00003 seconds |
109
+ ./spec/carddb/resources/datasets_spec.rb[1:1:1] | passed | 0.0043 seconds |
110
+ ./spec/carddb/resources/datasets_spec.rb[1:1:2] | passed | 0.00394 seconds |
111
+ ./spec/carddb/resources/datasets_spec.rb[1:2:1] | passed | 0.00387 seconds |
112
+ ./spec/carddb/resources/datasets_spec.rb[1:3:1] | passed | 0.0042 seconds |
113
+ ./spec/carddb/resources/datasets_spec.rb[1:3:2] | passed | 0.00388 seconds |
114
+ ./spec/carddb/resources/decks_spec.rb[1:1:1] | passed | 0.00414 seconds |
115
+ ./spec/carddb/resources/decks_spec.rb[1:1:2] | passed | 0.00394 seconds |
116
+ ./spec/carddb/resources/decks_spec.rb[1:1:3] | passed | 0.00389 seconds |
117
+ ./spec/carddb/resources/decks_spec.rb[1:1:4] | passed | 0.00396 seconds |
118
+ ./spec/carddb/resources/decks_spec.rb[1:2:1] | passed | 0.00435 seconds |
119
+ ./spec/carddb/resources/decks_spec.rb[1:2:2] | passed | 0.00785 seconds |
120
+ ./spec/carddb/resources/decks_spec.rb[1:2:3] | passed | 0.00007 seconds |
121
+ ./spec/carddb/resources/decks_spec.rb[1:3:1] | passed | 0.00387 seconds |
122
+ ./spec/carddb/resources/decks_spec.rb[1:4:1] | passed | 0.00382 seconds |
123
+ ./spec/carddb/resources/decks_spec.rb[1:5:1] | passed | 0.0038 seconds |
124
+ ./spec/carddb/resources/decks_spec.rb[1:6:1] | passed | 0.00393 seconds |
125
+ ./spec/carddb/resources/decks_spec.rb[1:6:2] | passed | 0.00383 seconds |
126
+ ./spec/carddb/resources/decks_spec.rb[1:6:3] | passed | 0.00409 seconds |
127
+ ./spec/carddb/resources/decks_spec.rb[1:6:4] | passed | 0.00009 seconds |
128
+ ./spec/carddb/resources/decks_spec.rb[1:7:1] | passed | 0.00391 seconds |
129
+ ./spec/carddb/resources/decks_spec.rb[1:8:1] | passed | 0.00383 seconds |
130
+ ./spec/carddb/resources/decks_spec.rb[1:9:1] | passed | 0.00425 seconds |
131
+ ./spec/carddb/resources/decks_spec.rb[1:10:1] | passed | 0.00384 seconds |
132
+ ./spec/carddb/resources/decks_spec.rb[1:10:2] | passed | 0.00424 seconds |
133
+ ./spec/carddb/resources/decks_spec.rb[1:10:3] | passed | 0.00471 seconds |
134
+ ./spec/carddb/resources/decks_spec.rb[1:10:4] | passed | 0.00372 seconds |
135
+ ./spec/carddb/resources/decks_spec.rb[1:11:1] | passed | 0.00411 seconds |
136
+ ./spec/carddb/resources/decks_spec.rb[1:12:1] | passed | 0.00397 seconds |
137
+ ./spec/carddb/resources/decks_spec.rb[1:12:2] | passed | 0.00377 seconds |
138
+ ./spec/carddb/resources/decks_spec.rb[1:12:3] | passed | 0.00406 seconds |
132
139
  ./spec/carddb/resources/decks_spec.rb[1:12:4] | passed | 0.00006 seconds |
133
- ./spec/carddb/resources/decks_spec.rb[1:13:1] | passed | 0.00384 seconds |
134
- ./spec/carddb/resources/decks_spec.rb[1:14:1] | passed | 0.00375 seconds |
135
- ./spec/carddb/resources/decks_spec.rb[1:15:1] | passed | 0.00402 seconds |
136
- ./spec/carddb/resources/decks_spec.rb[1:15:2] | passed | 0.00442 seconds |
137
- ./spec/carddb/resources/decks_spec.rb[1:15:3] | passed | 0.00401 seconds |
138
- ./spec/carddb/resources/decks_spec.rb[1:16:1] | passed | 0.00443 seconds |
139
- ./spec/carddb/resources/decks_spec.rb[1:17:1] | passed | 0.00388 seconds |
140
- ./spec/carddb/resources/decks_spec.rb[1:18:1] | passed | 0.00375 seconds |
141
- ./spec/carddb/resources/decks_spec.rb[1:19:1] | passed | 0.00782 seconds |
142
- ./spec/carddb/resources/decks_spec.rb[1:20:1] | passed | 0.00386 seconds |
143
- ./spec/carddb/resources/decks_spec.rb[1:21:1] | passed | 0.00497 seconds |
144
- ./spec/carddb/resources/games_spec.rb[1:1:1] | passed | 0.00379 seconds |
140
+ ./spec/carddb/resources/decks_spec.rb[1:13:1] | passed | 0.00398 seconds |
141
+ ./spec/carddb/resources/decks_spec.rb[1:14:1] | passed | 0.00762 seconds |
142
+ ./spec/carddb/resources/decks_spec.rb[1:15:1] | passed | 0.004 seconds |
143
+ ./spec/carddb/resources/decks_spec.rb[1:15:2] | passed | 0.00526 seconds |
144
+ ./spec/carddb/resources/decks_spec.rb[1:15:3] | passed | 0.00459 seconds |
145
+ ./spec/carddb/resources/decks_spec.rb[1:16:1] | passed | 0.005 seconds |
146
+ ./spec/carddb/resources/decks_spec.rb[1:17:1] | passed | 0.0048 seconds |
147
+ ./spec/carddb/resources/decks_spec.rb[1:18:1] | passed | 0.00368 seconds |
148
+ ./spec/carddb/resources/decks_spec.rb[1:19:1] | passed | 0.00485 seconds |
149
+ ./spec/carddb/resources/decks_spec.rb[1:20:1] | passed | 0.00364 seconds |
150
+ ./spec/carddb/resources/decks_spec.rb[1:21:1] | passed | 0.00383 seconds |
151
+ ./spec/carddb/resources/games_spec.rb[1:1:1] | passed | 0.00459 seconds |
145
152
  ./spec/carddb/resources/games_spec.rb[1:1:2] | passed | 0.00006 seconds |
146
- ./spec/carddb/resources/games_spec.rb[1:2:1] | passed | 0.00463 seconds |
147
- ./spec/carddb/resources/games_spec.rb[1:2:2] | passed | 0.00374 seconds |
148
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:1] | passed | 0.00495 seconds |
149
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:2] | passed | 0.00365 seconds |
150
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:3] | passed | 0.00465 seconds |
151
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:1] | passed | 0.00459 seconds |
152
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:2] | passed | 0.00006 seconds |
153
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:1] | passed | 0.0038 seconds |
154
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:2] | passed | 0.00436 seconds |
155
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:3] | passed | 0.00363 seconds |
156
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:1] | passed | 0.0045 seconds |
157
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:2] | passed | 0.00515 seconds |
158
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:3] | passed | 0.00387 seconds |
159
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:1] | passed | 0.00475 seconds |
160
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:2] | passed | 0.00366 seconds |
161
- ./spec/carddb/resources/publishers_spec.rb[1:1:1] | passed | 0.00456 seconds |
162
- ./spec/carddb/resources/publishers_spec.rb[1:2:1] | passed | 0.00363 seconds |
163
- ./spec/carddb/resources/records_spec.rb[1:1:1] | passed | 0.00366 seconds |
164
- ./spec/carddb/resources/records_spec.rb[1:1:2] | passed | 0.00548 seconds |
165
- ./spec/carddb/resources/records_spec.rb[1:1:3] | passed | 0.00009 seconds |
166
- ./spec/carddb/resources/records_spec.rb[1:1:4] | passed | 0.00004 seconds |
167
- ./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.0037 seconds |
168
- ./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.00372 seconds |
169
- ./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.00368 seconds |
170
- ./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.00374 seconds |
171
- ./spec/carddb/resources/records_spec.rb[1:3:2] | passed | 0.00009 seconds |
172
- ./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.00373 seconds |
153
+ ./spec/carddb/resources/games_spec.rb[1:2:1] | passed | 0.00368 seconds |
154
+ ./spec/carddb/resources/games_spec.rb[1:2:2] | passed | 0.00472 seconds |
155
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:1] | passed | 0.00368 seconds |
156
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:2] | passed | 0.00422 seconds |
157
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:3] | passed | 0.00385 seconds |
158
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:1] | passed | 0.00466 seconds |
159
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:2] | passed | 0.00005 seconds |
160
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:1] | passed | 0.00496 seconds |
161
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:2] | passed | 0.00421 seconds |
162
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:3] | passed | 0.00431 seconds |
163
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:1] | passed | 0.00405 seconds |
164
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:2] | passed | 0.00522 seconds |
165
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:3] | passed | 0.005 seconds |
166
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:1] | passed | 0.00488 seconds |
167
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:2] | passed | 0.00414 seconds |
168
+ ./spec/carddb/resources/publishers_spec.rb[1:1:1] | passed | 0.00418 seconds |
169
+ ./spec/carddb/resources/publishers_spec.rb[1:2:1] | passed | 0.00443 seconds |
170
+ ./spec/carddb/resources/records_spec.rb[1:1:1] | passed | 0.0045 seconds |
171
+ ./spec/carddb/resources/records_spec.rb[1:1:2] | passed | 0.0038 seconds |
172
+ ./spec/carddb/resources/records_spec.rb[1:1:3] | passed | 0.00008 seconds |
173
+ ./spec/carddb/resources/records_spec.rb[1:1:4] | passed | 0.0001 seconds |
174
+ ./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.00426 seconds |
175
+ ./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.00376 seconds |
176
+ ./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.00454 seconds |
177
+ ./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.00363 seconds |
178
+ ./spec/carddb/resources/records_spec.rb[1:3:2] | passed | 0.00046 seconds |
179
+ ./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.00366 seconds |
173
180
  ./spec/carddb/resources/records_spec.rb[1:4:2] | passed | 0.00004 seconds |
174
- ./spec/carddb/resources/records_spec.rb[1:4:3] | passed | 0.00008 seconds |
175
- ./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.00375 seconds |
181
+ ./spec/carddb/resources/records_spec.rb[1:4:3] | passed | 0.00012 seconds |
182
+ ./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.00381 seconds |
176
183
  ./spec/carddb/resources/rules_spec.rb[1:2:1] | passed | 0.00378 seconds |
177
- ./spec/carddb/resources/scans_spec.rb[1:1] | passed | 0.00395 seconds |
178
- ./spec/carddb/resources/scans_spec.rb[1:2] | passed | 0.00768 seconds |
179
- ./spec/carddb/resources/scans_spec.rb[1:3] | passed | 0.00377 seconds |
180
- ./spec/carddb/resources/scans_spec.rb[1:4] | passed | 0.00386 seconds |
181
- ./spec/carddb/resources/scans_spec.rb[1:5] | passed | 0.00385 seconds |
182
- ./spec/carddb/resources/scans_spec.rb[1:6] | passed | 0.00413 seconds |
183
- ./spec/carddb/resources/scans_spec.rb[1:7] | passed | 0.00378 seconds |
184
- ./spec/carddb/resources/scans_spec.rb[1:8] | passed | 0.0001 seconds |
184
+ ./spec/carddb/resources/rulesets_spec.rb[1:1:1] | passed | 0.00372 seconds |
185
+ ./spec/carddb/resources/rulesets_spec.rb[1:1:2] | passed | 0.00538 seconds |
186
+ ./spec/carddb/resources/rulesets_spec.rb[1:2:1] | passed | 0.00444 seconds |
187
+ ./spec/carddb/resources/rulesets_spec.rb[1:2:2] | passed | 0.00384 seconds |
188
+ ./spec/carddb/resources/rulesets_spec.rb[1:3:1] | passed | 0.00493 seconds |
189
+ ./spec/carddb/resources/rulesets_spec.rb[1:3:2] | passed | 0.00005 seconds |
190
+ ./spec/carddb/resources/scans_spec.rb[1:1] | passed | 0.00447 seconds |
191
+ ./spec/carddb/resources/scans_spec.rb[1:2] | passed | 0.00791 seconds |
192
+ ./spec/carddb/resources/scans_spec.rb[1:3] | passed | 0.00388 seconds |
193
+ ./spec/carddb/resources/scans_spec.rb[1:4] | passed | 0.00451 seconds |
194
+ ./spec/carddb/resources/scans_spec.rb[1:5] | passed | 0.0047 seconds |
195
+ ./spec/carddb/resources/scans_spec.rb[1:6] | passed | 0.00406 seconds |
196
+ ./spec/carddb/resources/scans_spec.rb[1:7] | passed | 0.00361 seconds |
197
+ ./spec/carddb/resources/scans_spec.rb[1:8] | passed | 0.00009 seconds |
185
198
  ./spec/carddb_spec.rb[1:1] | passed | 0.00003 seconds |
186
- ./spec/carddb_spec.rb[1:2:1] | passed | 0.00003 seconds |
199
+ ./spec/carddb_spec.rb[1:2:1] | passed | 0.00004 seconds |
187
200
  ./spec/carddb_spec.rb[1:3:1] | passed | 0.00003 seconds |
188
201
  ./spec/carddb_spec.rb[1:4:1] | passed | 0.00004 seconds |
189
202
  ./spec/carddb_spec.rb[1:5:1] | passed | 0.00003 seconds |
@@ -191,3 +204,4 @@ example_id | status | run_time
191
204
  ./spec/carddb_spec.rb[1:7:1] | passed | 0.00003 seconds |
192
205
  ./spec/carddb_spec.rb[1:8:1] | passed | 0.00003 seconds |
193
206
  ./spec/carddb_spec.rb[1:9:1] | passed | 0.00003 seconds |
207
+ ./spec/carddb_spec.rb[1:10:1] | passed | 0.00003 seconds |
data/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.0] - 2026-07-06
11
+
12
+ ### Added
13
+
14
+ - Dataset filter value lookup with paginated field facets and optional counts.
15
+
10
16
  ## [0.4.1] - 2026-06-22
11
17
 
12
18
  ### Added
data/lib/carddb/client.rb CHANGED
@@ -154,6 +154,13 @@ module CardDB
154
154
  @rules ||= Resources::Rules.new(self, connection, config)
155
155
  end
156
156
 
157
+ # Access the Rulesets resource
158
+ #
159
+ # @return [Resources::Rulesets]
160
+ def rulesets
161
+ @rulesets ||= Resources::Rulesets.new(self, connection, config)
162
+ end
163
+
157
164
  # Get information about the current API key
158
165
  #
159
166
  # @return [Hash, nil] API key info or nil if no API key
@@ -656,6 +656,56 @@ module CardDB
656
656
  end
657
657
  end
658
658
 
659
+ # Wrapper for distinct values returned for a single filter field.
660
+ class DatasetFilterValueConnection
661
+ attr_reader :data
662
+
663
+ def initialize(data)
664
+ @data = data || {}
665
+ end
666
+
667
+ def field
668
+ data['field']
669
+ end
670
+
671
+ def edges
672
+ data['edges'] || []
673
+ end
674
+
675
+ def values
676
+ @values ||= edges.map { |edge| DatasetFilterValue.new(edge['node']) }
677
+ end
678
+
679
+ def page_info
680
+ data['pageInfo'] || {}
681
+ end
682
+
683
+ def has_next_page?
684
+ !!page_info['hasNextPage']
685
+ end
686
+
687
+ def end_cursor
688
+ page_info['endCursor']
689
+ end
690
+ end
691
+
692
+ # Wrapper for one distinct filter value.
693
+ class DatasetFilterValue
694
+ attr_reader :data
695
+
696
+ def initialize(data)
697
+ @data = data || {}
698
+ end
699
+
700
+ def value
701
+ data['value']
702
+ end
703
+
704
+ def count
705
+ data['count']
706
+ end
707
+ end
708
+
659
709
  # Wrapper for FieldInfo
660
710
  class FieldInfo
661
711
  attr_reader :data
@@ -2001,6 +2051,117 @@ module CardDB
2001
2051
  end
2002
2052
  end
2003
2053
 
2054
+ class Ruleset < Resource
2055
+ def id = data['id']
2056
+ def game_id = data['gameId']
2057
+ def game = data['game']
2058
+ def key = data['key']
2059
+ def name = data['name']
2060
+ def description = data['description']
2061
+ def tags = data['tags'] || []
2062
+ def sort_order = data['sortOrder']
2063
+ def current_version_id = data['currentVersionId']
2064
+ def archived_at = parse_time(data['archivedAt'])
2065
+ def archived? = !!data['isArchived']
2066
+ def created_at = parse_time(data['createdAt'])
2067
+ def updated_at = parse_time(data['updatedAt'])
2068
+
2069
+ def current_version
2070
+ @current_version ||= data['currentVersion'] ? RulesetVersion.new(data['currentVersion'], client: client) : nil
2071
+ end
2072
+ end
2073
+
2074
+ class RulesetVersion < Resource
2075
+ def id = data['id']
2076
+ def ruleset_id = data['rulesetId']
2077
+ def version_label = data['versionLabel']
2078
+ def status = data['status']
2079
+ def rules = data['rules'] || {}
2080
+ def card_dataset_id = data['cardDatasetId']
2081
+ def card_dataset_version_id = data['cardDatasetVersionId']
2082
+ def source_dataset_id = data['sourceDatasetId']
2083
+ def source_dataset_version_id = data['sourceDatasetVersionId']
2084
+ def source_dataset_record_id = data['sourceDatasetRecordId']
2085
+ def source_record_identifier = data['sourceRecordIdentifier']
2086
+ def rules_fingerprint = data['rulesFingerprint']
2087
+ def effective_at = parse_time(data['effectiveAt'])
2088
+ def changelog = data['changelog']
2089
+ def created_by_account_id = data['createdByAccountId']
2090
+ def published_by_account_id = data['publishedByAccountId']
2091
+ def published_at = parse_time(data['publishedAt'])
2092
+ def superseded_at = parse_time(data['supersededAt'])
2093
+ def created_at = parse_time(data['createdAt'])
2094
+ def updated_at = parse_time(data['updatedAt'])
2095
+ def draft? = status == 'DRAFT'
2096
+ def active? = status == 'ACTIVE'
2097
+
2098
+ def section_definitions
2099
+ @section_definitions ||= (data['sectionDefinitions'] || []).map do |definition|
2100
+ DeckSectionDefinition.new(definition, client: client)
2101
+ end
2102
+ end
2103
+ end
2104
+
2105
+ class DeckValidationRules < Resource
2106
+ def ruleset_id = data['rulesetId']
2107
+ def ruleset_version_id = data['rulesetVersionId']
2108
+ def ruleset_key = data['rulesetKey']
2109
+ def ruleset_version_label = data['rulesetVersionLabel']
2110
+ def rules = data['rules'] || {}
2111
+
2112
+ def sections
2113
+ @sections ||= (data['sections'] || []).map { |section| DeckSectionDefinition.new(section, client: client) }
2114
+ end
2115
+ end
2116
+
2117
+ class RulesetValidationImpactDeck < Resource
2118
+ def deck_id = data['deckId']
2119
+ def title = data['title']
2120
+ def slug = data['slug']
2121
+ def state = data['state']
2122
+ def unpublished_changes? = !!data['hasUnpublishedChanges']
2123
+ def valid? = !!data['valid']
2124
+ def blocker_count = data['blockerCount']
2125
+ def warning_count = data['warningCount']
2126
+ def affected_entry_count = data['affectedEntryCount']
2127
+
2128
+ def issues
2129
+ @issues ||= (data['issues'] || []).map { |issue| DeckValidationIssue.new(issue, client: client) }
2130
+ end
2131
+ end
2132
+
2133
+ class RulesetValidationImpact < Resource
2134
+ def ruleset_id = data['rulesetId']
2135
+ def ruleset_version_id = data['rulesetVersionId']
2136
+ def checked_at = parse_time(data['checkedAt'])
2137
+ def affected_deck_count = data['affectedDeckCount']
2138
+ def invalid_deck_count = data['invalidDeckCount']
2139
+ def blocker_count = data['blockerCount']
2140
+ def warning_count = data['warningCount']
2141
+
2142
+ def results
2143
+ @results ||= (data['results'] || []).map { |deck| RulesetValidationImpactDeck.new(deck, client: client) }
2144
+ end
2145
+ end
2146
+
2147
+ class RulesetVersionDraftImportPreview < Resource
2148
+ def source_dataset_id = data['sourceDatasetId']
2149
+ def source_dataset_version_id = data['sourceDatasetVersionId']
2150
+ def source_dataset_record_id = data['sourceDatasetRecordId']
2151
+ def source_record_identifier = data['sourceRecordIdentifier']
2152
+ def rules = data['rules'] || {}
2153
+ def rules_fingerprint = data['rulesFingerprint']
2154
+ def summary = data['summary']
2155
+ def section_count = data['sectionCount']
2156
+ def copy_limit_count = data['copyLimitCount']
2157
+
2158
+ def section_definitions
2159
+ @section_definitions ||= (data['sectionDefinitions'] || []).map do |definition|
2160
+ DeckSectionDefinition.new(definition, client: client)
2161
+ end
2162
+ end
2163
+ end
2164
+
2004
2165
  class DeckSectionDefinition < Resource
2005
2166
  def key = data['key']
2006
2167
  def label = data['label']
@@ -219,6 +219,42 @@ module CardDB
219
219
  GRAPHQL
220
220
  end
221
221
 
222
+ def dataset_filter_values(
223
+ fields:,
224
+ id: nil,
225
+ publisher_slug: nil,
226
+ game_key: nil,
227
+ dataset_key: nil,
228
+ search: nil,
229
+ include_counts: nil,
230
+ first: nil,
231
+ after: nil
232
+ )
233
+ raise ArgumentError, 'fields must contain at least one field key' if fields.empty?
234
+
235
+ dataset_lookup = dataset_filter_values_lookup(
236
+ id: id,
237
+ publisher_slug: publisher_slug,
238
+ game_key: game_key,
239
+ dataset_key: dataset_key
240
+ )
241
+ filter_params = { fields: fields, search: search, includeCounts: include_counts, first: first, after: after }.compact
242
+ args = build_args(dataset_lookup.merge(filter_params), required: dataset_lookup.keys + [:fields])
243
+
244
+ dataset_args = graphql_variable_calls(dataset_lookup.keys)
245
+ filter_args = graphql_variable_calls(filter_params.keys)
246
+
247
+ <<~GRAPHQL
248
+ query FetchDatasetFilterValues#{args[:definition]} {
249
+ fetchDataset(#{dataset_args}) {
250
+ filterValues(#{filter_args}) {
251
+ #{dataset_filter_value_connection_fields}
252
+ }
253
+ }
254
+ }
255
+ GRAPHQL
256
+ end
257
+
222
258
  def list_datasets(
223
259
  publisher_id:,
224
260
  game_id: nil,
@@ -1121,6 +1157,182 @@ module CardDB
1121
1157
  GRAPHQL
1122
1158
  end
1123
1159
 
1160
+ def rulesets(game_id:, include_archived: nil, first: nil, after: nil)
1161
+ args = build_args(
1162
+ { gameId: game_id, includeArchived: include_archived, first: first, after: after },
1163
+ required: [:gameId]
1164
+ )
1165
+
1166
+ <<~GRAPHQL
1167
+ query Rulesets#{args[:definition]} {
1168
+ rulesets#{args[:call]} {
1169
+ #{ruleset_connection_fields}
1170
+ }
1171
+ }
1172
+ GRAPHQL
1173
+ end
1174
+
1175
+ def public_rulesets(game_id:, first: nil, after: nil)
1176
+ args = build_args({ gameId: game_id, first: first, after: after }, required: [:gameId])
1177
+
1178
+ <<~GRAPHQL
1179
+ query PublicRulesets#{args[:definition]} {
1180
+ publicRulesets#{args[:call]} {
1181
+ #{ruleset_connection_fields}
1182
+ }
1183
+ }
1184
+ GRAPHQL
1185
+ end
1186
+
1187
+ def ruleset
1188
+ <<~GRAPHQL
1189
+ query Ruleset($id: UUID, $gameId: UUID, $key: String) {
1190
+ ruleset(id: $id, gameId: $gameId, key: $key) {
1191
+ #{ruleset_fields}
1192
+ }
1193
+ }
1194
+ GRAPHQL
1195
+ end
1196
+
1197
+ def ruleset_versions(ruleset_id:, status: nil, first: nil, after: nil)
1198
+ args = build_args(
1199
+ { rulesetId: ruleset_id, status: status, first: first, after: after },
1200
+ required: [:rulesetId],
1201
+ type_overrides: { status: 'RulesetVersionStatus' }
1202
+ )
1203
+
1204
+ <<~GRAPHQL
1205
+ query RulesetVersions#{args[:definition]} {
1206
+ rulesetVersions#{args[:call]} {
1207
+ #{ruleset_version_connection_fields}
1208
+ }
1209
+ }
1210
+ GRAPHQL
1211
+ end
1212
+
1213
+ def ruleset_version
1214
+ <<~GRAPHQL
1215
+ query RulesetVersion($id: UUID!) {
1216
+ rulesetVersion(id: $id) {
1217
+ #{ruleset_version_fields}
1218
+ }
1219
+ }
1220
+ GRAPHQL
1221
+ end
1222
+
1223
+ def ruleset_validation_rules
1224
+ <<~GRAPHQL
1225
+ query RulesetValidationRules($gameId: UUID!, $rulesetKey: String!, $rulesetVersionId: UUID) {
1226
+ rulesetValidationRules(gameId: $gameId, rulesetKey: $rulesetKey, rulesetVersionId: $rulesetVersionId)
1227
+ }
1228
+ GRAPHQL
1229
+ end
1230
+
1231
+ def deck_validation_rules
1232
+ <<~GRAPHQL
1233
+ query DeckValidationRules($gameId: UUID!, $rulesetKey: String!, $rulesetVersionId: UUID) {
1234
+ deckValidationRules(gameId: $gameId, rulesetKey: $rulesetKey, rulesetVersionId: $rulesetVersionId) {
1235
+ #{deck_validation_rules_fields}
1236
+ }
1237
+ }
1238
+ GRAPHQL
1239
+ end
1240
+
1241
+ def ruleset_version_draft_import_preview
1242
+ <<~GRAPHQL
1243
+ query RulesetVersionDraftImportPreview($rulesetId: UUID!, $input: RulesetVersionDraftImportFromDatasetRecordInput!) {
1244
+ rulesetVersionDraftImportPreview(rulesetId: $rulesetId, input: $input) {
1245
+ #{ruleset_version_draft_import_preview_fields}
1246
+ }
1247
+ }
1248
+ GRAPHQL
1249
+ end
1250
+
1251
+ def ruleset_validation_impact(ruleset_version_id:, first: nil)
1252
+ args = build_args(
1253
+ { rulesetVersionId: ruleset_version_id, first: first },
1254
+ required: [:rulesetVersionId]
1255
+ )
1256
+
1257
+ <<~GRAPHQL
1258
+ query RulesetValidationImpact#{args[:definition]} {
1259
+ rulesetValidationImpact#{args[:call]} {
1260
+ #{ruleset_validation_impact_fields}
1261
+ }
1262
+ }
1263
+ GRAPHQL
1264
+ end
1265
+
1266
+ def create_ruleset
1267
+ <<~GRAPHQL
1268
+ mutation RulesetCreate($input: RulesetCreateInput!) {
1269
+ rulesetCreate(input: $input) {
1270
+ #{ruleset_fields}
1271
+ }
1272
+ }
1273
+ GRAPHQL
1274
+ end
1275
+
1276
+ def update_ruleset
1277
+ <<~GRAPHQL
1278
+ mutation RulesetUpdate($id: UUID!, $input: RulesetUpdateInput!) {
1279
+ rulesetUpdate(id: $id, input: $input) {
1280
+ #{ruleset_fields}
1281
+ }
1282
+ }
1283
+ GRAPHQL
1284
+ end
1285
+
1286
+ def create_ruleset_version_draft
1287
+ <<~GRAPHQL
1288
+ mutation RulesetVersionDraftCreate($rulesetId: UUID!, $input: RulesetVersionDraftCreateInput!) {
1289
+ rulesetVersionDraftCreate(rulesetId: $rulesetId, input: $input) {
1290
+ #{ruleset_version_fields}
1291
+ }
1292
+ }
1293
+ GRAPHQL
1294
+ end
1295
+
1296
+ def import_ruleset_version_draft_from_dataset_record
1297
+ <<~GRAPHQL
1298
+ mutation RulesetVersionDraftImportFromDatasetRecord($rulesetId: UUID!, $input: RulesetVersionDraftImportFromDatasetRecordInput!) {
1299
+ rulesetVersionDraftImportFromDatasetRecord(rulesetId: $rulesetId, input: $input) {
1300
+ #{ruleset_version_fields}
1301
+ }
1302
+ }
1303
+ GRAPHQL
1304
+ end
1305
+
1306
+ def update_ruleset_version_draft
1307
+ <<~GRAPHQL
1308
+ mutation RulesetVersionDraftUpdate($id: UUID!, $input: RulesetVersionDraftUpdateInput!) {
1309
+ rulesetVersionDraftUpdate(id: $id, input: $input) {
1310
+ #{ruleset_version_fields}
1311
+ }
1312
+ }
1313
+ GRAPHQL
1314
+ end
1315
+
1316
+ def publish_ruleset_version
1317
+ <<~GRAPHQL
1318
+ mutation RulesetVersionPublish($id: UUID!, $input: RulesetVersionPublishInput) {
1319
+ rulesetVersionPublish(id: $id, input: $input) {
1320
+ #{ruleset_version_fields}
1321
+ }
1322
+ }
1323
+ GRAPHQL
1324
+ end
1325
+
1326
+ def activate_ruleset_version
1327
+ <<~GRAPHQL
1328
+ mutation RulesetVersionActivate($id: UUID!) {
1329
+ rulesetVersionActivate(id: $id) {
1330
+ #{ruleset_version_fields}
1331
+ }
1332
+ }
1333
+ GRAPHQL
1334
+ end
1335
+
1124
1336
  # Builds a deckCollaborators query
1125
1337
  def deck_collaborators
1126
1338
  <<~GRAPHQL
@@ -1557,6 +1769,7 @@ module CardDB
1557
1769
  externalRef: 'String',
1558
1770
  deckId: 'UUID!',
1559
1771
  gameId: 'UUID',
1772
+ rulesetId: 'UUID',
1560
1773
  rulesetKey: 'String',
1561
1774
  rulesetVersionId: 'UUID',
1562
1775
  validateSchema: 'Boolean',
@@ -1564,6 +1777,8 @@ module CardDB
1564
1777
  status: 'String',
1565
1778
  level: 'String',
1566
1779
  key: 'String',
1780
+ fields: '[String!]',
1781
+ includeCounts: 'Boolean',
1567
1782
  id: 'UUID!',
1568
1783
  ids: '[UUID!]!'
1569
1784
  }
@@ -1583,6 +1798,18 @@ module CardDB
1583
1798
  end
1584
1799
  # rubocop:enable Metrics/MethodLength
1585
1800
 
1801
+ def dataset_filter_values_lookup(id:, publisher_slug:, game_key:, dataset_key:)
1802
+ return { id: id } if id
1803
+
1804
+ raise ArgumentError, 'provide either id or publisher_slug, game_key, and dataset_key' unless [publisher_slug, game_key, dataset_key].all?
1805
+
1806
+ { publisherSlug: publisher_slug, gameKey: game_key, datasetKey: dataset_key }
1807
+ end
1808
+
1809
+ def graphql_variable_calls(keys)
1810
+ keys.map { |key| "#{key}: $#{key}" }.join(', ')
1811
+ end
1812
+
1586
1813
  def file_fields
1587
1814
  <<~FIELDS
1588
1815
  id
@@ -1753,6 +1980,25 @@ module CardDB
1753
1980
  FIELDS
1754
1981
  end
1755
1982
 
1983
+ def dataset_filter_value_connection_fields
1984
+ <<~FIELDS
1985
+ field
1986
+ edges {
1987
+ cursor
1988
+ node {
1989
+ value
1990
+ count
1991
+ }
1992
+ }
1993
+ pageInfo {
1994
+ hasNextPage
1995
+ hasPreviousPage
1996
+ startCursor
1997
+ endCursor
1998
+ }
1999
+ FIELDS
2000
+ end
2001
+
1756
2002
  # rubocop:disable Metrics/MethodLength
1757
2003
  def field_info_fields(depth:)
1758
2004
  nested_fields = if depth.positive?
@@ -2585,6 +2831,121 @@ module CardDB
2585
2831
  FIELDS
2586
2832
  end
2587
2833
 
2834
+ def ruleset_version_fields
2835
+ <<~FIELDS
2836
+ id
2837
+ rulesetId
2838
+ versionLabel
2839
+ status
2840
+ rules
2841
+ sectionDefinitions {
2842
+ #{deck_section_definition_fields}
2843
+ }
2844
+ cardDatasetId
2845
+ cardDatasetVersionId
2846
+ sourceDatasetId
2847
+ sourceDatasetVersionId
2848
+ sourceDatasetRecordId
2849
+ sourceRecordIdentifier
2850
+ rulesFingerprint
2851
+ effectiveAt
2852
+ changelog
2853
+ createdByAccountId
2854
+ publishedByAccountId
2855
+ publishedAt
2856
+ supersededAt
2857
+ createdAt
2858
+ updatedAt
2859
+ FIELDS
2860
+ end
2861
+
2862
+ def ruleset_fields
2863
+ <<~FIELDS
2864
+ id
2865
+ gameId
2866
+ game {
2867
+ id
2868
+ key
2869
+ name
2870
+ }
2871
+ key
2872
+ name
2873
+ description
2874
+ tags
2875
+ sortOrder
2876
+ currentVersionId
2877
+ currentVersion {
2878
+ #{ruleset_version_fields}
2879
+ }
2880
+ archivedAt
2881
+ isArchived
2882
+ createdAt
2883
+ updatedAt
2884
+ FIELDS
2885
+ end
2886
+
2887
+ def deck_validation_rules_fields
2888
+ <<~FIELDS
2889
+ rulesetId
2890
+ rulesetVersionId
2891
+ rulesetKey
2892
+ rulesetVersionLabel
2893
+ rules
2894
+ sections {
2895
+ #{deck_section_definition_fields}
2896
+ }
2897
+ FIELDS
2898
+ end
2899
+
2900
+ def ruleset_validation_impact_deck_fields
2901
+ <<~FIELDS
2902
+ deckId
2903
+ title
2904
+ slug
2905
+ state
2906
+ hasUnpublishedChanges
2907
+ valid
2908
+ blockerCount
2909
+ warningCount
2910
+ affectedEntryCount
2911
+ issues {
2912
+ #{deck_validation_issue_fields}
2913
+ }
2914
+ FIELDS
2915
+ end
2916
+
2917
+ def ruleset_validation_impact_fields
2918
+ <<~FIELDS
2919
+ rulesetId
2920
+ rulesetVersionId
2921
+ checkedAt
2922
+ affectedDeckCount
2923
+ invalidDeckCount
2924
+ blockerCount
2925
+ warningCount
2926
+ results {
2927
+ #{ruleset_validation_impact_deck_fields}
2928
+ }
2929
+ FIELDS
2930
+ end
2931
+
2932
+ def ruleset_version_draft_import_preview_fields
2933
+ <<~FIELDS
2934
+ sourceDatasetId
2935
+ sourceDatasetVersionId
2936
+ sourceDatasetRecordId
2937
+ sourceRecordIdentifier
2938
+ rules
2939
+ sectionDefinitions {
2940
+ #{deck_section_definition_fields}
2941
+ }
2942
+ rulesFingerprint
2943
+ summary
2944
+ sectionCount
2945
+ copyLimitCount
2946
+ FIELDS
2947
+ end
2948
+
2588
2949
  def deck_diff_fields
2589
2950
  <<~FIELDS
2590
2951
  deckId
@@ -2796,6 +3157,14 @@ module CardDB
2796
3157
  FIELDS
2797
3158
  end
2798
3159
 
3160
+ def ruleset_connection_fields
3161
+ connection_fields(ruleset_fields)
3162
+ end
3163
+
3164
+ def ruleset_version_connection_fields
3165
+ connection_fields(ruleset_version_fields)
3166
+ end
3167
+
2799
3168
  def deck_collaborator_fields
2800
3169
  <<~FIELDS
2801
3170
  id
@@ -186,6 +186,65 @@ module CardDB
186
186
  (data['fetchDatasets'] || []).map { |d| Dataset.new(d, client: client) }
187
187
  end
188
188
 
189
+ # Get distinct values for one or more filterable fields on a dataset.
190
+ #
191
+ # @param fields [Array<String, Symbol>] Field keys to fetch values for
192
+ # @param id [String, nil] Dataset UUID. Provide either id or dataset_key.
193
+ # @param dataset_key [String, nil] Dataset key when looking up by publisher/game keys
194
+ # @param publisher_slug [String, nil] Publisher slug (uses default if not provided)
195
+ # @param game_key [String, nil] Game key (uses default if not provided)
196
+ # @param search [String, nil] Optional case-insensitive search within values
197
+ # @param include_counts [Boolean, nil] Include per-value counts
198
+ # @param first [Integer, nil] Maximum values per field (max 500)
199
+ # @param after [String, nil] Cursor for pagination. Applies to each field.
200
+ # @return [Array<DatasetFilterValueConnection>]
201
+ def filter_values(
202
+ fields:,
203
+ id: nil,
204
+ dataset_key: nil,
205
+ publisher_slug: nil,
206
+ game_key: nil,
207
+ search: nil,
208
+ include_counts: nil,
209
+ first: nil,
210
+ after: nil,
211
+ cache: nil
212
+ )
213
+ field_keys = fields.map(&:to_s)
214
+ resolved_publisher = id ? nil : resolve_publisher(publisher_slug)
215
+ resolved_game = id ? nil : resolve_game(game_key)
216
+
217
+ validate_access!(resolved_publisher, resolved_game) unless id
218
+
219
+ query = QueryBuilder.dataset_filter_values(
220
+ id: id,
221
+ publisher_slug: resolved_publisher,
222
+ game_key: resolved_game,
223
+ dataset_key: dataset_key,
224
+ fields: field_keys,
225
+ search: search,
226
+ include_counts: include_counts,
227
+ first: first,
228
+ after: after
229
+ )
230
+ variables = build_variables(
231
+ id: id,
232
+ publisherSlug: resolved_publisher,
233
+ gameKey: resolved_game,
234
+ datasetKey: dataset_key,
235
+ fields: field_keys,
236
+ search: search,
237
+ includeCounts: include_counts,
238
+ first: first,
239
+ after: after
240
+ )
241
+ key = cache_key('datasets', 'filter_values', **variables)
242
+
243
+ data = with_cache(key, resource: :datasets, cache: cache) { connection.execute(query, variables) }
244
+ filter_values = data.dig('fetchDataset', 'filterValues') || []
245
+ filter_values.map { |value| DatasetFilterValueConnection.new(value) }
246
+ end
247
+
189
248
  # Get the schema for a dataset
190
249
  #
191
250
  # @param dataset_key [String] Dataset key
@@ -0,0 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CardDB
4
+ module Resources
5
+ # First-class rulesets resource for deck validation rules.
6
+ class Rulesets < Base
7
+ def list(game_id:, include_archived: nil, first: nil, after: nil, cache: nil)
8
+ query = QueryBuilder.rulesets(
9
+ game_id: game_id,
10
+ include_archived: include_archived,
11
+ first: first,
12
+ after: after
13
+ )
14
+ variables = build_variables(gameId: game_id, includeArchived: include_archived, first: first, after: after)
15
+ key = cache_key('rulesets', 'list', **variables)
16
+
17
+ data = with_cache(key, resource: :rulesets, cache: cache) do
18
+ connection.execute(query, variables)
19
+ end
20
+
21
+ Collection.new(
22
+ data['rulesets'],
23
+ item_class: Ruleset,
24
+ next_page_loader: ->(cursor) { list(game_id: game_id, include_archived: include_archived, first: first, after: cursor, cache: cache) },
25
+ client: client
26
+ )
27
+ end
28
+
29
+ def list_public(game_id:, first: nil, after: nil, cache: nil)
30
+ query = QueryBuilder.public_rulesets(game_id: game_id, first: first, after: after)
31
+ variables = build_variables(gameId: game_id, first: first, after: after)
32
+ key = cache_key('rulesets', 'list_public', **variables)
33
+
34
+ data = with_cache(key, resource: :rulesets, cache: cache) do
35
+ connection.execute(query, variables)
36
+ end
37
+
38
+ Collection.new(
39
+ data['publicRulesets'],
40
+ item_class: Ruleset,
41
+ next_page_loader: ->(cursor) { list_public(game_id: game_id, first: first, after: cursor, cache: cache) },
42
+ client: client
43
+ )
44
+ end
45
+
46
+ def get(id, cache: nil)
47
+ key = cache_key('rulesets', 'get', id: id)
48
+ with_cache(key, resource: :rulesets, cache: cache) do
49
+ data = connection.execute(QueryBuilder.ruleset, { id: id })
50
+ data['ruleset'] ? Ruleset.new(data['ruleset'], client: client) : nil
51
+ end
52
+ end
53
+
54
+ def get_by_key(game_id:, key:, cache: nil)
55
+ cache_key_value = cache_key('rulesets', 'get_by_key', game_id: game_id, key: key)
56
+ with_cache(cache_key_value, resource: :rulesets, cache: cache) do
57
+ data = connection.execute(QueryBuilder.ruleset, { gameId: game_id, key: key })
58
+ data['ruleset'] ? Ruleset.new(data['ruleset'], client: client) : nil
59
+ end
60
+ end
61
+
62
+ def versions(ruleset_id:, status: nil, first: nil, after: nil, cache: nil)
63
+ query = QueryBuilder.ruleset_versions(ruleset_id: ruleset_id, status: status, first: first, after: after)
64
+ variables = build_variables(rulesetId: ruleset_id, status: status, first: first, after: after)
65
+ key = cache_key('rulesets', 'versions', **variables)
66
+
67
+ data = with_cache(key, resource: :rulesets, cache: cache) do
68
+ connection.execute(query, variables)
69
+ end
70
+
71
+ Collection.new(
72
+ data['rulesetVersions'],
73
+ item_class: RulesetVersion,
74
+ next_page_loader: ->(cursor) { versions(ruleset_id: ruleset_id, status: status, first: first, after: cursor, cache: cache) },
75
+ client: client
76
+ )
77
+ end
78
+
79
+ def get_version(id, cache: nil)
80
+ key = cache_key('rulesets', 'get_version', id: id)
81
+ with_cache(key, resource: :rulesets, cache: cache) do
82
+ data = connection.execute(QueryBuilder.ruleset_version, { id: id })
83
+ data['rulesetVersion'] ? RulesetVersion.new(data['rulesetVersion'], client: client) : nil
84
+ end
85
+ end
86
+
87
+ def validation_rules(game_id:, ruleset_key:, ruleset_version_id: nil, cache: nil)
88
+ variables = build_variables(gameId: game_id, rulesetKey: ruleset_key, rulesetVersionId: ruleset_version_id)
89
+ key = cache_key('rulesets', 'validation_rules', **variables)
90
+
91
+ with_cache(key, resource: :rulesets, cache: cache) do
92
+ data = connection.execute(QueryBuilder.ruleset_validation_rules, variables)
93
+ data['rulesetValidationRules']
94
+ end
95
+ end
96
+
97
+ def deck_validation_rules(game_id:, ruleset_key:, ruleset_version_id: nil, cache: nil)
98
+ variables = build_variables(gameId: game_id, rulesetKey: ruleset_key, rulesetVersionId: ruleset_version_id)
99
+ key = cache_key('rulesets', 'deck_validation_rules', **variables)
100
+
101
+ with_cache(key, resource: :rulesets, cache: cache) do
102
+ data = connection.execute(QueryBuilder.deck_validation_rules, variables)
103
+ data['deckValidationRules'] ? DeckValidationRules.new(data['deckValidationRules'], client: client) : nil
104
+ end
105
+ end
106
+
107
+ def preview_import(ruleset_id:, input:)
108
+ data = connection.execute(
109
+ QueryBuilder.ruleset_version_draft_import_preview,
110
+ { rulesetId: ruleset_id, input: input }
111
+ )
112
+ RulesetVersionDraftImportPreview.new(data['rulesetVersionDraftImportPreview'], client: client)
113
+ end
114
+
115
+ def validation_impact(ruleset_version_id:, first: nil, cache: nil)
116
+ query = QueryBuilder.ruleset_validation_impact(ruleset_version_id: ruleset_version_id, first: first)
117
+ variables = build_variables(rulesetVersionId: ruleset_version_id, first: first)
118
+ key = cache_key('rulesets', 'validation_impact', **variables)
119
+
120
+ with_cache(key, resource: :rulesets, cache: cache) do
121
+ data = connection.execute(query, variables)
122
+ RulesetValidationImpact.new(data['rulesetValidationImpact'], client: client)
123
+ end
124
+ end
125
+
126
+ def create(input:)
127
+ config.require_secret_credential!('rulesets.create')
128
+
129
+ data = connection.execute(QueryBuilder.create_ruleset, { input: input })
130
+ Ruleset.new(data['rulesetCreate'], client: client)
131
+ end
132
+
133
+ def update(id:, input:)
134
+ config.require_secret_credential!('rulesets.update')
135
+
136
+ data = connection.execute(QueryBuilder.update_ruleset, { id: id, input: input })
137
+ Ruleset.new(data['rulesetUpdate'], client: client)
138
+ end
139
+
140
+ def create_draft(ruleset_id:, input:)
141
+ config.require_secret_credential!('rulesets.create_draft')
142
+
143
+ data = connection.execute(QueryBuilder.create_ruleset_version_draft, { rulesetId: ruleset_id, input: input })
144
+ RulesetVersion.new(data['rulesetVersionDraftCreate'], client: client)
145
+ end
146
+
147
+ def import_draft_from_dataset_record(ruleset_id:, input:)
148
+ config.require_secret_credential!('rulesets.import_draft_from_dataset_record')
149
+
150
+ data = connection.execute(
151
+ QueryBuilder.import_ruleset_version_draft_from_dataset_record,
152
+ { rulesetId: ruleset_id, input: input }
153
+ )
154
+ RulesetVersion.new(data['rulesetVersionDraftImportFromDatasetRecord'], client: client)
155
+ end
156
+
157
+ def update_draft(id:, input:)
158
+ config.require_secret_credential!('rulesets.update_draft')
159
+
160
+ data = connection.execute(QueryBuilder.update_ruleset_version_draft, { id: id, input: input })
161
+ RulesetVersion.new(data['rulesetVersionDraftUpdate'], client: client)
162
+ end
163
+
164
+ def publish_version(id:, input: nil)
165
+ config.require_secret_credential!('rulesets.publish_version')
166
+
167
+ variables = input.nil? ? { id: id } : { id: id, input: input }
168
+ data = connection.execute(QueryBuilder.publish_ruleset_version, variables)
169
+ RulesetVersion.new(data['rulesetVersionPublish'], client: client)
170
+ end
171
+
172
+ def activate_version(id:)
173
+ config.require_secret_credential!('rulesets.activate_version')
174
+
175
+ data = connection.execute(QueryBuilder.activate_ruleset_version, { id: id })
176
+ RulesetVersion.new(data['rulesetVersionActivate'], client: client)
177
+ end
178
+ end
179
+ end
180
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CardDB
4
- VERSION = '0.4.5'
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/carddb.rb CHANGED
@@ -22,6 +22,7 @@ require_relative 'carddb/resources/scans'
22
22
  require_relative 'carddb/resources/scan_templates'
23
23
  require_relative 'carddb/resources/decks'
24
24
  require_relative 'carddb/resources/rules'
25
+ require_relative 'carddb/resources/rulesets'
25
26
  require_relative 'carddb/batch'
26
27
  require_relative 'carddb/client'
27
28
 
@@ -173,6 +174,13 @@ module CardDB
173
174
  default_client.rules
174
175
  end
175
176
 
177
+ # Access the Rulesets resource via the default client.
178
+ #
179
+ # @return [Resources::Rulesets]
180
+ def rulesets
181
+ default_client.rulesets
182
+ end
183
+
176
184
  # Get information about the current API key.
177
185
  #
178
186
  # @return [Hash, nil]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carddb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CardDB Team
@@ -95,6 +95,7 @@ files:
95
95
  - lib/carddb/resources/publishers.rb
96
96
  - lib/carddb/resources/records.rb
97
97
  - lib/carddb/resources/rules.rb
98
+ - lib/carddb/resources/rulesets.rb
98
99
  - lib/carddb/resources/scan_templates.rb
99
100
  - lib/carddb/resources/scans.rb
100
101
  - lib/carddb/version.rb