carddb 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec_status +114 -79
- data/CHANGELOG.md +6 -0
- data/README.md +216 -2
- data/lib/carddb/client.rb +14 -1
- data/lib/carddb/collection.rb +506 -2
- data/lib/carddb/configuration.rb +27 -1
- data/lib/carddb/connection.rb +5 -2
- data/lib/carddb/query_builder.rb +974 -31
- data/lib/carddb/resources/decks.rb +432 -6
- data/lib/carddb/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 28e13db01ff91cbed41632eccb331c91785ad6698d39c0395950c61fd5781401
|
|
4
|
+
data.tar.gz: 2b3404e6970671ab7cb39c366d0de5431b12ea6ba1f3fa589f749ade0bd5271d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ed41cf28d05c2332eb3c97746a0261814d0cf06b32fa459775d7bc0f5afb6f2ff0d4c95aacf36ff3ecd049ec883bf1d3088c5cbefca7b23179e5a2bb80f8bfa5
|
|
7
|
+
data.tar.gz: e230a4465dd0f04ee06ebc8837dedb34aaaddbb61fd7bd49a5400ce018978a7662ba65c96a8afb2ac05f2a2cae63c002c87ec0147f477b3965570fb940056ea8
|
data/.rspec_status
CHANGED
|
@@ -1,50 +1,57 @@
|
|
|
1
1
|
example_id | status | run_time |
|
|
2
2
|
------------------------------------------------- | ------ | --------------- |
|
|
3
|
-
./spec/carddb/client_spec.rb[1:1:1] | passed | 0.
|
|
4
|
-
./spec/carddb/client_spec.rb[1:1:2] | passed | 0.
|
|
5
|
-
./spec/carddb/client_spec.rb[1:1:3] | passed | 0.
|
|
6
|
-
./spec/carddb/client_spec.rb[1:
|
|
7
|
-
./spec/carddb/client_spec.rb[1:2:
|
|
8
|
-
./spec/carddb/client_spec.rb[1:
|
|
3
|
+
./spec/carddb/client_spec.rb[1:1:1] | passed | 0.00024 seconds |
|
|
4
|
+
./spec/carddb/client_spec.rb[1:1:2] | passed | 0.00004 seconds |
|
|
5
|
+
./spec/carddb/client_spec.rb[1:1:3] | passed | 0.00004 seconds |
|
|
6
|
+
./spec/carddb/client_spec.rb[1:1:4] | 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.00017 seconds |
|
|
9
|
+
./spec/carddb/client_spec.rb[1:3:1] | passed | 0.00003 seconds |
|
|
9
10
|
./spec/carddb/client_spec.rb[1:4:1] | passed | 0.00003 seconds |
|
|
10
11
|
./spec/carddb/client_spec.rb[1:5:1] | passed | 0.00004 seconds |
|
|
11
12
|
./spec/carddb/client_spec.rb[1:6:1] | passed | 0.00003 seconds |
|
|
12
|
-
./spec/carddb/client_spec.rb[1:7:1] | passed | 0.
|
|
13
|
-
./spec/carddb/client_spec.rb[1:7:2] | passed | 0.
|
|
14
|
-
./spec/carddb/collection_spec.rb[1:1:1] | passed | 0.
|
|
15
|
-
./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.
|
|
16
|
-
./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.
|
|
17
|
-
./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.
|
|
18
|
-
./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.
|
|
19
|
-
./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.
|
|
20
|
-
./spec/carddb/collection_spec.rb[3:1:5] | passed | 0.
|
|
21
|
-
./spec/carddb/collection_spec.rb[4:1:1] | passed | 0.
|
|
22
|
-
./spec/carddb/collection_spec.rb[4:1:2] | passed | 0.
|
|
23
|
-
./spec/carddb/collection_spec.rb[4:1:3] | passed | 0.
|
|
13
|
+
./spec/carddb/client_spec.rb[1:7:1] | passed | 0.00025 seconds |
|
|
14
|
+
./spec/carddb/client_spec.rb[1:7:2] | passed | 0.00901 seconds |
|
|
15
|
+
./spec/carddb/collection_spec.rb[1:1:1] | passed | 0.00007 seconds |
|
|
16
|
+
./spec/carddb/collection_spec.rb[2:1:1] | passed | 0.00004 seconds |
|
|
17
|
+
./spec/carddb/collection_spec.rb[3:1:1] | passed | 0.00222 seconds |
|
|
18
|
+
./spec/carddb/collection_spec.rb[3:1:2] | passed | 0.00016 seconds |
|
|
19
|
+
./spec/carddb/collection_spec.rb[3:1:3] | passed | 0.00042 seconds |
|
|
20
|
+
./spec/carddb/collection_spec.rb[3:1:4] | passed | 0.0004 seconds |
|
|
21
|
+
./spec/carddb/collection_spec.rb[3:1:5] | passed | 0.00005 seconds |
|
|
22
|
+
./spec/carddb/collection_spec.rb[4:1:1] | passed | 0.00016 seconds |
|
|
23
|
+
./spec/carddb/collection_spec.rb[4:1:2] | passed | 0.00015 seconds |
|
|
24
|
+
./spec/carddb/collection_spec.rb[4:1:3] | passed | 0.00016 seconds |
|
|
24
25
|
./spec/carddb/collection_spec.rb[4:1:4] | passed | 0.00004 seconds |
|
|
25
|
-
./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.
|
|
26
|
+
./spec/carddb/configuration_spec.rb[1:1:1] | passed | 0.00004 seconds |
|
|
26
27
|
./spec/carddb/configuration_spec.rb[1:1:2] | passed | 0.00003 seconds |
|
|
27
|
-
./spec/carddb/configuration_spec.rb[1:1:3] | passed | 0.
|
|
28
|
-
./spec/carddb/configuration_spec.rb[1:1:4] | passed | 0.
|
|
29
|
-
./spec/carddb/configuration_spec.rb[1:1:5] | passed | 0.
|
|
28
|
+
./spec/carddb/configuration_spec.rb[1:1:3] | passed | 0.00004 seconds |
|
|
29
|
+
./spec/carddb/configuration_spec.rb[1:1:4] | passed | 0.00004 seconds |
|
|
30
|
+
./spec/carddb/configuration_spec.rb[1:1:5] | passed | 0.00003 seconds |
|
|
30
31
|
./spec/carddb/configuration_spec.rb[1:1:6] | passed | 0.00003 seconds |
|
|
31
|
-
./spec/carddb/configuration_spec.rb[1:2:1:1] | passed | 0.
|
|
32
|
-
./spec/carddb/configuration_spec.rb[1:2:2:1] | passed | 0.
|
|
32
|
+
./spec/carddb/configuration_spec.rb[1:2:1:1] | passed | 0.00005 seconds |
|
|
33
|
+
./spec/carddb/configuration_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
|
|
33
34
|
./spec/carddb/configuration_spec.rb[1:2:2:2] | passed | 0.00004 seconds |
|
|
34
|
-
./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.
|
|
35
|
+
./spec/carddb/configuration_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
|
|
35
36
|
./spec/carddb/configuration_spec.rb[1:3:2:1] | passed | 0.00003 seconds |
|
|
36
37
|
./spec/carddb/configuration_spec.rb[1:3:2:2] | passed | 0.00004 seconds |
|
|
37
38
|
./spec/carddb/configuration_spec.rb[1:3:2:3] | passed | 0.00003 seconds |
|
|
38
39
|
./spec/carddb/configuration_spec.rb[1:4:1] | passed | 0.00003 seconds |
|
|
39
|
-
./spec/carddb/configuration_spec.rb[1:4:2] | passed | 0.
|
|
40
|
-
./spec/carddb/configuration_spec.rb[1:5:1] | passed | 0.
|
|
41
|
-
./spec/carddb/
|
|
40
|
+
./spec/carddb/configuration_spec.rb[1:4:2] | passed | 0.00005 seconds |
|
|
41
|
+
./spec/carddb/configuration_spec.rb[1:5:1] | passed | 0.00003 seconds |
|
|
42
|
+
./spec/carddb/configuration_spec.rb[1:6:1] | passed | 0.00003 seconds |
|
|
43
|
+
./spec/carddb/configuration_spec.rb[1:6:2] | passed | 0.00003 seconds |
|
|
44
|
+
./spec/carddb/configuration_spec.rb[1:6:3] | passed | 0.00003 seconds |
|
|
45
|
+
./spec/carddb/configuration_spec.rb[1:7:1] | passed | 0.00004 seconds |
|
|
46
|
+
./spec/carddb/configuration_spec.rb[1:7:2] | passed | 0.00004 seconds |
|
|
47
|
+
./spec/carddb/configuration_spec.rb[1:7:3] | passed | 0.00004 seconds |
|
|
48
|
+
./spec/carddb/filter_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
|
|
42
49
|
./spec/carddb/filter_builder_spec.rb[1:1:2] | passed | 0.00003 seconds |
|
|
43
|
-
./spec/carddb/filter_builder_spec.rb[1:1:3] | passed | 0.
|
|
44
|
-
./spec/carddb/filter_builder_spec.rb[1:1:4] | passed | 0.
|
|
50
|
+
./spec/carddb/filter_builder_spec.rb[1:1:3] | passed | 0.00003 seconds |
|
|
51
|
+
./spec/carddb/filter_builder_spec.rb[1:1:4] | passed | 0.00003 seconds |
|
|
45
52
|
./spec/carddb/filter_builder_spec.rb[1:1:5] | passed | 0.00003 seconds |
|
|
46
53
|
./spec/carddb/filter_builder_spec.rb[1:1:6] | passed | 0.00003 seconds |
|
|
47
|
-
./spec/carddb/filter_builder_spec.rb[1:1:7] | passed | 0.
|
|
54
|
+
./spec/carddb/filter_builder_spec.rb[1:1:7] | passed | 0.00004 seconds |
|
|
48
55
|
./spec/carddb/filter_builder_spec.rb[1:1:8] | passed | 0.00003 seconds |
|
|
49
56
|
./spec/carddb/filter_builder_spec.rb[1:2:1] | passed | 0.00003 seconds |
|
|
50
57
|
./spec/carddb/filter_builder_spec.rb[1:2:2] | passed | 0.00003 seconds |
|
|
@@ -52,65 +59,93 @@ example_id | status | run_time |
|
|
|
52
59
|
./spec/carddb/filter_builder_spec.rb[1:2:4] | passed | 0.00003 seconds |
|
|
53
60
|
./spec/carddb/filter_builder_spec.rb[1:2:5] | passed | 0.00003 seconds |
|
|
54
61
|
./spec/carddb/filter_builder_spec.rb[1:2:6] | passed | 0.00002 seconds |
|
|
55
|
-
./spec/carddb/filter_builder_spec.rb[1:2:7] | passed | 0.
|
|
56
|
-
./spec/carddb/filter_builder_spec.rb[1:2:8] | passed | 0.
|
|
57
|
-
./spec/carddb/filter_builder_spec.rb[1:2:9] | passed | 0.
|
|
62
|
+
./spec/carddb/filter_builder_spec.rb[1:2:7] | passed | 0.00003 seconds |
|
|
63
|
+
./spec/carddb/filter_builder_spec.rb[1:2:8] | passed | 0.00003 seconds |
|
|
64
|
+
./spec/carddb/filter_builder_spec.rb[1:2:9] | passed | 0.00004 seconds |
|
|
58
65
|
./spec/carddb/filter_builder_spec.rb[1:2:10] | passed | 0.00003 seconds |
|
|
59
66
|
./spec/carddb/filter_builder_spec.rb[1:2:11] | passed | 0.00003 seconds |
|
|
60
|
-
./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.
|
|
67
|
+
./spec/carddb/filter_builder_spec.rb[1:2:12] | passed | 0.00003 seconds |
|
|
61
68
|
./spec/carddb/filter_builder_spec.rb[1:2:13] | passed | 0.00004 seconds |
|
|
62
69
|
./spec/carddb/query_builder_spec.rb[1:1:1] | passed | 0.00004 seconds |
|
|
63
70
|
./spec/carddb/query_builder_spec.rb[1:1:2] | passed | 0.00004 seconds |
|
|
64
|
-
./spec/carddb/query_builder_spec.rb[1:1:3] | passed | 0.
|
|
65
|
-
./spec/carddb/query_builder_spec.rb[1:2:1:1] | passed | 0.
|
|
71
|
+
./spec/carddb/query_builder_spec.rb[1:1:3] | passed | 0.00064 seconds |
|
|
72
|
+
./spec/carddb/query_builder_spec.rb[1:2:1:1] | passed | 0.00006 seconds |
|
|
66
73
|
./spec/carddb/query_builder_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
|
|
67
|
-
./spec/carddb/
|
|
68
|
-
./spec/carddb/
|
|
69
|
-
./spec/carddb/
|
|
70
|
-
./spec/carddb/
|
|
71
|
-
./spec/carddb/
|
|
72
|
-
./spec/carddb/
|
|
73
|
-
./spec/carddb/
|
|
74
|
-
./spec/carddb/
|
|
75
|
-
./spec/carddb/
|
|
76
|
-
./spec/carddb/
|
|
77
|
-
./spec/carddb/
|
|
78
|
-
./spec/carddb/resources/
|
|
79
|
-
./spec/carddb/resources/
|
|
80
|
-
./spec/carddb/resources/
|
|
81
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
82
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
83
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
84
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
85
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
86
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
87
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
88
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
89
|
-
./spec/carddb/resources/decks_spec.rb[1:
|
|
90
|
-
./spec/carddb/resources/
|
|
91
|
-
./spec/carddb/resources/
|
|
92
|
-
./spec/carddb/resources/
|
|
93
|
-
./spec/carddb/resources/
|
|
94
|
-
./spec/carddb/resources/
|
|
95
|
-
./spec/carddb/resources/
|
|
96
|
-
./spec/carddb/resources/
|
|
97
|
-
./spec/carddb/resources/
|
|
98
|
-
./spec/carddb/resources/
|
|
74
|
+
./spec/carddb/query_builder_spec.rb[1:3:1] | passed | 0.00005 seconds |
|
|
75
|
+
./spec/carddb/query_builder_spec.rb[1:3:2] | passed | 0.00004 seconds |
|
|
76
|
+
./spec/carddb/query_builder_spec.rb[1:4:1] | passed | 0.00004 seconds |
|
|
77
|
+
./spec/carddb/query_builder_spec.rb[1:4:2] | passed | 0.00004 seconds |
|
|
78
|
+
./spec/carddb/query_builder_spec.rb[1:5:1] | passed | 0.00003 seconds |
|
|
79
|
+
./spec/carddb/query_builder_spec.rb[1:5:2] | passed | 0.00004 seconds |
|
|
80
|
+
./spec/carddb/query_builder_spec.rb[1:5:3] | passed | 0.00006 seconds |
|
|
81
|
+
./spec/carddb/query_builder_spec.rb[1:5:4] | passed | 0.00004 seconds |
|
|
82
|
+
./spec/carddb/query_builder_spec.rb[1:5:5] | passed | 0.00007 seconds |
|
|
83
|
+
./spec/carddb/query_builder_spec.rb[1:5:6] | passed | 0.00004 seconds |
|
|
84
|
+
./spec/carddb/query_builder_spec.rb[1:5:7] | passed | 0.00004 seconds |
|
|
85
|
+
./spec/carddb/resources/datasets_spec.rb[1:1:1] | passed | 0.00434 seconds |
|
|
86
|
+
./spec/carddb/resources/datasets_spec.rb[1:1:2] | passed | 0.0044 seconds |
|
|
87
|
+
./spec/carddb/resources/datasets_spec.rb[1:2:1] | passed | 0.00411 seconds |
|
|
88
|
+
./spec/carddb/resources/decks_spec.rb[1:1:1] | passed | 0.00433 seconds |
|
|
89
|
+
./spec/carddb/resources/decks_spec.rb[1:1:2] | passed | 0.00429 seconds |
|
|
90
|
+
./spec/carddb/resources/decks_spec.rb[1:1:3] | passed | 0.00406 seconds |
|
|
91
|
+
./spec/carddb/resources/decks_spec.rb[1:1:4] | passed | 0.00423 seconds |
|
|
92
|
+
./spec/carddb/resources/decks_spec.rb[1:2:1] | passed | 0.0045 seconds |
|
|
93
|
+
./spec/carddb/resources/decks_spec.rb[1:2:2] | passed | 0.0082 seconds |
|
|
94
|
+
./spec/carddb/resources/decks_spec.rb[1:2:3] | passed | 0.00007 seconds |
|
|
95
|
+
./spec/carddb/resources/decks_spec.rb[1:3:1] | passed | 0.00416 seconds |
|
|
96
|
+
./spec/carddb/resources/decks_spec.rb[1:4:1] | passed | 0.00417 seconds |
|
|
97
|
+
./spec/carddb/resources/decks_spec.rb[1:5:1] | passed | 0.00397 seconds |
|
|
98
|
+
./spec/carddb/resources/decks_spec.rb[1:6:1] | passed | 0.004 seconds |
|
|
99
|
+
./spec/carddb/resources/decks_spec.rb[1:7:1] | passed | 0.00399 seconds |
|
|
100
|
+
./spec/carddb/resources/decks_spec.rb[1:8:1] | passed | 0.00412 seconds |
|
|
101
|
+
./spec/carddb/resources/decks_spec.rb[1:9:1] | passed | 0.00416 seconds |
|
|
102
|
+
./spec/carddb/resources/decks_spec.rb[1:10:1] | passed | 0.00424 seconds |
|
|
103
|
+
./spec/carddb/resources/decks_spec.rb[1:11:1] | passed | 0.00415 seconds |
|
|
104
|
+
./spec/carddb/resources/decks_spec.rb[1:11:2] | passed | 0.00402 seconds |
|
|
105
|
+
./spec/carddb/resources/decks_spec.rb[1:11:3] | passed | 0.0082 seconds |
|
|
106
|
+
./spec/carddb/resources/decks_spec.rb[1:11:4] | passed | 0.00452 seconds |
|
|
107
|
+
./spec/carddb/resources/decks_spec.rb[1:12:1] | passed | 0.00408 seconds |
|
|
108
|
+
./spec/carddb/resources/decks_spec.rb[1:13:1] | passed | 0.00396 seconds |
|
|
109
|
+
./spec/carddb/resources/decks_spec.rb[1:14:1] | passed | 0.00432 seconds |
|
|
110
|
+
./spec/carddb/resources/decks_spec.rb[1:14:2] | passed | 0.00454 seconds |
|
|
111
|
+
./spec/carddb/resources/decks_spec.rb[1:14:3] | passed | 0.00404 seconds |
|
|
112
|
+
./spec/carddb/resources/decks_spec.rb[1:15:1] | passed | 0.0042 seconds |
|
|
113
|
+
./spec/carddb/resources/decks_spec.rb[1:16:1] | passed | 0.00418 seconds |
|
|
114
|
+
./spec/carddb/resources/decks_spec.rb[1:17:1] | passed | 0.00442 seconds |
|
|
115
|
+
./spec/carddb/resources/decks_spec.rb[1:17:2] | passed | 0.00463 seconds |
|
|
116
|
+
./spec/carddb/resources/decks_spec.rb[1:17:3] | passed | 0.00502 seconds |
|
|
117
|
+
./spec/carddb/resources/decks_spec.rb[1:18:1] | passed | 0.00582 seconds |
|
|
118
|
+
./spec/carddb/resources/decks_spec.rb[1:19:1] | passed | 0.00495 seconds |
|
|
119
|
+
./spec/carddb/resources/decks_spec.rb[1:20:1] | passed | 0.00392 seconds |
|
|
120
|
+
./spec/carddb/resources/decks_spec.rb[1:21:1] | passed | 0.00396 seconds |
|
|
121
|
+
./spec/carddb/resources/decks_spec.rb[1:22:1] | passed | 0.00508 seconds |
|
|
122
|
+
./spec/carddb/resources/decks_spec.rb[1:23:1] | passed | 0.00391 seconds |
|
|
123
|
+
./spec/carddb/resources/decks_spec.rb[1:24:1] | passed | 0.0042 seconds |
|
|
124
|
+
./spec/carddb/resources/decks_spec.rb[1:25:1] | passed | 0.00405 seconds |
|
|
125
|
+
./spec/carddb/resources/games_spec.rb[1:1:1] | passed | 0.0041 seconds |
|
|
126
|
+
./spec/carddb/resources/games_spec.rb[1:1:2] | passed | 0.00007 seconds |
|
|
127
|
+
./spec/carddb/resources/games_spec.rb[1:2:1] | passed | 0.00376 seconds |
|
|
128
|
+
./spec/carddb/resources/games_spec.rb[1:2:2] | passed | 0.00465 seconds |
|
|
129
|
+
./spec/carddb/resources/publishers_spec.rb[1:1:1] | passed | 0.00394 seconds |
|
|
130
|
+
./spec/carddb/resources/publishers_spec.rb[1:2:1] | passed | 0.00392 seconds |
|
|
131
|
+
./spec/carddb/resources/records_spec.rb[1:1:1] | passed | 0.00399 seconds |
|
|
132
|
+
./spec/carddb/resources/records_spec.rb[1:1:2] | passed | 0.00394 seconds |
|
|
133
|
+
./spec/carddb/resources/records_spec.rb[1:1:3] | passed | 0.00011 seconds |
|
|
99
134
|
./spec/carddb/resources/records_spec.rb[1:1:4] | passed | 0.00004 seconds |
|
|
100
|
-
./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.
|
|
101
|
-
./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.
|
|
102
|
-
./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.
|
|
103
|
-
./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.
|
|
135
|
+
./spec/carddb/resources/records_spec.rb[1:2:1] | passed | 0.00391 seconds |
|
|
136
|
+
./spec/carddb/resources/records_spec.rb[1:2:2] | passed | 0.00395 seconds |
|
|
137
|
+
./spec/carddb/resources/records_spec.rb[1:2:3] | passed | 0.0039 seconds |
|
|
138
|
+
./spec/carddb/resources/records_spec.rb[1:3:1] | passed | 0.00387 seconds |
|
|
104
139
|
./spec/carddb/resources/records_spec.rb[1:3:2] | passed | 0.00011 seconds |
|
|
105
|
-
./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.
|
|
140
|
+
./spec/carddb/resources/records_spec.rb[1:4:1] | passed | 0.00412 seconds |
|
|
106
141
|
./spec/carddb/resources/records_spec.rb[1:4:2] | passed | 0.00005 seconds |
|
|
107
142
|
./spec/carddb/resources/records_spec.rb[1:4:3] | passed | 0.00009 seconds |
|
|
108
|
-
./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.
|
|
109
|
-
./spec/carddb/resources/rules_spec.rb[1:2:1] | passed | 0.
|
|
110
|
-
./spec/carddb_spec.rb[1:1] | passed | 0.
|
|
111
|
-
./spec/carddb_spec.rb[1:2:1] | passed | 0.
|
|
143
|
+
./spec/carddb/resources/rules_spec.rb[1:1:1] | passed | 0.004 seconds |
|
|
144
|
+
./spec/carddb/resources/rules_spec.rb[1:2:1] | passed | 0.00388 seconds |
|
|
145
|
+
./spec/carddb_spec.rb[1:1] | passed | 0.00004 seconds |
|
|
146
|
+
./spec/carddb_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
|
112
147
|
./spec/carddb_spec.rb[1:3:1] | passed | 0.00003 seconds |
|
|
113
148
|
./spec/carddb_spec.rb[1:4:1] | passed | 0.00004 seconds |
|
|
114
149
|
./spec/carddb_spec.rb[1:5:1] | passed | 0.00003 seconds |
|
|
115
150
|
./spec/carddb_spec.rb[1:6:1] | passed | 0.00003 seconds |
|
|
116
|
-
./spec/carddb_spec.rb[1:7:1] | passed | 0.
|
|
151
|
+
./spec/carddb_spec.rb[1:7:1] | passed | 0.00004 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
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Deck import payloads now expose configured import format metadata and auto-detection details.
|
|
13
|
+
- Documentation now covers configured deck imports and `BAN` / `RESTRICTION` deck validation issue metadata.
|
|
14
|
+
- 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.
|
|
15
|
+
|
|
10
16
|
## [0.2.1] - 2026-05-01
|
|
11
17
|
|
|
12
18
|
### Fixed
|
data/README.md
CHANGED
|
@@ -50,7 +50,10 @@ records.each { |record| puts record.name }
|
|
|
50
50
|
```ruby
|
|
51
51
|
CardDB.configure do |config|
|
|
52
52
|
# Authentication (optional but recommended)
|
|
53
|
-
config.
|
|
53
|
+
config.publishable_key = "carddb_pk_public_key" # Public/read-oriented credential
|
|
54
|
+
config.secret_key = "carddb_sk_your_secret_key" # Server-side trusted workflows
|
|
55
|
+
config.access_token = "carddb_oat_user_token" # OAuth user-authorized requests
|
|
56
|
+
config.api_key = "carddb_legacy_key" # Legacy low-level API key
|
|
54
57
|
|
|
55
58
|
# Endpoint (defaults to production)
|
|
56
59
|
config.endpoint = "https://carddb.xtda.org/query"
|
|
@@ -87,7 +90,7 @@ end
|
|
|
87
90
|
|
|
88
91
|
```ruby
|
|
89
92
|
client = CardDB::Client.new(
|
|
90
|
-
|
|
93
|
+
secret_key: "carddb_sk_different_key",
|
|
91
94
|
default_publisher: "wizards",
|
|
92
95
|
default_game: "magic-the-gathering"
|
|
93
96
|
)
|
|
@@ -95,6 +98,13 @@ client = CardDB::Client.new(
|
|
|
95
98
|
records = client.records.search(dataset_key: "cards")
|
|
96
99
|
```
|
|
97
100
|
|
|
101
|
+
Credential guidance:
|
|
102
|
+
|
|
103
|
+
- Use `publishable_key` for public reads and OAuth setup flows.
|
|
104
|
+
- Use `access_token` for user-authorized deck workflows.
|
|
105
|
+
- Use `secret_key` only in trusted server runtimes for app-owned deck sync and token exchange.
|
|
106
|
+
- Secret-only helpers fail before making a request if `access_token` or `publishable_key` would be sent instead of a secret credential.
|
|
107
|
+
|
|
98
108
|
## Usage
|
|
99
109
|
|
|
100
110
|
### Publishers
|
|
@@ -207,6 +217,210 @@ rules = CardDB.rules.list(
|
|
|
207
217
|
)
|
|
208
218
|
```
|
|
209
219
|
|
|
220
|
+
### Hosted Decks
|
|
221
|
+
|
|
222
|
+
```ruby
|
|
223
|
+
# OAuth/user-owned or server-owned list and lookup helpers
|
|
224
|
+
decks = CardDB.decks.list_mine(include_archived: false)
|
|
225
|
+
public_decks = CardDB.decks.list_public(filter: { discoverability: "LISTED" })
|
|
226
|
+
deck = CardDB.decks.fetch_mine(decks.first.id)
|
|
227
|
+
|
|
228
|
+
# Metadata updates are separate from entry mutations
|
|
229
|
+
updated = CardDB.decks.update_metadata(
|
|
230
|
+
id: deck.id,
|
|
231
|
+
input: {
|
|
232
|
+
expectedDraftRevision: deck.draft_revision,
|
|
233
|
+
title: "Updated title"
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
entry_payload = CardDB.decks.add_entry(
|
|
238
|
+
input: {
|
|
239
|
+
deckId: updated.id,
|
|
240
|
+
expectedDraftRevision: updated.draft_revision,
|
|
241
|
+
datasetKey: "cards",
|
|
242
|
+
identifier: "CARD-001",
|
|
243
|
+
quantity: 4
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
validation = CardDB.decks.validate(id: updated.id)
|
|
248
|
+
publish = CardDB.decks.publish(
|
|
249
|
+
id: updated.id,
|
|
250
|
+
input: { expectedDraftRevision: entry_payload.deck.draft_revision }
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
puts publish.blockers.map(&:message) unless publish.blockers.empty?
|
|
254
|
+
puts CardDB.decks.export_deck(id: updated.id).text
|
|
255
|
+
|
|
256
|
+
# Import with publisher-configured format auto-detection
|
|
257
|
+
imported = CardDB.decks.import_deck(
|
|
258
|
+
input: {
|
|
259
|
+
deckId: updated.id,
|
|
260
|
+
text: "1 Iron Leaves ex TEF 25",
|
|
261
|
+
autoDetect: true,
|
|
262
|
+
dryRun: true
|
|
263
|
+
}
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
puts "Detected #{imported.detection.name} (#{imported.detection.confidence})"
|
|
267
|
+
|
|
268
|
+
# Or force one configured import format by key/id
|
|
269
|
+
CardDB.decks.import_deck(
|
|
270
|
+
input: {
|
|
271
|
+
deckId: updated.id,
|
|
272
|
+
format: "CONFIGURED",
|
|
273
|
+
importFormatKey: "pokemon-live",
|
|
274
|
+
text: "1 Iron Leaves ex TEF 25"
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Section definitions come from the deck ruleset and are available on `deck.section_definitions`,
|
|
280
|
+
`version.section_definitions`, or through `CardDB.decks.section_definitions(...)`. Use `key`,
|
|
281
|
+
`default?`, `min_cards`, `max_cards`, and `excluded_from_deck_size?` to render sections and
|
|
282
|
+
preflight deck builders before calling `validate` or `publish`.
|
|
283
|
+
|
|
284
|
+
Entry annotations are JSON with CardDB common keys and app-owned namespaces:
|
|
285
|
+
|
|
286
|
+
```ruby
|
|
287
|
+
CardDB.decks.add_entry(
|
|
288
|
+
input: {
|
|
289
|
+
deckId: deck.id,
|
|
290
|
+
expectedDraftRevision: deck.draft_revision,
|
|
291
|
+
datasetKey: "cards",
|
|
292
|
+
identifier: "CARD-001",
|
|
293
|
+
quantity: 1,
|
|
294
|
+
annotations: {
|
|
295
|
+
common: {
|
|
296
|
+
notes: "Flex slot",
|
|
297
|
+
featuredVisible: true,
|
|
298
|
+
previewVisible: false
|
|
299
|
+
},
|
|
300
|
+
apps: {
|
|
301
|
+
api_application_id => { sideboardPlan: "control" }
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Publisher/admin import-format management:
|
|
309
|
+
|
|
310
|
+
```ruby
|
|
311
|
+
formats = CardDB.decks.import_formats(game_id: "game_uuid", include_archived: false)
|
|
312
|
+
test = CardDB.decks.test_import_format(
|
|
313
|
+
input: {
|
|
314
|
+
gameId: "game_uuid",
|
|
315
|
+
formatKey: "pokemon-live",
|
|
316
|
+
text: "1 Iron Leaves ex TEF 25"
|
|
317
|
+
}
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
created_format = CardDB.decks.create_import_format(
|
|
321
|
+
input: {
|
|
322
|
+
gameId: "game_uuid",
|
|
323
|
+
key: "pokemon-live",
|
|
324
|
+
name: "Pokemon TCG Live",
|
|
325
|
+
config: { schemaVersion: 1 }
|
|
326
|
+
}
|
|
327
|
+
)
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
OAuth selected-deck and ownership flows:
|
|
331
|
+
|
|
332
|
+
```ruby
|
|
333
|
+
CardDB.decks.claim(id: deck.id, input: { expectedDraftRevision: deck.draft_revision, appAccess: "RETAIN" })
|
|
334
|
+
CardDB.decks.transfer_ownership(
|
|
335
|
+
id: deck.id,
|
|
336
|
+
input: {
|
|
337
|
+
targetAccountId: "account_uuid",
|
|
338
|
+
expectedDraftRevision: deck.draft_revision,
|
|
339
|
+
appAccess: "REVOKE"
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
copy = CardDB.decks.copy(
|
|
343
|
+
id: deck.id,
|
|
344
|
+
input: { title: "Testing copy", expectedDraftRevision: deck.draft_revision, appAccess: "RETAIN" }
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
CardDB.decks.grant_api_application_access(
|
|
348
|
+
input: { deckId: copy.deck.id, apiApplicationId: "app_uuid", role: "VIEWER" }
|
|
349
|
+
)
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Deck validation issues may include rule-specific codes such as `BAN` and `RESTRICTION`.
|
|
353
|
+
Those issues expose metadata such as rule key, matched value, limit, quantity, and field path when available.
|
|
354
|
+
|
|
355
|
+
Example ruleset JSON fragments for publisher/admin workflows:
|
|
356
|
+
|
|
357
|
+
```ruby
|
|
358
|
+
rules = {
|
|
359
|
+
schemaVersion: 1,
|
|
360
|
+
sections: [{ key: "main", label: "Main Deck", default: true }],
|
|
361
|
+
deckSize: { min: 60, max: 60 },
|
|
362
|
+
bans: [
|
|
363
|
+
{
|
|
364
|
+
key: "no-banned-cards",
|
|
365
|
+
label: "Banned cards",
|
|
366
|
+
identifiers: ["CARD-001"],
|
|
367
|
+
severity: "BLOCKER"
|
|
368
|
+
}
|
|
369
|
+
],
|
|
370
|
+
restrictions: [
|
|
371
|
+
{
|
|
372
|
+
key: "one-copy-limit",
|
|
373
|
+
label: "Restricted cards",
|
|
374
|
+
identifiers: ["CARD-002"],
|
|
375
|
+
limit: 1,
|
|
376
|
+
severity: "BLOCKER"
|
|
377
|
+
}
|
|
378
|
+
]
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Server-side app-owned and trusted token workflow:
|
|
383
|
+
|
|
384
|
+
```ruby
|
|
385
|
+
client = CardDB::Client.new(secret_key: ENV.fetch("CARDDB_SECRET_KEY"))
|
|
386
|
+
|
|
387
|
+
upsert = client.decks.upsert_by_external_ref(
|
|
388
|
+
input: {
|
|
389
|
+
externalRef: "metafy:deck:123",
|
|
390
|
+
publisherSlug: "pokemon-company",
|
|
391
|
+
gameKey: "pokemon-tcg",
|
|
392
|
+
title: "Course Deck",
|
|
393
|
+
accessMode: "AUTHORIZED_TOKEN",
|
|
394
|
+
discoverability: "UNLISTED",
|
|
395
|
+
entries: []
|
|
396
|
+
}
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
access = client.decks.exchange_access_token(
|
|
400
|
+
input: {
|
|
401
|
+
deckId: upsert.deck.id,
|
|
402
|
+
readMode: "FULL",
|
|
403
|
+
externalSubject: "user_123"
|
|
404
|
+
}
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
deck = client.decks.access(token: access.token)
|
|
408
|
+
|
|
409
|
+
# Account sessions can also create trusted issuers for a selected API app.
|
|
410
|
+
client.decks.create_access_token_issuer(
|
|
411
|
+
input: {
|
|
412
|
+
deckId: upsert.deck.id,
|
|
413
|
+
apiApplicationId: "app_uuid",
|
|
414
|
+
readModes: ["FULL"],
|
|
415
|
+
directSigningKey: {
|
|
416
|
+
algorithm: "ED25519",
|
|
417
|
+
keyId: "prod-2026-01",
|
|
418
|
+
publicKey: "base64_raw_ed25519_public_key"
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
)
|
|
422
|
+
```
|
|
423
|
+
|
|
210
424
|
### Records
|
|
211
425
|
|
|
212
426
|
```ruby
|
data/lib/carddb/client.rb
CHANGED
|
@@ -24,6 +24,9 @@ module CardDB
|
|
|
24
24
|
# Create a new CardDB client.
|
|
25
25
|
#
|
|
26
26
|
# @param api_key [String, nil] API key for authentication
|
|
27
|
+
# @param publishable_key [String, nil] Browser-safe publishable API key
|
|
28
|
+
# @param secret_key [String, nil] Server-side secret API key for trusted workflows
|
|
29
|
+
# @param access_token [String, nil] OAuth bearer token for user-authorized requests
|
|
27
30
|
# @param endpoint [String, nil] API endpoint URL
|
|
28
31
|
# @param timeout [Integer, nil] Request timeout in seconds
|
|
29
32
|
# @param open_timeout [Integer, nil] Connection timeout in seconds
|
|
@@ -32,8 +35,13 @@ module CardDB
|
|
|
32
35
|
# @param allowed_publishers [Array<String>, nil] Allowed publisher slugs
|
|
33
36
|
# @param allowed_games [Hash<String, Array<String>>, nil] Allowed games per publisher
|
|
34
37
|
# @param config [Configuration, nil] Configuration object (overrides other params)
|
|
38
|
+
# rubocop:disable Metrics/ParameterLists
|
|
35
39
|
def initialize(
|
|
36
40
|
api_key: nil,
|
|
41
|
+
publishable_key: nil,
|
|
42
|
+
secret_key: nil,
|
|
43
|
+
access_token: nil,
|
|
44
|
+
environment: nil,
|
|
37
45
|
endpoint: nil,
|
|
38
46
|
timeout: nil,
|
|
39
47
|
open_timeout: nil,
|
|
@@ -46,6 +54,10 @@ module CardDB
|
|
|
46
54
|
@config = build_config(
|
|
47
55
|
config: config,
|
|
48
56
|
api_key: api_key,
|
|
57
|
+
publishable_key: publishable_key,
|
|
58
|
+
secret_key: secret_key,
|
|
59
|
+
access_token: access_token,
|
|
60
|
+
environment: environment,
|
|
49
61
|
endpoint: endpoint,
|
|
50
62
|
timeout: timeout,
|
|
51
63
|
open_timeout: open_timeout,
|
|
@@ -56,6 +68,7 @@ module CardDB
|
|
|
56
68
|
)
|
|
57
69
|
@connection = Connection.new(@config)
|
|
58
70
|
end
|
|
71
|
+
# rubocop:enable Metrics/ParameterLists
|
|
59
72
|
|
|
60
73
|
# Access the Publishers resource
|
|
61
74
|
#
|
|
@@ -103,7 +116,7 @@ module CardDB
|
|
|
103
116
|
#
|
|
104
117
|
# @return [Hash, nil] API key info or nil if no API key
|
|
105
118
|
def me
|
|
106
|
-
return nil unless config.
|
|
119
|
+
return nil unless config.effective_api_key || config.access_token
|
|
107
120
|
|
|
108
121
|
query = QueryBuilder.fetch_me
|
|
109
122
|
data = connection.execute(query, {})
|