carddb 0.3.15 → 0.4.1

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: de0907aa6dd9a3634bac2ad6ffdad769417e63f152fd239983dde1a47fb941c4
4
- data.tar.gz: 0657376eec78c8c10817b0bc7f1305c689878e74660056850433bfd806370c1a
3
+ metadata.gz: 6dd0e81d58cc181746d0c3f2f58a9b79b88422e3ceea5fab2ef59d9df85621eb
4
+ data.tar.gz: 90e8ea0085d6fab3b6f8bb93bf2d0a92e6971b0c50e313e2c0771e8d524da347
5
5
  SHA512:
6
- metadata.gz: 70abf104f20c017127051549239e08175c61ed9d48e6ae2594c00019e8086dbd71603c922e88ff8b617a72b38801c3184b2c161d600b4f79c9e2089d558c9c45
7
- data.tar.gz: 8a3a0960423e0df0fdee392f67777ea18937aa7d59d3d756345dab17c1a2637e1792d1a1930dafe65bf2e91a164f0f625923e25d2558c0b550b1f2f771437f0a
6
+ metadata.gz: 3c556701df9623c27fee58aea3ec629bae7d3d4c8ba89290de268b0b374efb9fff6225b67ce65365fcb79c0e75cf2445c5ef5ebf30d2bd6fc1e1e84df21ac461
7
+ data.tar.gz: 21c656b6e138994dbf1ccf2face5291cc4e5b21a13dc15857ffc21fd1834da04f9241b9057e531ff8e62b4e813efd83b11333346ee05b8007e39916e94a39265
data/.rspec_status CHANGED
@@ -1,175 +1,189 @@
1
1
  example_id | status | run_time |
2
2
  ---------------------------------------------------------- | ------ | --------------- |
3
- ./spec/carddb/client_spec.rb[1:1:1] | passed | 0.00048 seconds |
3
+ ./spec/carddb/client_spec.rb[1:1:1] | passed | 0.00022 seconds |
4
4
  ./spec/carddb/client_spec.rb[1:1:2] | passed | 0.00004 seconds |
5
5
  ./spec/carddb/client_spec.rb[1:1:3] | passed | 0.00004 seconds |
6
6
  ./spec/carddb/client_spec.rb[1:1:4] | passed | 0.00003 seconds |
7
- ./spec/carddb/client_spec.rb[1:2:1] | passed | 0.00034 seconds |
8
- ./spec/carddb/client_spec.rb[1:2:2] | passed | 0.00024 seconds |
9
- ./spec/carddb/client_spec.rb[1:3:1] | passed | 0.00005 seconds |
10
- ./spec/carddb/client_spec.rb[1:4:1] | passed | 0.00004 seconds |
7
+ ./spec/carddb/client_spec.rb[1:2:1] | passed | 0.00016 seconds |
8
+ ./spec/carddb/client_spec.rb[1:2:2] | passed | 0.00016 seconds |
9
+ ./spec/carddb/client_spec.rb[1:3:1] | passed | 0.00003 seconds |
10
+ ./spec/carddb/client_spec.rb[1:4:1] | passed | 0.00003 seconds |
11
11
  ./spec/carddb/client_spec.rb[1:5:1] | passed | 0.00003 seconds |
12
12
  ./spec/carddb/client_spec.rb[1:6:1] | passed | 0.00003 seconds |
13
13
  ./spec/carddb/client_spec.rb[1:7:1] | passed | 0.00003 seconds |
14
- ./spec/carddb/client_spec.rb[1:8:1] | passed | 0.00003 seconds |
14
+ ./spec/carddb/client_spec.rb[1:8:1] | passed | 0.00004 seconds |
15
15
  ./spec/carddb/client_spec.rb[1:9:1] | passed | 0.00003 seconds |
16
16
  ./spec/carddb/client_spec.rb[1:10:1] | passed | 0.00003 seconds |
17
- ./spec/carddb/client_spec.rb[1:11:1] | passed | 0.00032 seconds |
18
- ./spec/carddb/client_spec.rb[1:11:2] | passed | 0.00978 seconds |
19
- ./spec/carddb/collection_spec.rb[1:1:1] | passed | 0.00006 seconds |
20
- ./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.00004 seconds |
21
- ./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.0026 seconds |
22
- ./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.00014 seconds |
23
- ./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.00039 seconds |
24
- ./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.00056 seconds |
17
+ ./spec/carddb/client_spec.rb[1:11:1] | passed | 0.00003 seconds |
18
+ ./spec/carddb/client_spec.rb[1:12:1] | passed | 0.00003 seconds |
19
+ ./spec/carddb/client_spec.rb[1:13:1] | passed | 0.00023 seconds |
20
+ ./spec/carddb/client_spec.rb[1:13:2] | passed | 0.00876 seconds |
21
+ ./spec/carddb/collection_spec.rb[1:1:1] | passed | 0.00005 seconds |
22
+ ./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.00003 seconds |
23
+ ./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.00228 seconds |
24
+ ./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.00017 seconds |
25
+ ./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.00038 seconds |
26
+ ./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.00036 seconds |
25
27
  ./spec/carddb/collection_spec.rb[3:1:5] | passed | 0.00005 seconds |
26
28
  ./spec/carddb/collection_spec.rb[4:1:1] | passed | 0.00016 seconds |
27
29
  ./spec/carddb/collection_spec.rb[4:1:2] | passed | 0.00014 seconds |
28
- ./spec/carddb/collection_spec.rb[4:1:3] | passed | 0.00015 seconds |
30
+ ./spec/carddb/collection_spec.rb[4:1:3] | passed | 0.00016 seconds |
29
31
  ./spec/carddb/collection_spec.rb[4:1:4] | passed | 0.00004 seconds |
30
- ./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.00003 seconds |
32
+ ./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.00004 seconds |
31
33
  ./spec/carddb/configuration_spec.rb[1:1:2] | passed | 0.00003 seconds |
32
34
  ./spec/carddb/configuration_spec.rb[1:1:3] | passed | 0.00003 seconds |
33
35
  ./spec/carddb/configuration_spec.rb[1:1:4] | passed | 0.00003 seconds |
34
36
  ./spec/carddb/configuration_spec.rb[1:1:5] | passed | 0.00003 seconds |
35
37
  ./spec/carddb/configuration_spec.rb[1:1:6] | passed | 0.00003 seconds |
36
- ./spec/carddb/configuration_spec.rb[1:2:1:1] | passed | 0.00004 seconds |
37
- ./spec/carddb/configuration_spec.rb[1:2:2:1] | passed | 0.00003 seconds |
38
- ./spec/carddb/configuration_spec.rb[1:2:2:2] | passed | 0.00004 seconds |
39
- ./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.00003 seconds |
38
+ ./spec/carddb/configuration_spec.rb[1:2:1:1] | passed | 0.00006 seconds |
39
+ ./spec/carddb/configuration_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
40
+ ./spec/carddb/configuration_spec.rb[1:2:2:2] | passed | 0.00005 seconds |
41
+ ./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
40
42
  ./spec/carddb/configuration_spec.rb[1:3:2:1] | passed | 0.00003 seconds |
41
43
  ./spec/carddb/configuration_spec.rb[1:3:2:2] | passed | 0.00004 seconds |
42
- ./spec/carddb/configuration_spec.rb[1:3:2:3] | passed | 0.00004 seconds |
43
- ./spec/carddb/configuration_spec.rb[1:4:1] | passed | 0.00003 seconds |
44
+ ./spec/carddb/configuration_spec.rb[1:3:2:3] | passed | 0.00003 seconds |
45
+ ./spec/carddb/configuration_spec.rb[1:4:1] | passed | 0.00004 seconds |
44
46
  ./spec/carddb/configuration_spec.rb[1:4:2] | passed | 0.00003 seconds |
45
47
  ./spec/carddb/configuration_spec.rb[1:5:1] | passed | 0.00004 seconds |
46
- ./spec/carddb/configuration_spec.rb[1:6:1] | passed | 0.00003 seconds |
48
+ ./spec/carddb/configuration_spec.rb[1:6:1] | passed | 0.00004 seconds |
47
49
  ./spec/carddb/configuration_spec.rb[1:6:2] | passed | 0.00003 seconds |
48
50
  ./spec/carddb/configuration_spec.rb[1:6:3] | passed | 0.00004 seconds |
49
51
  ./spec/carddb/configuration_spec.rb[1:7:1] | passed | 0.00003 seconds |
50
52
  ./spec/carddb/configuration_spec.rb[1:7:2] | passed | 0.00004 seconds |
51
53
  ./spec/carddb/configuration_spec.rb[1:7:3] | passed | 0.00004 seconds |
52
- ./spec/carddb/deck_tokens_spec.rb[1:1:1] | passed | 0.00117 seconds |
53
- ./spec/carddb/deck_tokens_spec.rb[1:2:1] | passed | 0.0008 seconds |
54
- ./spec/carddb/deck_tokens_spec.rb[1:2:2] | passed | 0.00025 seconds |
55
- ./spec/carddb/deck_tokens_spec.rb[1:2:3] | passed | 0.00007 seconds |
54
+ ./spec/carddb/deck_tokens_spec.rb[1:1:1] | passed | 0.00069 seconds |
55
+ ./spec/carddb/deck_tokens_spec.rb[1:2:1] | passed | 0.00073 seconds |
56
+ ./spec/carddb/deck_tokens_spec.rb[1:2:2] | passed | 0.00024 seconds |
57
+ ./spec/carddb/deck_tokens_spec.rb[1:2:3] | passed | 0.00008 seconds |
56
58
  ./spec/carddb/filter_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
57
59
  ./spec/carddb/filter_builder_spec.rb[1:1:2] | passed | 0.00003 seconds |
58
60
  ./spec/carddb/filter_builder_spec.rb[1:1:3] | passed | 0.00004 seconds |
59
61
  ./spec/carddb/filter_builder_spec.rb[1:1:4] | passed | 0.00004 seconds |
60
- ./spec/carddb/filter_builder_spec.rb[1:1:5] | passed | 0.00003 seconds |
61
- ./spec/carddb/filter_builder_spec.rb[1:1:6] | passed | 0.00003 seconds |
62
+ ./spec/carddb/filter_builder_spec.rb[1:1:5] | passed | 0.00004 seconds |
63
+ ./spec/carddb/filter_builder_spec.rb[1:1:6] | passed | 0.00004 seconds |
62
64
  ./spec/carddb/filter_builder_spec.rb[1:1:7] | passed | 0.00003 seconds |
63
65
  ./spec/carddb/filter_builder_spec.rb[1:1:8] | passed | 0.00003 seconds |
64
- ./spec/carddb/filter_builder_spec.rb[1:2:1] | passed | 0.00004 seconds |
66
+ ./spec/carddb/filter_builder_spec.rb[1:2:1] | passed | 0.00003 seconds |
65
67
  ./spec/carddb/filter_builder_spec.rb[1:2:2] | passed | 0.00003 seconds |
66
68
  ./spec/carddb/filter_builder_spec.rb[1:2:3] | passed | 0.00003 seconds |
67
- ./spec/carddb/filter_builder_spec.rb[1:2:4] | passed | 0.00003 seconds |
68
- ./spec/carddb/filter_builder_spec.rb[1:2:5] | passed | 0.00004 seconds |
69
- ./spec/carddb/filter_builder_spec.rb[1:2:6] | passed | 0.00003 seconds |
69
+ ./spec/carddb/filter_builder_spec.rb[1:2:4] | passed | 0.00004 seconds |
70
+ ./spec/carddb/filter_builder_spec.rb[1:2:5] | passed | 0.00003 seconds |
71
+ ./spec/carddb/filter_builder_spec.rb[1:2:6] | passed | 0.00004 seconds |
70
72
  ./spec/carddb/filter_builder_spec.rb[1:2:7] | passed | 0.00003 seconds |
71
- ./spec/carddb/filter_builder_spec.rb[1:2:8] | passed | 0.00003 seconds |
72
- ./spec/carddb/filter_builder_spec.rb[1:2:9] | passed | 0.00003 seconds |
73
- ./spec/carddb/filter_builder_spec.rb[1:2:10] | passed | 0.00003 seconds |
73
+ ./spec/carddb/filter_builder_spec.rb[1:2:8] | passed | 0.00004 seconds |
74
+ ./spec/carddb/filter_builder_spec.rb[1:2:9] | passed | 0.00004 seconds |
75
+ ./spec/carddb/filter_builder_spec.rb[1:2:10] | passed | 0.00004 seconds |
74
76
  ./spec/carddb/filter_builder_spec.rb[1:2:11] | passed | 0.00003 seconds |
75
- ./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.00003 seconds |
77
+ ./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.00004 seconds |
76
78
  ./spec/carddb/filter_builder_spec.rb[1:2:13] | passed | 0.00003 seconds |
77
- ./spec/carddb/query_builder_spec.rb[1:1:1] | passed | 0.00005 seconds |
79
+ ./spec/carddb/query_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
78
80
  ./spec/carddb/query_builder_spec.rb[1:1:2] | passed | 0.00004 seconds |
79
- ./spec/carddb/query_builder_spec.rb[1:1:3] | passed | 0.00003 seconds |
81
+ ./spec/carddb/query_builder_spec.rb[1:1:3] | passed | 0.00004 seconds |
80
82
  ./spec/carddb/query_builder_spec.rb[1:2:1:1] | passed | 0.00005 seconds |
81
83
  ./spec/carddb/query_builder_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
82
- ./spec/carddb/query_builder_spec.rb[1:3:1] | passed | 0.00004 seconds |
84
+ ./spec/carddb/query_builder_spec.rb[1:3:1] | passed | 0.00005 seconds |
83
85
  ./spec/carddb/query_builder_spec.rb[1:3:2] | passed | 0.00004 seconds |
84
86
  ./spec/carddb/query_builder_spec.rb[1:4:1] | passed | 0.00005 seconds |
85
- ./spec/carddb/query_builder_spec.rb[1:4:2] | passed | 0.00004 seconds |
86
- ./spec/carddb/query_builder_spec.rb[1:5:1] | passed | 0.00003 seconds |
87
+ ./spec/carddb/query_builder_spec.rb[1:4:2] | passed | 0.00003 seconds |
88
+ ./spec/carddb/query_builder_spec.rb[1:5:1] | passed | 0.00004 seconds |
87
89
  ./spec/carddb/query_builder_spec.rb[1:5:2] | passed | 0.00004 seconds |
88
90
  ./spec/carddb/query_builder_spec.rb[1:5:3] | passed | 0.00004 seconds |
89
- ./spec/carddb/query_builder_spec.rb[1:5:4] | passed | 0.00003 seconds |
91
+ ./spec/carddb/query_builder_spec.rb[1:5:4] | passed | 0.00004 seconds |
90
92
  ./spec/carddb/query_builder_spec.rb[1:5:5] | passed | 0.00005 seconds |
91
93
  ./spec/carddb/query_builder_spec.rb[1:5:6] | passed | 0.00004 seconds |
92
94
  ./spec/carddb/query_builder_spec.rb[1:5:7] | passed | 0.00004 seconds |
93
95
  ./spec/carddb/query_builder_spec.rb[1:6:1] | passed | 0.00006 seconds |
94
96
  ./spec/carddb/query_builder_spec.rb[1:6:2] | passed | 0.00006 seconds |
95
97
  ./spec/carddb/query_builder_spec.rb[1:6:3] | passed | 0.00005 seconds |
96
- ./spec/carddb/resources/datasets_spec.rb[1:1:1] | passed | 0.00432 seconds |
97
- ./spec/carddb/resources/datasets_spec.rb[1:1:2] | passed | 0.00421 seconds |
98
- ./spec/carddb/resources/datasets_spec.rb[1:2:1] | passed | 0.00394 seconds |
99
- ./spec/carddb/resources/decks_spec.rb[1:1:1] | passed | 0.00406 seconds |
100
- ./spec/carddb/resources/decks_spec.rb[1:1:2] | passed | 0.00474 seconds |
101
- ./spec/carddb/resources/decks_spec.rb[1:1:3] | passed | 0.00426 seconds |
102
- ./spec/carddb/resources/decks_spec.rb[1:1:4] | passed | 0.00418 seconds |
103
- ./spec/carddb/resources/decks_spec.rb[1:2:1] | passed | 0.00451 seconds |
104
- ./spec/carddb/resources/decks_spec.rb[1:2:2] | passed | 0.01223 seconds |
105
- ./spec/carddb/resources/decks_spec.rb[1:2:3] | passed | 0.00007 seconds |
106
- ./spec/carddb/resources/decks_spec.rb[1:3:1] | passed | 0.0047 seconds |
107
- ./spec/carddb/resources/decks_spec.rb[1:4:1] | passed | 0.00395 seconds |
108
- ./spec/carddb/resources/decks_spec.rb[1:5:1] | passed | 0.00425 seconds |
109
- ./spec/carddb/resources/decks_spec.rb[1:6:1] | passed | 0.00414 seconds |
110
- ./spec/carddb/resources/decks_spec.rb[1:7:1] | passed | 0.00413 seconds |
111
- ./spec/carddb/resources/decks_spec.rb[1:8:1] | passed | 0.00394 seconds |
112
- ./spec/carddb/resources/decks_spec.rb[1:9:1] | passed | 0.00409 seconds |
113
- ./spec/carddb/resources/decks_spec.rb[1:10:1] | passed | 0.00439 seconds |
114
- ./spec/carddb/resources/decks_spec.rb[1:11:1] | passed | 0.00466 seconds |
115
- ./spec/carddb/resources/decks_spec.rb[1:11:2] | passed | 0.00414 seconds |
116
- ./spec/carddb/resources/decks_spec.rb[1:11:3] | passed | 0.00433 seconds |
117
- ./spec/carddb/resources/decks_spec.rb[1:11:4] | passed | 0.00454 seconds |
118
- ./spec/carddb/resources/decks_spec.rb[1:12:1] | passed | 0.00424 seconds |
119
- ./spec/carddb/resources/decks_spec.rb[1:13:1] | passed | 0.00384 seconds |
120
- ./spec/carddb/resources/decks_spec.rb[1:14:1] | passed | 0.00444 seconds |
121
- ./spec/carddb/resources/decks_spec.rb[1:14:2] | passed | 0.00423 seconds |
122
- ./spec/carddb/resources/decks_spec.rb[1:14:3] | passed | 0.00618 seconds |
123
- ./spec/carddb/resources/decks_spec.rb[1:15:1] | passed | 0.00397 seconds |
124
- ./spec/carddb/resources/decks_spec.rb[1:16:1] | passed | 0.0038 seconds |
125
- ./spec/carddb/resources/decks_spec.rb[1:17:1] | passed | 0.00434 seconds |
126
- ./spec/carddb/resources/decks_spec.rb[1:17:2] | passed | 0.00494 seconds |
127
- ./spec/carddb/resources/decks_spec.rb[1:17:3] | passed | 0.00417 seconds |
128
- ./spec/carddb/resources/decks_spec.rb[1:18:1] | passed | 0.00456 seconds |
129
- ./spec/carddb/resources/decks_spec.rb[1:19:1] | passed | 0.00422 seconds |
130
- ./spec/carddb/resources/decks_spec.rb[1:20:1] | passed | 0.0039 seconds |
131
- ./spec/carddb/resources/decks_spec.rb[1:21:1] | passed | 0.00385 seconds |
132
- ./spec/carddb/resources/decks_spec.rb[1:22:1] | passed | 0.00398 seconds |
133
- ./spec/carddb/resources/decks_spec.rb[1:23:1] | passed | 0.00384 seconds |
134
- ./spec/carddb/resources/decks_spec.rb[1:24:1] | passed | 0.00415 seconds |
135
- ./spec/carddb/resources/decks_spec.rb[1:25:1] | passed | 0.00416 seconds |
136
- ./spec/carddb/resources/games_spec.rb[1:1:1] | passed | 0.00383 seconds |
137
- ./spec/carddb/resources/games_spec.rb[1:1:2] | passed | 0.00007 seconds |
138
- ./spec/carddb/resources/games_spec.rb[1:2:1] | passed | 0.00378 seconds |
139
- ./spec/carddb/resources/games_spec.rb[1:2:2] | passed | 0.00867 seconds |
140
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:1] | passed | 0.00429 seconds |
141
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:2] | passed | 0.00532 seconds |
142
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:3] | passed | 0.00603 seconds |
143
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:1] | passed | 0.00554 seconds |
144
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:2] | passed | 0.00008 seconds |
145
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:1] | passed | 0.00495 seconds |
146
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:2] | passed | 0.00384 seconds |
147
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:3] | passed | 0.00383 seconds |
148
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:1] | passed | 0.00417 seconds |
149
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:2] | passed | 0.00543 seconds |
150
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:3] | passed | 0.00408 seconds |
151
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:1] | passed | 0.00518 seconds |
152
- ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:2] | passed | 0.0042 seconds |
153
- ./spec/carddb/resources/publishers_spec.rb[1:1:1] | passed | 0.00414 seconds |
154
- ./spec/carddb/resources/publishers_spec.rb[1:2:1] | passed | 0.00415 seconds |
155
- ./spec/carddb/resources/records_spec.rb[1:1:1] | passed | 0.00403 seconds |
156
- ./spec/carddb/resources/records_spec.rb[1:1:2] | passed | 0.00486 seconds |
157
- ./spec/carddb/resources/records_spec.rb[1:1:3] | passed | 0.00014 seconds |
98
+ ./spec/carddb/query_builder_spec.rb[1:6:4] | passed | 0.00003 seconds |
99
+ ./spec/carddb/query_builder_spec.rb[1:6:5] | passed | 0.00004 seconds |
100
+ ./spec/carddb/resources/datasets_spec.rb[1:1:1] | passed | 0.00437 seconds |
101
+ ./spec/carddb/resources/datasets_spec.rb[1:1:2] | passed | 0.00379 seconds |
102
+ ./spec/carddb/resources/datasets_spec.rb[1:2:1] | passed | 0.0075 seconds |
103
+ ./spec/carddb/resources/decks_spec.rb[1:1:1] | passed | 0.00379 seconds |
104
+ ./spec/carddb/resources/decks_spec.rb[1:1:2] | passed | 0.00436 seconds |
105
+ ./spec/carddb/resources/decks_spec.rb[1:1:3] | passed | 0.00383 seconds |
106
+ ./spec/carddb/resources/decks_spec.rb[1:1:4] | passed | 0.00412 seconds |
107
+ ./spec/carddb/resources/decks_spec.rb[1:2:1] | passed | 0.00448 seconds |
108
+ ./spec/carddb/resources/decks_spec.rb[1:2:2] | passed | 0.00813 seconds |
109
+ ./spec/carddb/resources/decks_spec.rb[1:2:3] | passed | 0.00006 seconds |
110
+ ./spec/carddb/resources/decks_spec.rb[1:3:1] | passed | 0.00399 seconds |
111
+ ./spec/carddb/resources/decks_spec.rb[1:4:1] | passed | 0.00453 seconds |
112
+ ./spec/carddb/resources/decks_spec.rb[1:5:1] | passed | 0.00394 seconds |
113
+ ./spec/carddb/resources/decks_spec.rb[1:6:1] | passed | 0.00387 seconds |
114
+ ./spec/carddb/resources/decks_spec.rb[1:7:1] | passed | 0.00384 seconds |
115
+ ./spec/carddb/resources/decks_spec.rb[1:8:1] | passed | 0.00388 seconds |
116
+ ./spec/carddb/resources/decks_spec.rb[1:9:1] | passed | 0.00394 seconds |
117
+ ./spec/carddb/resources/decks_spec.rb[1:10:1] | passed | 0.00409 seconds |
118
+ ./spec/carddb/resources/decks_spec.rb[1:11:1] | passed | 0.00418 seconds |
119
+ ./spec/carddb/resources/decks_spec.rb[1:11:2] | passed | 0.00404 seconds |
120
+ ./spec/carddb/resources/decks_spec.rb[1:11:3] | passed | 0.00507 seconds |
121
+ ./spec/carddb/resources/decks_spec.rb[1:11:4] | passed | 0.00379 seconds |
122
+ ./spec/carddb/resources/decks_spec.rb[1:12:1] | passed | 0.00401 seconds |
123
+ ./spec/carddb/resources/decks_spec.rb[1:13:1] | passed | 0.00392 seconds |
124
+ ./spec/carddb/resources/decks_spec.rb[1:14:1] | passed | 0.00396 seconds |
125
+ ./spec/carddb/resources/decks_spec.rb[1:14:2] | passed | 0.00408 seconds |
126
+ ./spec/carddb/resources/decks_spec.rb[1:14:3] | passed | 0.00379 seconds |
127
+ ./spec/carddb/resources/decks_spec.rb[1:15:1] | passed | 0.00391 seconds |
128
+ ./spec/carddb/resources/decks_spec.rb[1:16:1] | passed | 0.00388 seconds |
129
+ ./spec/carddb/resources/decks_spec.rb[1:17:1] | passed | 0.00377 seconds |
130
+ ./spec/carddb/resources/decks_spec.rb[1:17:2] | passed | 0.00448 seconds |
131
+ ./spec/carddb/resources/decks_spec.rb[1:17:3] | passed | 0.00412 seconds |
132
+ ./spec/carddb/resources/decks_spec.rb[1:18:1] | passed | 0.00419 seconds |
133
+ ./spec/carddb/resources/decks_spec.rb[1:19:1] | passed | 0.00377 seconds |
134
+ ./spec/carddb/resources/decks_spec.rb[1:20:1] | passed | 0.00394 seconds |
135
+ ./spec/carddb/resources/decks_spec.rb[1:21:1] | passed | 0.00366 seconds |
136
+ ./spec/carddb/resources/decks_spec.rb[1:22:1] | passed | 0.00384 seconds |
137
+ ./spec/carddb/resources/decks_spec.rb[1:23:1] | passed | 0.00366 seconds |
138
+ ./spec/carddb/resources/decks_spec.rb[1:24:1] | passed | 0.00383 seconds |
139
+ ./spec/carddb/resources/decks_spec.rb[1:25:1] | passed | 0.00774 seconds |
140
+ ./spec/carddb/resources/games_spec.rb[1:1:1] | passed | 0.00391 seconds |
141
+ ./spec/carddb/resources/games_spec.rb[1:1:2] | passed | 0.00006 seconds |
142
+ ./spec/carddb/resources/games_spec.rb[1:2:1] | passed | 0.00466 seconds |
143
+ ./spec/carddb/resources/games_spec.rb[1:2:2] | passed | 0.0037 seconds |
144
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:1] | passed | 0.0048 seconds |
145
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:2] | passed | 0.00383 seconds |
146
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:1:3] | passed | 0.00454 seconds |
147
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:1] | passed | 0.00478 seconds |
148
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:2:2] | passed | 0.00006 seconds |
149
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:1] | passed | 0.00396 seconds |
150
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:2] | passed | 0.00456 seconds |
151
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:3:3] | passed | 0.0035 seconds |
152
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:1] | passed | 0.00473 seconds |
153
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:2] | passed | 0.00405 seconds |
154
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:4:3] | passed | 0.00448 seconds |
155
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:1] | passed | 0.00474 seconds |
156
+ ./spec/carddb/resources/publisher_workflows_spec.rb[1:5:2] | passed | 0.0037 seconds |
157
+ ./spec/carddb/resources/publishers_spec.rb[1:1:1] | passed | 0.0035 seconds |
158
+ ./spec/carddb/resources/publishers_spec.rb[1:2:1] | passed | 0.0041 seconds |
159
+ ./spec/carddb/resources/records_spec.rb[1:1:1] | passed | 0.00357 seconds |
160
+ ./spec/carddb/resources/records_spec.rb[1:1:2] | passed | 0.0037 seconds |
161
+ ./spec/carddb/resources/records_spec.rb[1:1:3] | passed | 0.00067 seconds |
158
162
  ./spec/carddb/resources/records_spec.rb[1:1:4] | passed | 0.00005 seconds |
159
- ./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.00406 seconds |
160
- ./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.00564 seconds |
161
- ./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.00388 seconds |
162
- ./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.00376 seconds |
163
+ ./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.00367 seconds |
164
+ ./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.00349 seconds |
165
+ ./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.00602 seconds |
166
+ ./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.00381 seconds |
163
167
  ./spec/carddb/resources/records_spec.rb[1:3:2] | passed | 0.00011 seconds |
164
- ./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.00421 seconds |
165
- ./spec/carddb/resources/records_spec.rb[1:4:2] | passed | 0.00005 seconds |
166
- ./spec/carddb/resources/records_spec.rb[1:4:3] | passed | 0.0001 seconds |
167
- ./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.00411 seconds |
168
- ./spec/carddb/resources/rules_spec.rb[1:2:1] | passed | 0.00398 seconds |
168
+ ./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.0038 seconds |
169
+ ./spec/carddb/resources/records_spec.rb[1:4:2] | passed | 0.00004 seconds |
170
+ ./spec/carddb/resources/records_spec.rb[1:4:3] | passed | 0.00007 seconds |
171
+ ./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.00365 seconds |
172
+ ./spec/carddb/resources/rules_spec.rb[1:2:1] | passed | 0.00394 seconds |
173
+ ./spec/carddb/resources/scans_spec.rb[1:1] | passed | 0.00377 seconds |
174
+ ./spec/carddb/resources/scans_spec.rb[1:2] | passed | 0.00761 seconds |
175
+ ./spec/carddb/resources/scans_spec.rb[1:3] | passed | 0.00377 seconds |
176
+ ./spec/carddb/resources/scans_spec.rb[1:4] | passed | 0.00406 seconds |
177
+ ./spec/carddb/resources/scans_spec.rb[1:5] | passed | 0.00395 seconds |
178
+ ./spec/carddb/resources/scans_spec.rb[1:6] | passed | 0.00413 seconds |
179
+ ./spec/carddb/resources/scans_spec.rb[1:7] | passed | 0.00377 seconds |
180
+ ./spec/carddb/resources/scans_spec.rb[1:8] | passed | 0.00009 seconds |
169
181
  ./spec/carddb_spec.rb[1:1] | passed | 0.00004 seconds |
170
182
  ./spec/carddb_spec.rb[1:2:1] | passed | 0.00003 seconds |
171
183
  ./spec/carddb_spec.rb[1:3:1] | passed | 0.00003 seconds |
172
184
  ./spec/carddb_spec.rb[1:4:1] | passed | 0.00004 seconds |
173
- ./spec/carddb_spec.rb[1:5:1] | passed | 0.00005 seconds |
174
- ./spec/carddb_spec.rb[1:6:1] | passed | 0.00004 seconds |
185
+ ./spec/carddb_spec.rb[1:5:1] | passed | 0.00004 seconds |
186
+ ./spec/carddb_spec.rb[1:6:1] | passed | 0.00003 seconds |
175
187
  ./spec/carddb_spec.rb[1:7:1] | passed | 0.00003 seconds |
188
+ ./spec/carddb_spec.rb[1:8:1] | passed | 0.00003 seconds |
189
+ ./spec/carddb_spec.rb[1:9:1] | passed | 0.00003 seconds |
data/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.1] - 2026-06-22
11
+
12
+ ### Added
13
+
14
+ - Scan-specific upload helpers for publishable-key scan workflows: `client.scans.create_upload_session` and `client.scans.confirm_upload`.
15
+
16
+ ### Changed
17
+
18
+ - README scan examples now use scan-specific upload mutations instead of the server-side generic file upload helpers.
19
+
20
+ ## [0.4.0] - 2026-06-22
21
+
10
22
  ### Added
11
23
 
12
24
  - Publisher workflow resources for game management, import-format management, import jobs, files, dataset exports, schema introspection, batch upsert, and bulk delete/reconciliation.
@@ -15,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
27
  - Deck import payloads now expose configured import format metadata and auto-detection details.
16
28
  - Documentation now covers configured deck imports and `BAN` / `RESTRICTION` deck validation issue metadata.
17
29
  - Deck clients now expose ownership-aware queries, claim/transfer/copy helpers, selected-deck app access management, configured import-format management, direct deck access token issuer fields, and `publishable_key` configuration.
30
+ - GraphQL scan workflow helpers for image upload, job creation/polling, feedback, metrics, scan templates, game scan regions, and webhook signature verification.
18
31
 
19
32
  ### Security
20
33
 
data/README.md CHANGED
@@ -268,6 +268,159 @@ export = client.exports.wait_for_job(export.id)
268
268
  puts export.download_url
269
269
  ```
270
270
 
271
+ Card scanning uses scan-specific upload mutations that work with a publishable key carrying `scans:write`. Image bytes still go directly to object storage, then GraphQL confirms the file and creates the scan job:
272
+
273
+ ```ruby
274
+ image = File.open('scan.jpg', 'rb')
275
+ content_type = 'image/jpeg'
276
+
277
+ upload = client.scans.create_upload_session(
278
+ publisher_slug: 'pokemon-company',
279
+ game_key: 'pokemon-tcg',
280
+ dataset_key: 'cards',
281
+ filename: 'scan.jpg',
282
+ content_type: content_type,
283
+ size: image.stat.size
284
+ )
285
+
286
+ response = Faraday.put(upload.upload_url) do |request|
287
+ request.headers['Content-Type'] = content_type
288
+ request.body = image
289
+ end
290
+ raise "Upload failed with #{response.status}" unless response.success?
291
+
292
+ scan_image = client.scans.confirm_upload(
293
+ publisher_slug: 'pokemon-company',
294
+ game_key: 'pokemon-tcg',
295
+ dataset_key: 'cards',
296
+ file_id: upload.file.id
297
+ )
298
+
299
+ created = client.scans.create_job(
300
+ publisher_slug: 'pokemon-company',
301
+ game_key: 'pokemon-tcg',
302
+ dataset_key: 'cards',
303
+ file_id: scan_image.id,
304
+ client_request_id: 'device-request-123',
305
+ client_ocr_hints: { language: 'en' },
306
+ client_normalization: { region: 'en' },
307
+ webhook_url: 'https://publisher.example/webhooks/carddb/scan',
308
+ webhook_secret: ENV['CARDDB_SCAN_WEBHOOK_SECRET']
309
+ )
310
+
311
+ completed = client.scans.poll_job(created.job.job_id, timeout: 60, interval: 1)
312
+
313
+ if completed.best_match
314
+ client.scans.submit_feedback(
315
+ job_id: completed.job_id,
316
+ correct: true,
317
+ selected_record_id: completed.best_match.record_id
318
+ )
319
+ end
320
+
321
+ metrics = client.scans.metrics(
322
+ publisher_slug: 'pokemon-company',
323
+ game_key: 'pokemon-tcg',
324
+ dataset_key: 'cards'
325
+ )
326
+ puts metrics.feedback.accuracy
327
+ ```
328
+
329
+ The generic file APIs (`client.files.request_upload`, `client.files.confirm_upload`, and `client.files.upload`) remain server-side helpers for trusted publisher workflows.
330
+
331
+ Scan-capable clients can discover publisher-defined regions and manage templates. Template editing uses scan semantic types such as `card_name`, `collector_number`, `set_code`, and `set_name`.
332
+
333
+ ```ruby
334
+ regions = client.games.get_regions(publisher_slug: 'pokemon-company', game_key: 'pokemon-tcg')
335
+
336
+ resolution = client.scan_templates.resolve(
337
+ publisher_slug: 'pokemon-company',
338
+ game_key: 'pokemon-tcg',
339
+ dataset_key: 'cards'
340
+ )
341
+
342
+ templates = client.scan_templates.list(
343
+ publisher_slug: 'pokemon-company',
344
+ game_key: 'pokemon-tcg',
345
+ dataset_key: 'cards'
346
+ )
347
+
348
+ template_input = {
349
+ publisher_slug: 'pokemon-company',
350
+ game_key: 'pokemon-tcg',
351
+ dataset_key: 'cards',
352
+ key: 'default',
353
+ name: 'Default card scan',
354
+ status: 'active',
355
+ version: 1,
356
+ is_default: true,
357
+ regions: [
358
+ {
359
+ key: 'name',
360
+ label: 'Name',
361
+ sort_order: 1,
362
+ shape_type: 'rect',
363
+ geometry: { x: 0.08, y: 0.08, width: 0.84, height: 0.18 },
364
+ semantic_type: 'card_name',
365
+ extraction_mode: 'ocr',
366
+ lookup_mode: 'exact',
367
+ is_required: true,
368
+ config: { datasetFieldPath: 'name' }
369
+ }
370
+ ]
371
+ }
372
+
373
+ saved = client.scan_templates.create(template_input)
374
+
375
+ client.scan_templates.update(
376
+ id: saved.template.id,
377
+ input: template_input.merge(name: 'Default card scan v1')
378
+ )
379
+
380
+ preview = client.scan_templates.preview(
381
+ publisher_slug: 'pokemon-company',
382
+ game_key: 'pokemon-tcg',
383
+ dataset_key: 'cards',
384
+ key: 'default',
385
+ name: 'Default card scan',
386
+ status: 'active',
387
+ version: 1,
388
+ is_default: true,
389
+ regions: [
390
+ {
391
+ key: 'name',
392
+ label: 'Name',
393
+ sort_order: 1,
394
+ shape_type: 'rect',
395
+ geometry: { x: 0.08, y: 0.08, width: 0.84, height: 0.18 },
396
+ semantic_type: 'card_name',
397
+ extraction_mode: 'ocr',
398
+ lookup_mode: 'exact',
399
+ is_required: true
400
+ }
401
+ ],
402
+ region_ocr_hints: { name: 'Pikachu' }
403
+ )
404
+
405
+ puts [regions.first&.name, resolution.warnings.map(&:message), preview.message]
406
+ ```
407
+
408
+ Webhook handlers can verify the `X-CardDB-Signature` header without framework-specific code:
409
+
410
+ CardDB currently sends `scan.job.completed` for successful terminal jobs and `scan.job.failed` for failed terminal jobs. Mobile clients and browser apps should still poll scan job status; webhooks are optional server-to-server callbacks.
411
+
412
+ ```ruby
413
+ valid = client.scans.verify_webhook_signature(
414
+ body: raw_request_body,
415
+ signature: request.get_header('HTTP_X_CARDDB_SIGNATURE'),
416
+ secret: ENV.fetch('CARDDB_SCAN_WEBHOOK_SECRET')
417
+ )
418
+
419
+ raise 'Invalid CardDB scan webhook signature' unless valid
420
+ ```
421
+
422
+ SDK unit tests mock GraphQL and storage boundaries. Backend scan resolver integration coverage lives in CardDB's Go test suite and should be used for end-to-end contract validation against a local API/database.
423
+
271
424
  Publisher import source modes:
272
425
 
273
426
  - Direct payload: use `records`, `data`, or `imports.run(input: { data: ... })` for small CI payloads and tests.
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'carddb'
5
+
6
+ client = CardDB::Client.new(secret_key: ENV.fetch('CARDDB_SECRET_KEY'))
7
+ publisher_id = ENV.fetch('CARDDB_PUBLISHER_ID')
8
+ publisher_slug = ENV.fetch('CARDDB_PUBLISHER_SLUG')
9
+ game_key = ENV.fetch('CARDDB_GAME_KEY')
10
+ dataset_key = ENV.fetch('CARDDB_DATASET_KEY', 'cards')
11
+ image_path = ENV.fetch('CARDDB_SCAN_IMAGE', 'scan.jpg')
12
+
13
+ scan_image = File.open(image_path, 'rb') do |file|
14
+ client.files.upload(
15
+ filename: File.basename(image_path),
16
+ content_type: 'image/jpeg',
17
+ body: file,
18
+ purpose: 'scan_image',
19
+ publisher_id: publisher_id
20
+ )
21
+ end
22
+
23
+ job = client.scans.create_job(
24
+ publisher_slug: publisher_slug,
25
+ game_key: game_key,
26
+ dataset_key: dataset_key,
27
+ file_id: scan_image.id,
28
+ client_request_id: "example-#{Time.now.to_i}",
29
+ client_ocr_hints: { language: 'en' }
30
+ ).job
31
+
32
+ completed = client.scans.poll_job(job.job_id, timeout: 60, interval: 1)
33
+ puts "Scan #{completed.job_id}: #{completed.status}"
34
+
35
+ if completed.best_match
36
+ puts "Best match: #{completed.best_match.record_id} (#{completed.best_match.confidence})"
37
+ client.scans.submit_feedback(
38
+ job_id: completed.job_id,
39
+ selected_record_id: completed.best_match.record_id,
40
+ correct: true
41
+ )
42
+ end
43
+
44
+ metrics = client.scans.metrics(
45
+ publisher_slug: publisher_slug,
46
+ game_key: game_key,
47
+ dataset_key: dataset_key
48
+ )
49
+ puts "Total scan jobs: #{metrics.total_jobs}"
data/lib/carddb/client.rb CHANGED
@@ -126,6 +126,20 @@ module CardDB
126
126
  @files ||= Resources::Files.new(self, connection, config)
127
127
  end
128
128
 
129
+ # Access the Scans resource
130
+ #
131
+ # @return [Resources::Scans]
132
+ def scans
133
+ @scans ||= Resources::Scans.new(self, connection, config)
134
+ end
135
+
136
+ # Access the Scan Templates resource
137
+ #
138
+ # @return [Resources::ScanTemplates]
139
+ def scan_templates
140
+ @scan_templates ||= Resources::ScanTemplates.new(self, connection, config)
141
+ end
142
+
129
143
  # Access the Decks resource
130
144
  #
131
145
  # @return [Resources::Decks]