datacontract-cli 0.10.2__py3-none-any.whl → 0.10.4__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.
Potentially problematic release.
This version of datacontract-cli might be problematic. Click here for more details.
- datacontract/breaking/breaking.py +12 -0
- datacontract/breaking/breaking_rules.py +4 -0
- datacontract/catalog/catalog.py +3 -0
- datacontract/cli.py +36 -8
- datacontract/data_contract.py +62 -128
- datacontract/export/avro_converter.py +16 -2
- datacontract/export/bigquery_converter.py +106 -0
- datacontract/export/go_converter.py +98 -0
- datacontract/export/html_export.py +6 -1
- datacontract/export/jsonschema_converter.py +45 -5
- datacontract/export/sql_converter.py +1 -0
- datacontract/export/sql_type_converter.py +42 -1
- datacontract/imports/avro_importer.py +14 -1
- datacontract/imports/bigquery_importer.py +166 -0
- datacontract/imports/jsonschema_importer.py +150 -0
- datacontract/model/data_contract_specification.py +55 -1
- datacontract/publish/publish.py +32 -0
- datacontract/templates/datacontract.html +37 -346
- datacontract/templates/index.html +233 -0
- datacontract/templates/partials/datacontract_information.html +66 -0
- datacontract/templates/partials/datacontract_servicelevels.html +253 -0
- datacontract/templates/partials/datacontract_terms.html +44 -0
- datacontract/templates/partials/definition.html +99 -0
- datacontract/templates/partials/example.html +27 -0
- datacontract/templates/partials/model_field.html +97 -0
- datacontract/templates/partials/server.html +144 -0
- datacontract/templates/style/output.css +94 -13
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/METADATA +139 -96
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/RECORD +33 -20
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/LICENSE +0 -0
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/WHEEL +0 -0
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/entry_points.txt +0 -0
- {datacontract_cli-0.10.2.dist-info → datacontract_cli-0.10.4.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html class="h-full bg-gray-100" lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<title>Data Contract</title>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
{# <script src="https://cdn.tailwindcss.com"></script> #}
|
|
8
|
+
<style>
|
|
9
|
+
{{style | safe }}
|
|
10
|
+
</style>
|
|
11
|
+
</head>
|
|
12
|
+
<body class="h-full">
|
|
13
|
+
|
|
14
|
+
<div class="min-h-full flex flex-col">
|
|
15
|
+
|
|
16
|
+
<nav class="bg-white shadow-sm">
|
|
17
|
+
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
|
18
|
+
<div class="flex h-16 justify-between">
|
|
19
|
+
<div class="flex">
|
|
20
|
+
<div class="flex flex-shrink-0 items-center mr-6">
|
|
21
|
+
<a class="text-xl text-gray-900 font-semibold" href="/">
|
|
22
|
+
Data Contracts
|
|
23
|
+
</a>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="hidden sm:ml-6 sm:flex sm:items-center">
|
|
27
|
+
<a href="https://datacontract.com" class="text-sky-500 hover:text-gray-700 text-sm font-semibold" target="_blank">datacontract.com</a>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</nav>
|
|
32
|
+
|
|
33
|
+
<main class="pb-7">
|
|
34
|
+
|
|
35
|
+
<div class="pt-5 mx-auto max-w-7xl sm:px-6 lg:px-8">
|
|
36
|
+
<div>
|
|
37
|
+
<div class="lg:flex lg:items-center lg:justify-between px-4 sm:px-0">
|
|
38
|
+
<div class="min-w-0 flex-1">
|
|
39
|
+
<h2 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">
|
|
40
|
+
Data Contract Catalog</h2>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div>
|
|
48
|
+
|
|
49
|
+
<div class="space-y-6 mt-6">
|
|
50
|
+
|
|
51
|
+
<section id="catalog">
|
|
52
|
+
|
|
53
|
+
{% if contracts_size > 0 %}
|
|
54
|
+
|
|
55
|
+
<form aria-labelledby="filter-heading" class="pb-4" >
|
|
56
|
+
<h2 id="filter-heading" class="sr-only">Filters</h2>
|
|
57
|
+
<div class="flex items-center justify-between">
|
|
58
|
+
<div class="hidden sm:flex sm:items-baseline sm:space-x-8">
|
|
59
|
+
<div>
|
|
60
|
+
<div class="relative rounded-md shadow-sm">
|
|
61
|
+
<div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
|
|
62
|
+
<svg class="pointer-events-none absolute h-5 w-5 text-gray-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
63
|
+
<path fill-rule="evenodd" d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z" clip-rule="evenodd" />
|
|
64
|
+
</svg>
|
|
65
|
+
</div>
|
|
66
|
+
<input type="text" name="q" id="search" class="block w-72 rounded-md border-0 py-1.5 pl-10 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" placeholder="Search">
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</form>
|
|
72
|
+
{% endif %}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
<ul role="list" class="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 ">
|
|
76
|
+
|
|
77
|
+
{% for contract in contracts %}
|
|
78
|
+
|
|
79
|
+
<li class="col-span-1 rounded-lg bg-white shadow hover:bg-gray-50"
|
|
80
|
+
data-search="{{
|
|
81
|
+
contract.spec.info.title|lower }} {{
|
|
82
|
+
contract.spec.info.owner|lower if contract.spec.info.owner else '' }} {{
|
|
83
|
+
contract.spec.info.description|lower }} {%
|
|
84
|
+
for model_name, model in contract.spec.models.items() %}
|
|
85
|
+
{{ model.description|lower }} {%
|
|
86
|
+
for field_name, field in model.fields.items() %}
|
|
87
|
+
{{ field_name|lower }} {{ field.description|lower if field.description else '' }} {%
|
|
88
|
+
endfor %}
|
|
89
|
+
{% endfor %}
|
|
90
|
+
">
|
|
91
|
+
<a href="{{contract.html_link}}" >
|
|
92
|
+
<div class="flex w-full justify-between space-x-1 p-6 pb-4">
|
|
93
|
+
<div class="flex-1 truncate">
|
|
94
|
+
<div class="flex items-center space-x-3">
|
|
95
|
+
<h3 class="truncate text-sm font-medium text-gray-900">{{contract.spec.info.title}}</h3>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="flex flex-wrap mt-1 text-sm text-gray-500 gap-1">
|
|
98
|
+
{% if contract.spec.info.owner %}
|
|
99
|
+
<div class="flex items-center text-sm text-gray-500">
|
|
100
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.25" stroke="currentColor" class="w-4 h-4 mr-1.5">
|
|
101
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z" />
|
|
102
|
+
</svg>
|
|
103
|
+
<span>{{contract.spec.info.owner}}</span>
|
|
104
|
+
</div>
|
|
105
|
+
{% endif %}
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
</div>
|
|
109
|
+
<div class="h-10 w-10 flex-shrink-0 rounded-full">
|
|
110
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M21.14 6.94a.77.77 0 0 0-.48.2c-1-.8-2.14-.25-3 .72A16.12 16.12 0 0 0 16.15 10a.28.28 0 0 0 .4.32c.08 0 1.39-1.21 1.47-1.28.73-.68 1.35-1.42 1.81-1.48s.32 0 .41.09a19 19 0 0 0-2.07 2.81c0 .12-.31 0 1.53 1.71l.27.24C19 13.57 16 16.73 15.74 17a2.66 2.66 0 0 1-1 .43 3.72 3.72 0 0 1-.22-1.52L17.7 12a.3.3 0 0 0-.47-.37c-.72.88-3.45 3.39-3.69 3.91a4 4 0 0 0 .28 2.62 1 1 0 0 0 .93.32 4.26 4.26 0 0 0 1.76-.65c.6-.62 3.86-4.79 4.65-5.31a20 20 0 0 0 1.77-1.64 4.67 4.67 0 0 0 1-1.37c.5-1.57-1.82-2.66-2.79-2.57Zm1.66 2.33a12.9 12.9 0 0 1-1.58 1.88c-.91 1-.65.74-1 .46-1.52-1.26-1.33-1-1.27-1.21l2-2.16c.34-.38-.06-.45.7-.15.44.16 1.43.63 1.15 1.18Z" fill="#020202" fill-rule="evenodd"></path><path d="M7.2 22.53c-1.48-.25-1.48-2.11-1.61-3.53a40 40 0 0 1 .15-6.57c.18-2.46.6-2.25.59-5.51 0-1.73-.33-4.06-1.79-5a40.29 40.29 0 0 1 6.24.08c2.64.18 5.71-.14 6.91.63C19.23 3.63 18.12 6 19 6a.32.32 0 0 0 .31-.36c-.06-1.31.24-2.44-.81-3.44A5.82 5.82 0 0 0 14.76 1a75.46 75.46 0 0 0-8.57 0C5.77 1 1.6 1.5 1 2.08A3.17 3.17 0 0 0 0 4.5 4.61 4.61 0 0 0 .72 7a1.92 1.92 0 0 0 .93.62c1 .31 3.24.25 2.86-.55C4.4 6.8 3.19 7 3.11 7a2.35 2.35 0 0 1-1.77-.56 3.77 3.77 0 0 1-.48-2 2.31 2.31 0 0 1 .76-1.73 3.54 3.54 0 0 1 1.27-.31c1.11 0 1.64.66 2 1.73a14.13 14.13 0 0 1 .3 4.46 33 33 0 0 0-.55 7c0 1.43.19 5 .84 6.22a2.1 2.1 0 0 0 1.67 1.24.3.3 0 0 0 .05-.52Z" fill="#020202" fill-rule="evenodd"></path><path d="M21.85 19.54a8 8 0 0 1-1.71-3.19.29.29 0 1 0-.57.15c.75 3.33 2.18 4 2.79 4.79-.34.08-13.26 1.1-14 1a.33.33 0 1 0-.09.66c1.61.26 10.59-.22 13.1-.49a3 3 0 0 0 2-.65c.63-.67-.71-1.47-1.52-2.27Z" fill="#020202" fill-rule="evenodd"></path><path d="M9.67 16.86c.39 0 .46.84.5 1.26 0 .13-.07.78.35.95a.51.51 0 0 0 .45 0c1.63-.85.93-.18 1.46-.18.68 0 .56-1.39-1.25-1 0-1.24-.34-2.29-1.59-2.2a2.75 2.75 0 0 0-2.18 1.81 3.92 3.92 0 0 0-.34 1.05c.11 1.84.86-1.68 2.6-1.69Z" fill="#0c6fff" fill-rule="evenodd"></path><path d="M8.57 8.41c5.28.19 2.32 0 6.08 0a.34.34 0 0 0 .35-.35.47.47 0 0 0-.39-.37c-.28-.06-2.1-.3-2.94-.33a17.84 17.84 0 0 0-3.84.48.31.31 0 0 0 .2.53c.09.02.48.04.54.04Z" fill="#0c6fff" fill-rule="evenodd"></path><path d="M13.22 11.64c-5.2-.15-5.49.12-5.57.34a.3.3 0 0 0 .17.38 1.23 1.23 0 0 0 .44.1c.84.06 7.28.38 7.24-.42-.03-.58-1.37-.33-2.28-.4Z" fill="#0c6fff" fill-rule="evenodd"></path></g></svg>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="flex w-full items-center justify-between px-6 pb-6">
|
|
114
|
+
<p class="text-sm text-gray-500 line-clamp-3">
|
|
115
|
+
{{contract.spec.info.description}}
|
|
116
|
+
</p>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
</a>
|
|
120
|
+
</li>
|
|
121
|
+
{% endfor %}
|
|
122
|
+
</ul>
|
|
123
|
+
|
|
124
|
+
{% if contracts_size == 0 %}
|
|
125
|
+
<p>The data contract catalog is empty.</p>
|
|
126
|
+
<p>
|
|
127
|
+
Learn more on data contracts on <a href="http://datacontract.com" class="text-sky-500 hover:text-gray-700 text-sm font-semibold">http://datacontract.com</a>.
|
|
128
|
+
</p>
|
|
129
|
+
{% endif %}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
<div id="no-results" class="hidden text-sm text-gray-500">
|
|
133
|
+
No results found.
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
</section>
|
|
137
|
+
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div class="mt-6 text-sm text-gray-400">
|
|
143
|
+
Created at {{formatted_date}} with <a href="https://cli.datacontract.com" class="text-gray-400 hover:text-gray-500">Data Contract CLI</a> v{{datacontract_cli_version}}
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
</div>
|
|
147
|
+
</main>
|
|
148
|
+
|
|
149
|
+
<dialog id="dialog-datacontract-yaml" class="relative z-10" aria-labelledby="modal-title" aria-modal="true">
|
|
150
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
|
151
|
+
|
|
152
|
+
<div class="fixed inset-0 z-10 w-screen overflow-y-auto">
|
|
153
|
+
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
|
154
|
+
<div class="relative transform rounded-lg bg-white px-4 pb-4 pt-5 text-left shadow-xl transition-all sm:my-8 sm:w-4/5 sm:p-6">
|
|
155
|
+
<div class="absolute right-0 top-0 pr-4 pt-4">
|
|
156
|
+
<button type="button" onclick="document.getElementById('dialog-datacontract-yaml').close()" class="rounded-md bg-white text-gray-400 hover:text-gray-500">
|
|
157
|
+
<span class="sr-only">Close</span>
|
|
158
|
+
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
|
159
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
160
|
+
</svg>
|
|
161
|
+
</button>
|
|
162
|
+
</div>
|
|
163
|
+
<div>
|
|
164
|
+
<div class="mt-3 mb-3 text-center sm:mt-5">
|
|
165
|
+
|
|
166
|
+
<h3 class="text-base font-semibold leading-6 text-gray-900" id="modal-title">Data Contract YAML</h3>
|
|
167
|
+
</div>
|
|
168
|
+
<pre class="overflow-x-auto text-sm bg-gray-50 p-4"><code>{{datacontract_yaml}}</code></pre>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="mt-5 sm:mt-6">
|
|
171
|
+
<button type="button" onclick="document.getElementById('dialog-datacontract-yaml').close()"
|
|
172
|
+
class="inline-flex w-full justify-center rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Close</button>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
</dialog>
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
<footer class="bg-white mt-auto text-sm text-gray-400">
|
|
181
|
+
<div class="mx-auto max-w-7xl py-5 px-6 md:flex md:items-center md:justify-between lg:px-8">
|
|
182
|
+
<div class="flex justify-center space-x-6 md:order-2">
|
|
183
|
+
<div>
|
|
184
|
+
<a href="https://cli.datacontract.com" class="text-gray-400 hover:text-gray-500 px-2">Data Contract CLI</a>
|
|
185
|
+
|
|
186
|
+
<a href="https://datacontract.com" class="text-gray-400 hover:text-gray-500 px-2">Data Contract Specification</a>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
</div>
|
|
191
|
+
<div class="mt-8 md:order-1 md:mt-0">
|
|
192
|
+
<p class="text-center leading-5 text-gray-400">
|
|
193
|
+
Supported with ❤️ by <a href="https://datamesh-manager.com" class="text-gray-400 hover:text-gray-500">Data Mesh Manager</a>
|
|
194
|
+
</p>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
</footer>
|
|
199
|
+
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<script>
|
|
203
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
204
|
+
const searchInput = document.getElementById('search');
|
|
205
|
+
const contractsList = document.querySelectorAll('#catalog li');
|
|
206
|
+
const noResults = document.getElementById('no-results');
|
|
207
|
+
|
|
208
|
+
searchInput.addEventListener('keyup', function() {
|
|
209
|
+
let visibleCount = 0; // Counter to track the number of visible items
|
|
210
|
+
const searchText = searchInput.value.toLowerCase();
|
|
211
|
+
|
|
212
|
+
contractsList.forEach(contract => {
|
|
213
|
+
const searchData = contract.getAttribute('data-search');
|
|
214
|
+
if (searchData && searchData.includes(searchText)) {
|
|
215
|
+
contract.style.display = '';
|
|
216
|
+
visibleCount++;
|
|
217
|
+
} else {
|
|
218
|
+
contract.style.display = 'none';
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Manage the visibility of the no results message
|
|
223
|
+
if (visibleCount === 0) {
|
|
224
|
+
noResults.classList.remove('hidden'); // Show the message if no items are visible
|
|
225
|
+
} else {
|
|
226
|
+
noResults.classList.add('hidden'); // Hide the message if there are visible items
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
</script>
|
|
231
|
+
|
|
232
|
+
</body>
|
|
233
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<div class=" px-4 sm:px-0">
|
|
2
|
+
<h1 class="text-base font-semibold leading-6 text-gray-900" id="info">Info</h1>
|
|
3
|
+
<p class="text-sm text-gray-500">Information about the data contract</p>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
|
|
6
|
+
|
|
7
|
+
<div class="px-4 py-5 sm:px-6">
|
|
8
|
+
|
|
9
|
+
<dl class="grid grid-cols-1 gap-x-4 gap-y-6 sm:grid-cols-2">
|
|
10
|
+
<div class="sm:col-span-1">
|
|
11
|
+
<dt class="text-sm font-medium text-gray-500">Title</dt>
|
|
12
|
+
<dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.title }}</dd>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="sm:col-span-1">
|
|
16
|
+
<dt class="text-sm font-medium text-gray-500">Version</dt>
|
|
17
|
+
<dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.version }}</dd>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
{% if datacontract.info.status %}
|
|
21
|
+
<div class="sm:col-span-1">
|
|
22
|
+
<dt class="text-sm font-medium text-gray-500">Status</dt>
|
|
23
|
+
<dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.status }}</dd>
|
|
24
|
+
</div>
|
|
25
|
+
{% endif %}
|
|
26
|
+
|
|
27
|
+
{% if datacontract.info.description %}
|
|
28
|
+
<div class="sm:col-span-2">
|
|
29
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
30
|
+
<dd class="mt-1 text-sm text-gray-900" >
|
|
31
|
+
<span class="whitespace-pre-wrap">{{ datacontract.info.description }}</span>
|
|
32
|
+
</dd>
|
|
33
|
+
</div>
|
|
34
|
+
{% endif %}
|
|
35
|
+
|
|
36
|
+
{% if datacontract.info.owner %}
|
|
37
|
+
<div class="sm:col-span-1">
|
|
38
|
+
<dt class="text-sm font-medium text-gray-500">Owner</dt>
|
|
39
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
40
|
+
<span>{{ datacontract.info.owner }}</span>
|
|
41
|
+
</dd>
|
|
42
|
+
</div>
|
|
43
|
+
{% endif %}
|
|
44
|
+
|
|
45
|
+
{% if datacontract.info.contact %}
|
|
46
|
+
<div class="sm:col-span-1">
|
|
47
|
+
<dt class="text-sm font-medium text-gray-500">Contact</dt>
|
|
48
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
49
|
+
{% if datacontract.info.contact.name %}
|
|
50
|
+
{{ datacontract.info.contact.name }}
|
|
51
|
+
{% endif %}
|
|
52
|
+
{% if datacontract.info.contact.email %}
|
|
53
|
+
<a href="mailto:{{ datacontract.info.contact.email }}" class="text-sky-500 hover:text-gray-700">{{ datacontract.info.contact.email }}</a>
|
|
54
|
+
{% endif %}
|
|
55
|
+
{% if datacontract.info.contact.url %}
|
|
56
|
+
<div>
|
|
57
|
+
<a href="{{ datacontract.info.contact.url }}" class="text-sky-500 hover:text-gray-700">{{ datacontract.info.contact.url }}</a>
|
|
58
|
+
</div>
|
|
59
|
+
{% endif %}
|
|
60
|
+
</dd>
|
|
61
|
+
</div>
|
|
62
|
+
{% endif %}
|
|
63
|
+
|
|
64
|
+
</dl>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
<div class="px-4 sm:px-0">
|
|
2
|
+
<h1 class="text-base font-semibold leading-6 text-gray-900">Service Levels</h1>
|
|
3
|
+
<p class="text-sm text-gray-500">Service levels of the data contract</p>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
|
|
6
|
+
<div class="px-4 py-5 sm:px-6">
|
|
7
|
+
<dl class="grid grid-cols-1 gap-x-4 gap-y-6 divide-y">
|
|
8
|
+
{% if datacontract.servicelevels.availability %}
|
|
9
|
+
<div class="grid sm:grid-cols-2" >
|
|
10
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="availability">
|
|
11
|
+
Availability
|
|
12
|
+
</h2>
|
|
13
|
+
{% if datacontract.servicelevels.availability.description %}
|
|
14
|
+
<div class="sm:col-span-1">
|
|
15
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
16
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
17
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.availability.description }}</span>
|
|
18
|
+
</dd>
|
|
19
|
+
</div>
|
|
20
|
+
{% endif %}
|
|
21
|
+
{% if datacontract.servicelevels.availability.percentage %}
|
|
22
|
+
<div class="sm:col-span-1">
|
|
23
|
+
<dt class="text-sm font-medium text-gray-500">Percentage</dt>
|
|
24
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
25
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.availability.percentage }}</span>
|
|
26
|
+
</dd>
|
|
27
|
+
</div>
|
|
28
|
+
{% endif %}
|
|
29
|
+
</div>
|
|
30
|
+
{% endif %}
|
|
31
|
+
{% if datacontract.servicelevels.retention %}
|
|
32
|
+
<div class="grid sm:grid-cols-2" >
|
|
33
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="retention">
|
|
34
|
+
Retention
|
|
35
|
+
</h2>
|
|
36
|
+
{% if datacontract.servicelevels.retention.description %}
|
|
37
|
+
<div class="sm:col-span-1">
|
|
38
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
39
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
40
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.retention.description }}</span>
|
|
41
|
+
</dd>
|
|
42
|
+
</div>
|
|
43
|
+
{% endif %}
|
|
44
|
+
{% if datacontract.servicelevels.retention.period %}
|
|
45
|
+
<div class="sm:col-span-1">
|
|
46
|
+
<dt class="text-sm font-medium text-gray-500">Period</dt>
|
|
47
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
48
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.retention.period }}</span>
|
|
49
|
+
</dd>
|
|
50
|
+
</div>
|
|
51
|
+
{% endif %}
|
|
52
|
+
{% if datacontract.servicelevels.retention.unlimited %}
|
|
53
|
+
<div class="sm:col-span-1">
|
|
54
|
+
<dt class="text-sm font-medium text-gray-500">Unlimited</dt>
|
|
55
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
56
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.retention.unlimited }}</span>
|
|
57
|
+
</dd>
|
|
58
|
+
</div>
|
|
59
|
+
{% endif %}
|
|
60
|
+
</div>
|
|
61
|
+
{% endif %}
|
|
62
|
+
{% if datacontract.servicelevels.latency %}
|
|
63
|
+
<div class="grid sm:grid-cols-2" >
|
|
64
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="latency">
|
|
65
|
+
Latency
|
|
66
|
+
</h2>
|
|
67
|
+
{% if datacontract.servicelevels.latency.description %}
|
|
68
|
+
<div class="sm:col-span-1">
|
|
69
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
70
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
71
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.latency.description }}</span>
|
|
72
|
+
</dd>
|
|
73
|
+
</div>
|
|
74
|
+
{% endif %}
|
|
75
|
+
{% if datacontract.servicelevels.latency.threshold %}
|
|
76
|
+
<div class="sm:col-span-1">
|
|
77
|
+
<dt class="text-sm font-medium text-gray-500">Threshold</dt>
|
|
78
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
79
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.latency.threshold }}</span>
|
|
80
|
+
</dd>
|
|
81
|
+
</div>
|
|
82
|
+
{% endif %}
|
|
83
|
+
{% if datacontract.servicelevels.latency.sourceTimestampField %}
|
|
84
|
+
<div class="sm:col-span-1">
|
|
85
|
+
<dt class="text-sm font-medium text-gray-500">Source Timestamp field</dt>
|
|
86
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
87
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.latency.sourceTimestampField
|
|
88
|
+
}}</span>
|
|
89
|
+
</dd>
|
|
90
|
+
</div>
|
|
91
|
+
{% endif %}
|
|
92
|
+
{% if datacontract.servicelevels.latency.processedTimestampField %}
|
|
93
|
+
<div class="sm:col-span-1">
|
|
94
|
+
<dt class="text-sm font-medium text-gray-500">Processed Timestamp field</dt>
|
|
95
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
96
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.latency.processedTimestampField
|
|
97
|
+
}}</span>
|
|
98
|
+
</dd>
|
|
99
|
+
</div>
|
|
100
|
+
{% endif %}
|
|
101
|
+
</div>
|
|
102
|
+
{% endif %}
|
|
103
|
+
{% if datacontract.servicelevels.freshness %}
|
|
104
|
+
<div class="grid sm:grid-cols-2" >
|
|
105
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="freshness">
|
|
106
|
+
Freshness
|
|
107
|
+
</h2>
|
|
108
|
+
{% if datacontract.servicelevels.freshness.description %}
|
|
109
|
+
<div class="sm:col-span-1">
|
|
110
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
111
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
112
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.freshness.description }}</span>
|
|
113
|
+
</dd>
|
|
114
|
+
</div>
|
|
115
|
+
{% endif %}
|
|
116
|
+
{% if datacontract.servicelevels.freshness.threshold %}
|
|
117
|
+
<div class="sm:col-span-1">
|
|
118
|
+
<dt class="text-sm font-medium text-gray-500">Threshold</dt>
|
|
119
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
120
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.freshness.threshold }}</span>
|
|
121
|
+
</dd>
|
|
122
|
+
</div>
|
|
123
|
+
{% endif %}
|
|
124
|
+
{% if datacontract.servicelevels.freshness.timestampField %}
|
|
125
|
+
<div class="sm:col-span-1">
|
|
126
|
+
<dt class="text-sm font-medium text-gray-500">Timestamp field</dt>
|
|
127
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
128
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.freshness.timestampField }}</span>
|
|
129
|
+
</dd>
|
|
130
|
+
</div>
|
|
131
|
+
{% endif %}
|
|
132
|
+
</div>
|
|
133
|
+
{% endif %}
|
|
134
|
+
{% if datacontract.servicelevels.frequency %}
|
|
135
|
+
<div class="grid sm:grid-cols-2" >
|
|
136
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="frequency">
|
|
137
|
+
Frequency
|
|
138
|
+
</h2>
|
|
139
|
+
{% if datacontract.servicelevels.frequency.description %}
|
|
140
|
+
<div class="sm:col-span-1">
|
|
141
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
142
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
143
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.description }}</span>
|
|
144
|
+
</dd>
|
|
145
|
+
</div>
|
|
146
|
+
{% endif %}
|
|
147
|
+
{% if datacontract.servicelevels.frequency.type %}
|
|
148
|
+
<div class="sm:col-span-1">
|
|
149
|
+
<dt class="text-sm font-medium text-gray-500">Type</dt>
|
|
150
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
151
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.type }}</span>
|
|
152
|
+
</dd>
|
|
153
|
+
</div>
|
|
154
|
+
{% endif %}
|
|
155
|
+
{% if datacontract.servicelevels.frequency.interval %}
|
|
156
|
+
<div class="sm:col-span-1">
|
|
157
|
+
<dt class="text-sm font-medium text-gray-500">Interval</dt>
|
|
158
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
159
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.interval }}</span>
|
|
160
|
+
</dd>
|
|
161
|
+
</div>
|
|
162
|
+
{% endif %}
|
|
163
|
+
{% if datacontract.servicelevels.frequency.cron %}
|
|
164
|
+
<div class="sm:col-span-1">
|
|
165
|
+
<dt class="text-sm font-medium text-gray-500">Cron</dt>
|
|
166
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
167
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.frequency.cron }}</span>
|
|
168
|
+
</dd>
|
|
169
|
+
</div>
|
|
170
|
+
{% endif %}
|
|
171
|
+
</div>
|
|
172
|
+
{% endif %}
|
|
173
|
+
{% if datacontract.servicelevels.support %}
|
|
174
|
+
<div class="grid sm:grid-cols-2" >
|
|
175
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="support">
|
|
176
|
+
Support
|
|
177
|
+
</h2>
|
|
178
|
+
{% if datacontract.servicelevels.support.description %}
|
|
179
|
+
<div class="sm:col-span-1">
|
|
180
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
181
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
182
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.description }}</span>
|
|
183
|
+
</dd>
|
|
184
|
+
</div>
|
|
185
|
+
{% endif %}
|
|
186
|
+
{% if datacontract.servicelevels.support.time %}
|
|
187
|
+
<div class="sm:col-span-1">
|
|
188
|
+
<dt class="text-sm font-medium text-gray-500">Time</dt>
|
|
189
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
190
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.time }}</span>
|
|
191
|
+
</dd>
|
|
192
|
+
</div>
|
|
193
|
+
{% endif %}
|
|
194
|
+
{% if datacontract.servicelevels.support.responseTime %}
|
|
195
|
+
<div class="sm:col-span-1">
|
|
196
|
+
<dt class="text-sm font-medium text-gray-500">Response Time</dt>
|
|
197
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
198
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.responseTime }}</span>
|
|
199
|
+
</dd>
|
|
200
|
+
</div>
|
|
201
|
+
{% endif %}
|
|
202
|
+
</div>
|
|
203
|
+
{% endif %}
|
|
204
|
+
{% if datacontract.servicelevels.backup %}
|
|
205
|
+
<div class="grid sm:grid-cols-2" >
|
|
206
|
+
<h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="backup">
|
|
207
|
+
Backup
|
|
208
|
+
</h2>
|
|
209
|
+
{% if datacontract.servicelevels.backup.description %}
|
|
210
|
+
<div class="sm:col-span-1">
|
|
211
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
212
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
213
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.description }}</span>
|
|
214
|
+
</dd>
|
|
215
|
+
</div>
|
|
216
|
+
{% endif %}
|
|
217
|
+
{% if datacontract.servicelevels.backup.internal %}
|
|
218
|
+
<div class="sm:col-span-1">
|
|
219
|
+
<dt class="text-sm font-medium text-gray-500">Interval</dt>
|
|
220
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
221
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.interval }}</span>
|
|
222
|
+
</dd>
|
|
223
|
+
</div>
|
|
224
|
+
{% endif %}
|
|
225
|
+
{% if datacontract.servicelevels.backup.cron %}
|
|
226
|
+
<div class="sm:col-span-1">
|
|
227
|
+
<dt class="text-sm font-medium text-gray-500">Cron</dt>
|
|
228
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
229
|
+
<span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.backup.cron }}</span>
|
|
230
|
+
</dd>
|
|
231
|
+
</div>
|
|
232
|
+
{% endif %}
|
|
233
|
+
{% if datacontract.servicelevels.backup.recoveryTime %}
|
|
234
|
+
<div class="sm:col-span-1">
|
|
235
|
+
<dt class="text-sm font-medium text-gray-500">Recovery Time</dt>
|
|
236
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
237
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.recoveryTime }}</span>
|
|
238
|
+
</dd>
|
|
239
|
+
</div>
|
|
240
|
+
{% endif %}
|
|
241
|
+
{% if datacontract.servicelevels.backup.recoveryPoint %}
|
|
242
|
+
<div class="sm:col-span-1">
|
|
243
|
+
<dt class="text-sm font-medium text-gray-500">Recovery Point</dt>
|
|
244
|
+
<dd class="mt-1 text-sm text-gray-900">
|
|
245
|
+
<span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.recoveryPoint }}</span>
|
|
246
|
+
</dd>
|
|
247
|
+
</div>
|
|
248
|
+
{% endif %}
|
|
249
|
+
</div>
|
|
250
|
+
{% endif %}
|
|
251
|
+
</dl>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<div class="px-4 sm:px-0">
|
|
2
|
+
<h1 class="text-base font-semibold leading-6 text-gray-900" id="terms">Terms</h1>
|
|
3
|
+
<p class="text-sm text-gray-500">Terms and conditions of the data contract</p>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
|
|
6
|
+
|
|
7
|
+
<div class="px-4 py-5 sm:px-6">
|
|
8
|
+
|
|
9
|
+
<dl class="grid grid-cols-1 gap-x-4 gap-y-6 sm:grid-cols-2">
|
|
10
|
+
<div class="sm:col-span-1">
|
|
11
|
+
<dt class="text-sm font-medium text-gray-500">Usage</dt>
|
|
12
|
+
<dd class="mt-1 text-sm text-gray-900" >
|
|
13
|
+
<span class="whitespace-pre-wrap">{{ datacontract.terms.usage }}</span>
|
|
14
|
+
</dd>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div class="sm:col-span-1">
|
|
18
|
+
<dt class="text-sm font-medium text-gray-500">Limitations</dt>
|
|
19
|
+
<dd class="mt-1 text-sm text-gray-900" >
|
|
20
|
+
<span class="whitespace-pre-wrap">{{ datacontract.terms.limitations }}</span>
|
|
21
|
+
</dd>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
{% if datacontract.terms.billing %}
|
|
25
|
+
<div class="sm:col-span-1">
|
|
26
|
+
<dt class="text-sm font-medium text-gray-500">Billing</dt>
|
|
27
|
+
<dd class="mt-1 text-sm text-gray-900" >
|
|
28
|
+
<span class="whitespace-pre-wrap">{{ datacontract.terms.billing }}</span>
|
|
29
|
+
</dd>
|
|
30
|
+
</div>
|
|
31
|
+
{% endif %}
|
|
32
|
+
|
|
33
|
+
{% if datacontract.terms.noticePeriod %}
|
|
34
|
+
<div class="sm:col-span-1">
|
|
35
|
+
<dt class="text-sm font-medium text-gray-500">Notice Period</dt>
|
|
36
|
+
<dd class="mt-1 text-sm text-gray-900 flex" >
|
|
37
|
+
<span class="whitespace-pre-wrap">{{ datacontract.terms.noticePeriod }}</span>
|
|
38
|
+
</dd>
|
|
39
|
+
</div>
|
|
40
|
+
{% endif %}
|
|
41
|
+
|
|
42
|
+
</dl>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|