Skip to content

Commit fc20c1a

Browse files
committed
WIP labels and selectors
1 parent 7425df6 commit fc20c1a

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed

aws_doc_sdk_examples_tools/labels/__init__.py

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
LANGUAGE = "Language"
2+
VERSION = "Version"
3+
SDK = "SDK"
4+
SERVICE = "Service"
5+
ACTION = "Action"
6+
CATEGORY = "Category"
7+
BUNDLE = "Bundle"
8+
CAVEAT = "Caveat"
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from collections import defaultdict
2+
from dataclasses import dataclass, field
3+
from typing import Iterable, Iterator, List, Optional
4+
5+
6+
from . import known_labels
7+
8+
9+
@dataclass(frozen=True)
10+
class Label:
11+
name: str
12+
value: str
13+
14+
15+
class LabelSet(defaultdict):
16+
def __init__(self, labels: Iterable[Label]):
17+
super(LabelSet, self).__init__(list)
18+
for label in labels:
19+
self[label.name].append(label.value)
20+
21+
def covers(self, other: "LabelSet") -> bool:
22+
"""covered means all other must be present in this item's Labels, and all values must match exactly."""
23+
try:
24+
for name, value in other.items():
25+
v = self[name]
26+
assert v == value
27+
return True
28+
except AssertionError as _e:
29+
print(_e)
30+
return False
31+
# return all(self[k] == v for k, v in other.items())
32+
33+
def __iter__(self) -> Iterator[Label]:
34+
for k, vs in self.items():
35+
for v in vs:
36+
yield Label(name=k, value=v)
37+
38+
39+
@dataclass
40+
class Labeled:
41+
labels: Iterable[Label] = field(default_factory=list)
42+
_label_set: LabelSet = field(init=False)
43+
44+
def __post_init__(self):
45+
self._label_set = LabelSet(self.labels)
46+
47+
def covers(self, other: "Labeled"):
48+
return self._label_set.covers(other._label_set)
49+
50+
51+
@dataclass
52+
class Snippet(Labeled):
53+
id: str = ""
54+
55+
def __eq__(self, other):
56+
return self.id == other.id
57+
58+
def __hash__(self):
59+
return hash((self.id))
60+
61+
62+
@dataclass
63+
class Sdk(Labeled):
64+
language: str = ""
65+
version: str = ""
66+
67+
def __post_init__(self):
68+
self.labels = [Label(name=known_labels.SDK, value=f"{self.language}:{self.version}")]
69+
self._label_set = LabelSet(self.labels)
70+
71+
def __eq__(self, other):
72+
return self.language == other.language and self.version == other.version
73+
74+
def __hash__(self):
75+
return hash((self.language, self.version))
76+
77+
78+
@dataclass
79+
class Service(Labeled):
80+
name: str = ""
81+
long: str = ""
82+
short: str = ""
83+
sort: str = ""
84+
version: str = ""
85+
# expanded: Optional[ServiceExpanded] = None
86+
api_ref: Optional[str] = None
87+
blurb: Optional[str] = None
88+
# guide: Optional[ServiceGuide] = None
89+
90+
def __eq__(self, other):
91+
return self.name == other.name
92+
93+
def __hash__(self):
94+
return hash((self.name))
95+
96+
97+
@dataclass
98+
class Example(Labeled):
99+
id: str = ""
100+
title: Optional[str] = ""
101+
title_abbrev: Optional[str] = ""
102+
synopsis: Optional[str] = ""
103+
category: Optional[str] = None
104+
# guide_topic: Optional[Url] = None
105+
# doc_filenames: Optional[DocFilenames] = None
106+
synopsis_list: List[str] = field(default_factory=list)
107+
108+
def __eq__(self, other):
109+
return self.id == other.id
110+
111+
def __hash__(self):
112+
return hash((self.id))
113+
114+
115+
def select(items: Iterable[Labeled], for_labels_in: Labeled):
116+
return_set = set()
117+
for item in items:
118+
if item.covers(for_labels_in):
119+
return_set.add(item)
120+
return frozenset(return_set)
121+
# return frozenset(item for item in items if item.covers(for_labels_in))
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from .labels import Example, Label, LabelSet, Sdk, Service, Snippet, select
2+
from . import known_labels
3+
4+
5+
def test_LabelSet_init():
6+
label_set = LabelSet([Label(name="a", value="1"), Label(name="b", value="2"), Label(name="a", value="11")])
7+
assert label_set['a'] == ["1", "11"]
8+
assert label_set['b'] == ["2"]
9+
10+
11+
def test_LabelSet_iter():
12+
label_set = LabelSet([Label(name="a", value="1"), Label(name="b", value="2"), Label(name="a", value="11")])
13+
labels = [*label_set]
14+
assert labels == [Label(name="a", value="1"), Label(name="a", value="11"), Label(name="b", value="2")]
15+
16+
17+
def test_LabelSet_cover():
18+
ls_snippet = LabelSet([Label(name="sdk", value="rust:1"), Label(name="service", value="ec2"), Label(name="action", value="DescribeInstance")])
19+
ls_sdk_rust = LabelSet([Label(name="sdk", value="rust:1")])
20+
ls_sdk_java = LabelSet([Label(name="sdk", value="java:2")])
21+
ls_example_describeinstance = LabelSet([Label(name="service", value="ec2"), Label(name="action", value="DescribeInstance")])
22+
23+
assert ls_snippet.covers(ls_snippet) is True
24+
assert ls_snippet.covers(ls_sdk_rust) is True
25+
assert ls_snippet.covers(ls_sdk_java) is False
26+
assert ls_snippet.covers(ls_example_describeinstance) is True
27+
28+
assert ls_sdk_rust.covers(ls_snippet) is False
29+
assert ls_sdk_rust.covers(ls_sdk_rust) is True
30+
assert ls_sdk_rust.covers(ls_sdk_java) is False
31+
assert ls_sdk_rust.covers(ls_example_describeinstance) is False
32+
33+
assert ls_sdk_java.covers(ls_snippet) is False
34+
assert ls_sdk_java.covers(ls_sdk_rust) is False
35+
assert ls_sdk_java.covers(ls_sdk_java) is True
36+
assert ls_sdk_java.covers(ls_example_describeinstance) is False
37+
38+
assert ls_example_describeinstance.covers(ls_snippet) is False
39+
assert ls_example_describeinstance.covers(ls_sdk_rust) is False
40+
assert ls_example_describeinstance.covers(ls_sdk_java) is False
41+
assert ls_example_describeinstance.covers(ls_example_describeinstance) is True
42+
43+
44+
def test_select():
45+
snippets = [
46+
Snippet(id="rustv1.ec2.DescribeInstance", labels=[Label(name=known_labels.SDK, value="rust:v1"), Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="DescribeInstance")]),
47+
Snippet(id="rustv1.ec2.RebootInstance", labels=[Label(name=known_labels.SDK, value="rust:v1"), Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="RebootInstance")]),
48+
Snippet(id="rustv1.ses.Send", labels=[Label(name=known_labels.SDK, value="rust:v1"), Label(name=known_labels.SERVICE, value="ses"), Label(name=known_labels.ACTION, value="Send")]),
49+
Snippet(id="javav2.ec2.DescribeInstance", labels=[Label(name=known_labels.SDK, value="java:v2"), Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="DescribeInstance")]),
50+
Snippet(id="javav2.ec2.RebootInstance", labels=[Label(name=known_labels.SDK, value="java:v2"), Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="RebootInstance")]),
51+
Snippet(id="javav2.ses.Send", labels=[Label(name=known_labels.SDK, value="java:v2"), Label(name=known_labels.SERVICE, value="ses"), Label(name=known_labels.ACTION, value="Send")]),
52+
]
53+
54+
examples = [
55+
Example(id="ec2.describe_instance", title="Describe an &EC2; Instance", labels=[Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="DescribeInstance")]),
56+
Example(id="ec2.reboot_instance", title="Reboot an &EC2; Instance", labels=[Label(name=known_labels.SERVICE, value="ec2"), Label(name=known_labels.ACTION, value="RebootInstance")]),
57+
Example(id="ses.Send", title="Send a message to an &SES; queue", labels=[Label(name=known_labels.SERVICE, value="ses"), Label(name=known_labels.ACTION, value="RebootInstance")]),
58+
Example(id="s3.PutObject", title="Put an object into &S3; storage", labels=[Label(name=known_labels.SERVICE, value="s3"), Label(name=known_labels.ACTION, value="PutObject")])
59+
]
60+
61+
service = Service(name="ec2", labels=[Label(name=known_labels.SERVICE, value="ec2")])
62+
63+
sdk = Sdk(language="rust", version="v1")
64+
65+
example_snippets = select(snippets, examples[0])
66+
service_examples = select(examples, service)
67+
sdk_snippets = select(snippets, sdk)
68+
# sdk_examples = select_all(examples, sdk_snippets)
69+
70+
assert example_snippets == frozenset([snippets[0], snippets[3]])
71+
assert service_examples == frozenset([examples[0], examples[1]])
72+
assert sdk_snippets == frozenset([snippets[0], snippets[1], snippets[2]])

0 commit comments

Comments
 (0)