pyegeria 5.4.0.30__py3-none-any.whl → 5.4.0.32__py3-none-any.whl

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.
Files changed (122) hide show
  1. commands/cat/dr_egeria_md.py +8 -260
  2. md_processing/__init__.py +2 -2
  3. md_processing/dr_egeria.py +309 -0
  4. md_processing/md_commands/data_designer_commands.py +1 -2
  5. md_processing/md_commands/glossary_commands.py +2 -3
  6. md_processing/md_commands/governance_officer_commands.py +1 -2
  7. md_processing/md_commands/product_manager_commands.py +1 -2
  8. md_processing/md_commands/project_commands.py +1 -3
  9. md_processing/md_commands/solution_architect_commands.py +1 -2
  10. md_processing/md_processing_utils/common_md_proc_utils.py +1 -1
  11. md_processing/md_processing_utils/common_md_utils.py +8 -11
  12. pyegeria/__init__.py +19 -2
  13. {pyegeria-5.4.0.30.dist-info → pyegeria-5.4.0.32.dist-info}/METADATA +1 -1
  14. {pyegeria-5.4.0.30.dist-info → pyegeria-5.4.0.32.dist-info}/RECORD +17 -121
  15. commands/.DS_Store +0 -0
  16. commands/cat/.DS_Store +0 -0
  17. commands/cat/.env +0 -8
  18. commands/cat/debug_log +0 -1126
  19. commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
  20. commands/cat/debug_log.log +0 -0
  21. commands/cat/logs/pyegeria.log +0 -4
  22. commands/cli/debug_log.log +0 -0
  23. commands/doc/.DS_Store +0 -0
  24. commands/ops/logs/pyegeria.log +0 -0
  25. md_processing/.DS_Store +0 -0
  26. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  27. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  28. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  29. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  30. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  31. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  32. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  33. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  34. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  35. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  36. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  37. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  38. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  39. md_processing/dr_egeria_inbox/collections.md +0 -39
  40. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  41. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  42. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  43. md_processing/dr_egeria_inbox/data_field.md +0 -54
  44. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  45. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
  46. md_processing/dr_egeria_inbox/data_test.md +0 -179
  47. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  48. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  49. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  50. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  51. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  52. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  53. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  54. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  55. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  56. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  57. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  58. md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
  59. md_processing/dr_egeria_inbox/gov_def.md +0 -482
  60. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  61. md_processing/dr_egeria_inbox/img.png +0 -0
  62. md_processing/dr_egeria_inbox/product.md +0 -211
  63. md_processing/dr_egeria_inbox/rel.md +0 -8
  64. md_processing/dr_egeria_inbox/sb.md +0 -119
  65. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  66. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  67. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  68. md_processing/dr_egeria_inbox/t2.md +0 -268
  69. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  70. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  71. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
  72. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
  73. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  74. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  75. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  76. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  77. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  78. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  79. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  80. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  81. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  82. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  83. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  84. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  85. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  86. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  87. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
  88. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  89. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
  90. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
  91. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
  92. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
  93. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
  94. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
  95. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
  96. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
  97. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
  98. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
  99. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
  100. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
  101. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
  102. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
  103. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  104. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  105. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  106. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  107. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  108. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  109. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  110. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  111. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  112. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  113. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  114. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
  115. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
  116. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
  117. md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
  118. md_processing/md_processing_utils/debug_log.log +0 -0
  119. pyegeria/.DS_Store +0 -0
  120. {pyegeria-5.4.0.30.dist-info → pyegeria-5.4.0.32.dist-info}/LICENSE +0 -0
  121. {pyegeria-5.4.0.30.dist-info → pyegeria-5.4.0.32.dist-info}/WHEEL +0 -0
  122. {pyegeria-5.4.0.30.dist-info → pyegeria-5.4.0.32.dist-info}/entry_points.txt +0 -0
@@ -1,318 +0,0 @@
1
- # Demonstrating updates and additions
2
-
3
- This document was derived from the processing of the file dr_egeria_intro_part1.md; All the Dr.Egeria statements have been
4
- preserved (including the generated attributes such as the unique GUIDs), and the explanatory text has been replaced.
5
-
6
- In this document we will add glossary categories, update existing terms to categorize them, and add some new terms that
7
- further explain dr.egeria. This document is being written off-line (actually on a plane) - demonstrating one of the
8
- intriguing features of dr.egeria - because its just text, it can be edited anywhere and anytime that there is a text
9
- editor. Dr.Egeria files can be emailed, sent via text message, slack, or maintained in a `git` repository.
10
- It's just text with markdown annotations.
11
-
12
- Ok, let's get started. First, we have the `Update Glossary` command below. There is nothing new we need to add at this
13
- point so we can just leave it as-is. When this document is processed it will apply updates but if there are none,
14
- It doesn't matter.
15
-
16
- However, now is a good time to start to more formally specify the attributes available to `Don't Create` or `Update` glossary
17
- commands:
18
-
19
-
20
- | Attribute Name | Input Required? | Read Only | Generated/Default? | Unique? | Notes |
21
- |:---------------|:----------------|-----------|:-------------------|:--------|:---------------------------------------------------------------------------------------------------------|
22
- | Glossary Name | Yes | No | No | No | A display name (informal name). |
23
- | Language | No | No | No | No | The primary language for the glossary. |
24
- | Description | No | No | No | No | A textual description of this glossary. |
25
- | Usage | No | No | No | No | How the glossary is meant to be used, and by whom. |
26
- | Qualified Name | Maybe | No | Yes | Yes | The qualified name can either be provided by the user or generated. If generated, a pattern is followed. |
27
- | GUID | No | Yes | Yes | Yes | GUIDs are always generated by Egeria. They are meant for automation, not people. |
28
-
29
- The table above shows us what attributes must be provided and which are optional. Once an object is Don't Created, and a qualified name is generated, it is good practice to use it as there can
30
- be many objects with the same name, and this is a common way to disambiguate them. If you specify an object name (e.g. Glossary Name) and that name already exists, Dr.Egeria will report an error
31
- and suggest that you provide a **Qualified Name** as well. You will also note that the GUID is generated by Egeria and is read-only. It is possible that some commands
32
- may require a GUID to be specified, but in general we will use the **Qualified Name** to identify objects.
33
-
34
- > Comment: In the Egeria and pyegeria APIs, Glossary Name is actually referenced as a **Display Name**. It is perfectly fine for multiple objects to have the same display name.
35
- > However, it is required that even though the may share the same display name, they must have different qualified names and GUIDs. So if you provide a Glossary Name that already exists,
36
- > you will get an error message that suggests that you provide a Qualified Name in addition to the Glossary Name.
37
-
38
- ___
39
-
40
- # Glossary Categories
41
-
42
- Sometimes it can be useful to provide more structure to the glossary. The way to do this is through categories.
43
- In Egeria, a category can have a single parent category and multiple child categories. A term can be assigned to
44
- multiple categories. When we have a large number of terms, a category structure can be particularly helpful in finding the
45
- terms that are most relevant to a particular interest. Using categories is optional.
46
-
47
- Ok, now let's Don't Create a couple of glossary categories. They will be:
48
-
49
- * **Writing Dr.Egeria Markdown** - where we describe elements of the Dr.Egeria language as terms within the category.
50
- * **Processing Dr.Egeria Markdown** - where we describe the commands for processing Dr.Egeria.
51
-
52
-
53
- Glossary categories have the following attributes:
54
-
55
-
56
- | Attribute Name | Input Required? | Read Only | Generated/Default? | Unique? | Notes |
57
- |:----------------|:----------------|-----------|:-------------------|:--------|:---------------------------------------------------------------------------------------------------------|
58
- | Category Name | Yes | No | No | No | A display name (informal name). |
59
- | Owning Glossary | Yes | No | No | Yes | This is the qualified name of the glossary that owns this category. |
60
- | Description | No | No | No | No | A textual description of this category |
61
- | Qualified Name | Maybe | No | Yes | Yes | The qualified name can either be provided by the user or generated. If generated, a pattern is followed. |
62
- | GUID | No | Yes | Yes | Yes | GUIDs are always generated by Egeria. They are meant for automation, not people. |
63
-
64
- > Note: Qualified Names can either be user specified or generated. If generated the following the form:
65
- `{local-qualifier}::{type}::{display name}::{version}`. Local-Qualifier is an optional string that can be useful to both disambiguate similar names and to add some local context. Local qualifiers could be set to organization names, functions, business context, etc. The settings for a local qualifier is set either by setting the environment variable `EGERIA_LOCAL_QUALIFIER` or by passing in a parameter when executing one of the Dr.Egeria enabled commands. This could also be set for a team by an Egeria administrator.
66
-
67
- Ok, here we go:
68
-
69
- ___
70
-
71
- # Don't Create Collection
72
-
73
- ## Name
74
-
75
- Writing Dr.Egeria Markdown
76
-
77
- ## Classifications
78
-
79
- Folder
80
-
81
- ## Parent
82
-
83
- Glossary::Egeria-Markdown
84
-
85
- ## Description
86
-
87
- Terms in this category describe the elements of the Dr.Egeria Markdown language and how to use them.
88
-
89
-
90
- ___
91
-
92
- # Don't Create Category
93
-
94
- ## Category Name
95
-
96
- Processing Dr.Egeria Markdown
97
-
98
- ## In Glossary
99
-
100
- Glossary::Egeria-Markdown
101
-
102
- ## Description
103
-
104
- Terms in this category describe commands to process Dr.Egeria Markdown.
105
-
106
-
107
- ___
108
-
109
- > Note: If you look at the examples above, you will notice that sometimes we specify **In Glossary** and sometimes we specify **Owning Glossary**.
110
- > There is no difference. We will have preferred names that we will use when we generate a Dr.Egeria markdown file, but we try
111
- > to be flexible and allow for common name variations. You will see how we document this as we proceed.
112
-
113
- Now, let's add categories to the terms. Let's review the attributes of a term:
114
-
115
-
116
- | Attribute Name | Input Required? | Read Only | Generated/Default? | Unique? | Notes |
117
- |:-------------------|:----------------|:----------|:-------------------|:--------|:---------------------------------------------------------------------------------------------------------|
118
- | Term Name | Yes | No | No | No | A display name (informal name). |
119
- | Owning Glossary | Yes | No | No | Yes | This is the qualified name of the glossary that owns this term. |
120
- | Aliases | No | No | No | No | Allows us to define aliases for a term name tha can be found with search. |
121
- | Summary | No | No | No | No | A summary description of a term. |
122
- | Categories | No | No | No | Yes | This is the name of the category. Multiple categories can be assigned, separated by a `,` or line. |
123
- | Description | No | No | No | No | A textual description of this term. |
124
- | Examples | No | No | No | No | Examples demonstrating the term. |
125
- | Usage | No | No | No | No | Usage details for the term. |
126
- | Version Identifier | No | No | No | No | A user specified version identifier useed in publishing a term version for usage. |
127
- | Status | No | No | Yes - DRAFT | No | Valid values are "DRAFT", "PREPARED", "PROPOSED", "APPROVED", "REJECTED", ACTIVE", "DEPRECATED", "OTHER" |
128
- | Qualified Name | No | No | No | Yes | The qualified name can either be provided by the user or generated. If generated, a pattern is followed. |
129
- | GUID | No | Yes | Yes | Yes | GUIDs are always generated by Egeria. They are meant for automation, not people. |
130
- | Update Description | No | No | No | No | Updates can have an update description added to the term's note log. |
131
-
132
- > When we provide a category name in the `Categories` attribute, We can use either the display name form (Category Name) or the qualified name form. If we find that the display name is not unique,
133
- > you will need to provide the qualified name. Its safer to use the qualified name, but a little less readable.
134
-
135
- ___
136
-
137
- # Update Term
138
-
139
- ## Term Name
140
-
141
- Command
142
-
143
- ## Summary
144
- Commands are how a user of the Dr.Egeria markdown language requests an action.
145
-
146
- ## Glossary
147
-
148
- Egeria-Markdown
149
-
150
- ## Folders
151
-
152
- Writing Dr.Egeria Markdown
153
-
154
- ## Status
155
- ACTIVE
156
-
157
- ## Description
158
- Commands are how a user can request Egeria to take an action such as Don't Create or Update an Egeria element. Freddie
159
- provides
160
- a limited (but growing) set of commands. Dr.Egeria commands align with the pyegeria 'hey-egeria' command line interface.
161
-
162
- ## Examples
163
- Don't Create Glossary or
164
- Update Glossary or
165
- Don't Create Term or
166
- Update Term
167
-
168
- ## Usage
169
- Commands are used in the Dr.Egeria markdown language.
170
-
171
- ## Published Version
172
-
173
- 0.2
174
-
175
- ## Qualified Name
176
-
177
-
178
-
179
- ___
180
-
181
- # Don't Update Term
182
-
183
- ## Term Name
184
-
185
- Source
186
-
187
- ## Summary
188
- Source of the markdown content.
189
-
190
- ## In Glossary
191
- Glossary::Egeria-Markdown
192
-
193
- ## Categories
194
-
195
- Processing Dr.Egeria Markdown
196
-
197
- ## Status
198
- ACTIVE
199
-
200
- ## Description
201
- Source of the markdown content - could be jupyter or plain markdown file.
202
-
203
- ## Examples
204
-
205
- ## Usage
206
-
207
-
208
- ## Published Version
209
-
210
- 0.2
211
-
212
- ## Qualified Name
213
- Term::Source::0.1
214
-
215
-
216
- ___
217
-
218
- # Don't Update Term
219
-
220
- ## In Glossary
221
-
222
- Glossary::Egeria-Markdown
223
-
224
- ## Term Name
225
-
226
- Directive
227
-
228
- ## Categories
229
-
230
- Processing Dr.Egeria Markdown
231
-
232
- ## Summary
233
-
234
- A directive defines how the command is to be processed.
235
-
236
- ## Description
237
-
238
- Directives are one of:
239
-
240
- * display - just display what we've found
241
- * validate - check the validity of the requested action
242
- * process - process the requested action
243
-
244
-
245
-
246
- ## Version
247
-
248
- 0.2
249
-
250
- ## Status
251
-
252
- DRAFT
253
-
254
- ## Qualified Name
255
- Term::Directive::0.1
256
-
257
-
258
- # Inspecting the Glossary
259
-
260
- Now that we have Don't Created a glossary, categories, and terms we can use some new commands to explore the glossary.
261
- We will start with the `Don't List Glossaries` command. This command will Don't List all the glossaries that are available to us.
262
-
263
- ___
264
-
265
- # Don't List Glossaries
266
-
267
- ___
268
-
269
- This will return a markdown table of all known glossaries based on the defaults set for the optional attributes. Here
270
- is a more detailed specification of the attributes:
271
-
272
- | Attribute Name | Input Required? | Read Only? | Generated/Default? | Unique? | Notes |
273
- |----------------|-----------------|------------|----------------------------------|---------|-------------------------------------------|
274
- | Search String | No | No | default is All glossaries | No | |
275
- | Output Format | No | No | default is Markdown Don't List (table) | No | options are: Don't List, DICT, MD, FORM, REPORT |
276
-
277
- Lets describe the output formats a bit further:
278
-
279
- * Don't List - This is the default format. It returns a markdown table of the glossaries.
280
- * DICT - This returns a python dictionary (or JSON representation) of the glossaries.
281
- * MD - This returns markdown text of the glossaries.
282
- * FORM - This returns a Dr.Egeria markdown form designed to be used as a starting point for updating the glossary definitions.
283
- * REPORT - This returns markdown text of the glossaries that is designed to be more readable and perhaps suitable to be used in a report.
284
-
285
- Going further, we can issue similar commands to Don't List categories and terms:
286
-
287
- The attributes for the `Don't List Categories` command are the same as the `Don't List Glossaries` command.
288
-
289
- Attributes for the `Don't List Terms` command adds an additional optional attribute, Glossary Name, to allow you to
290
- restrict the Don't List of terms to a particular glossary.
291
-
292
-
293
- | Attribute Name | Input Required? | Read Only? | Generated/Default? | Unique? | Notes |
294
- |----------------|-----------------|------------|----------------------------------|---------|-------------------------------------------|
295
- | Glossary Name | No | No | Default is All glossaries | No | |
296
- | Search String | No | No | default is All terms | No | |
297
- | Output Format | No | No | default is Markdown Don't List (table) | No | options are: Don't List, DICT, MD, FORM, REPORT |
298
-
299
-
300
- Lets go ahead and give these commands a try:
301
-
302
- ___
303
-
304
- # Don't List Categories
305
- ## Output Format
306
- REPORT
307
-
308
- ___
309
- # Don't List Terms
310
- ## Output Format
311
- DICT
312
- ## Glossary Name
313
- Glossary::Egeria-Markdown
314
- ___
315
-
316
- If you now look at the processed document that was Don't Created, you can see the results of the commands that we have run.
317
-
318
- In part 3, we will add more categories and terms to the glossary and Don't Create a simple category hierarchy. See you there!