datacontract-cli 0.10.0__py3-none-any.whl → 0.10.37__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.
- datacontract/__init__.py +13 -0
- datacontract/api.py +260 -0
- datacontract/breaking/breaking.py +242 -12
- datacontract/breaking/breaking_rules.py +37 -1
- datacontract/catalog/catalog.py +80 -0
- datacontract/cli.py +387 -117
- datacontract/data_contract.py +216 -353
- datacontract/engines/data_contract_checks.py +1041 -0
- datacontract/engines/data_contract_test.py +113 -0
- datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +2 -3
- datacontract/engines/datacontract/check_that_datacontract_file_exists.py +1 -1
- datacontract/engines/fastjsonschema/check_jsonschema.py +176 -42
- datacontract/engines/fastjsonschema/s3/s3_read_files.py +16 -1
- datacontract/engines/soda/check_soda_execute.py +100 -56
- datacontract/engines/soda/connections/athena.py +79 -0
- datacontract/engines/soda/connections/bigquery.py +8 -1
- datacontract/engines/soda/connections/databricks.py +12 -3
- datacontract/engines/soda/connections/duckdb_connection.py +241 -0
- datacontract/engines/soda/connections/kafka.py +206 -113
- datacontract/engines/soda/connections/snowflake.py +8 -5
- datacontract/engines/soda/connections/sqlserver.py +43 -0
- datacontract/engines/soda/connections/trino.py +26 -0
- datacontract/export/avro_converter.py +72 -8
- datacontract/export/avro_idl_converter.py +31 -25
- datacontract/export/bigquery_converter.py +130 -0
- datacontract/export/custom_converter.py +40 -0
- datacontract/export/data_caterer_converter.py +161 -0
- datacontract/export/dbml_converter.py +148 -0
- datacontract/export/dbt_converter.py +141 -54
- datacontract/export/dcs_exporter.py +6 -0
- datacontract/export/dqx_converter.py +126 -0
- datacontract/export/duckdb_type_converter.py +57 -0
- datacontract/export/excel_exporter.py +923 -0
- datacontract/export/exporter.py +100 -0
- datacontract/export/exporter_factory.py +216 -0
- datacontract/export/go_converter.py +105 -0
- datacontract/export/great_expectations_converter.py +257 -36
- datacontract/export/html_exporter.py +86 -0
- datacontract/export/iceberg_converter.py +188 -0
- datacontract/export/jsonschema_converter.py +71 -16
- datacontract/export/markdown_converter.py +337 -0
- datacontract/export/mermaid_exporter.py +110 -0
- datacontract/export/odcs_v3_exporter.py +375 -0
- datacontract/export/pandas_type_converter.py +40 -0
- datacontract/export/protobuf_converter.py +168 -68
- datacontract/export/pydantic_converter.py +6 -0
- datacontract/export/rdf_converter.py +13 -6
- datacontract/export/sodacl_converter.py +36 -188
- datacontract/export/spark_converter.py +245 -0
- datacontract/export/sql_converter.py +37 -3
- datacontract/export/sql_type_converter.py +269 -8
- datacontract/export/sqlalchemy_converter.py +170 -0
- datacontract/export/terraform_converter.py +7 -2
- datacontract/imports/avro_importer.py +246 -26
- datacontract/imports/bigquery_importer.py +221 -0
- datacontract/imports/csv_importer.py +143 -0
- datacontract/imports/dbml_importer.py +112 -0
- datacontract/imports/dbt_importer.py +240 -0
- datacontract/imports/excel_importer.py +1111 -0
- datacontract/imports/glue_importer.py +288 -0
- datacontract/imports/iceberg_importer.py +172 -0
- datacontract/imports/importer.py +51 -0
- datacontract/imports/importer_factory.py +128 -0
- datacontract/imports/json_importer.py +325 -0
- datacontract/imports/jsonschema_importer.py +146 -0
- datacontract/imports/odcs_importer.py +60 -0
- datacontract/imports/odcs_v3_importer.py +516 -0
- datacontract/imports/parquet_importer.py +81 -0
- datacontract/imports/protobuf_importer.py +264 -0
- datacontract/imports/spark_importer.py +262 -0
- datacontract/imports/sql_importer.py +274 -35
- datacontract/imports/unity_importer.py +219 -0
- datacontract/init/init_template.py +20 -0
- datacontract/integration/datamesh_manager.py +86 -0
- datacontract/lint/resolve.py +271 -49
- datacontract/lint/resources.py +21 -0
- datacontract/lint/schema.py +53 -17
- datacontract/lint/urls.py +32 -12
- datacontract/model/data_contract_specification/__init__.py +1 -0
- datacontract/model/exceptions.py +4 -1
- datacontract/model/odcs.py +24 -0
- datacontract/model/run.py +49 -29
- datacontract/output/__init__.py +0 -0
- datacontract/output/junit_test_results.py +135 -0
- datacontract/output/output_format.py +10 -0
- datacontract/output/test_results_writer.py +79 -0
- datacontract/py.typed +0 -0
- datacontract/schemas/datacontract-1.1.0.init.yaml +91 -0
- datacontract/schemas/datacontract-1.1.0.schema.json +1975 -0
- datacontract/schemas/datacontract-1.2.0.init.yaml +91 -0
- datacontract/schemas/datacontract-1.2.0.schema.json +2029 -0
- datacontract/schemas/datacontract-1.2.1.init.yaml +91 -0
- datacontract/schemas/datacontract-1.2.1.schema.json +2058 -0
- datacontract/schemas/odcs-3.0.1.schema.json +2634 -0
- datacontract/schemas/odcs-3.0.2.schema.json +2382 -0
- datacontract/templates/datacontract.html +139 -294
- datacontract/templates/datacontract_odcs.html +685 -0
- datacontract/templates/index.html +236 -0
- datacontract/templates/partials/datacontract_information.html +86 -0
- datacontract/templates/partials/datacontract_servicelevels.html +253 -0
- datacontract/templates/partials/datacontract_terms.html +51 -0
- datacontract/templates/partials/definition.html +25 -0
- datacontract/templates/partials/example.html +27 -0
- datacontract/templates/partials/model_field.html +144 -0
- datacontract/templates/partials/quality.html +49 -0
- datacontract/templates/partials/server.html +211 -0
- datacontract/templates/style/output.css +491 -72
- datacontract_cli-0.10.37.dist-info/METADATA +2235 -0
- datacontract_cli-0.10.37.dist-info/RECORD +119 -0
- {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/WHEEL +1 -1
- {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info/licenses}/LICENSE +1 -1
- datacontract/engines/datacontract/check_that_datacontract_str_is_valid.py +0 -48
- datacontract/engines/soda/connections/dask.py +0 -28
- datacontract/engines/soda/connections/duckdb.py +0 -76
- datacontract/export/csv_type_converter.py +0 -36
- datacontract/export/html_export.py +0 -66
- datacontract/export/odcs_converter.py +0 -102
- datacontract/init/download_datacontract_file.py +0 -17
- datacontract/integration/publish_datamesh_manager.py +0 -33
- datacontract/integration/publish_opentelemetry.py +0 -107
- datacontract/lint/lint.py +0 -141
- datacontract/lint/linters/description_linter.py +0 -34
- datacontract/lint/linters/example_model_linter.py +0 -91
- datacontract/lint/linters/field_pattern_linter.py +0 -34
- datacontract/lint/linters/field_reference_linter.py +0 -38
- datacontract/lint/linters/notice_period_linter.py +0 -55
- datacontract/lint/linters/quality_schema_linter.py +0 -52
- datacontract/lint/linters/valid_constraints_linter.py +0 -99
- datacontract/model/data_contract_specification.py +0 -141
- datacontract/web.py +0 -14
- datacontract_cli-0.10.0.dist-info/METADATA +0 -951
- datacontract_cli-0.10.0.dist-info/RECORD +0 -66
- /datacontract/{model → breaking}/breaking_change.py +0 -0
- /datacontract/{lint/linters → export}/__init__.py +0 -0
- {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/entry_points.txt +0 -0
- {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<div class="mt-3 flow-root">
|
|
2
|
+
<div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
|
3
|
+
<div class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
|
|
4
|
+
<div class="overflow-hidden shadow ring-1 ring-black ring-opacity-5 sm:rounded-lg">
|
|
5
|
+
|
|
6
|
+
<table class="min-w-full divide-y divide-gray-300">
|
|
7
|
+
<thead class="bg-gray-50">
|
|
8
|
+
<tr>
|
|
9
|
+
<th scope="colgroup" colspan="3" class="py-2 pl-4 pr-3 text-left font-semibold text-gray-900 sm:pl-6">
|
|
10
|
+
<span>{{ example.model }}</span>
|
|
11
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10">{{ example.type }}</span>
|
|
12
|
+
<div class="text-sm font-medium text-gray-500">{{ example.description }}</div>
|
|
13
|
+
</th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
<tbody class="divide-y divide-gray-200 bg-white">
|
|
17
|
+
<tr>
|
|
18
|
+
<td class="whitespace-nowrap py-2 pl-4 pr-2 text-sm font-medium text-gray-900 sm:pl-6 w-12/12">
|
|
19
|
+
<pre>{{ example.data }}</pre>
|
|
20
|
+
</td>
|
|
21
|
+
</tr>
|
|
22
|
+
</tbody>
|
|
23
|
+
</table>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{% if nested %}
|
|
2
|
+
<tr class="bg-gray-50">
|
|
3
|
+
<td class="whitespace-nowrap py-2 pl-4 pr-2 text-sm font-medium text-gray-900 sm:pl-6 w-2/12 flex items-center gap-x-4">
|
|
4
|
+
{# poor mans approach to indenting things a bit #}
|
|
5
|
+
{% for i in range(0,level)%}
|
|
6
|
+
<div class="w-2"> </div>
|
|
7
|
+
{% endfor %}
|
|
8
|
+
<div>
|
|
9
|
+
↳
|
|
10
|
+
</div>
|
|
11
|
+
{% else %}
|
|
12
|
+
<tr>
|
|
13
|
+
<td class="whitespace-nowrap py-2 pl-4 pr-2 text-sm font-medium text-gray-900 sm:pl-6 w-2/12">
|
|
14
|
+
{% endif %}
|
|
15
|
+
<div class="py-2 text-sm">
|
|
16
|
+
{% if field.title %}
|
|
17
|
+
<span>{{ field.title }}</span><br>
|
|
18
|
+
{% endif %}
|
|
19
|
+
<span class="font-mono flex">{{ field_name }}{% if field.ref %} <a href="{{ field.ref }}">
|
|
20
|
+
<svg title="Definition" class="mr-1.5 h-5 w-5 flex-shrink-0" xmlns="http://www.w3.org/2000/svg" viewBox="-0.75 -0.75 24 24"><defs></defs><path d="M3.046875 5.15625h16.40625s0.9375 0 0.9375 0.9375v10.3125s0 0.9375 -0.9375 0.9375H3.046875s-0.9375 0 -0.9375 -0.9375v-10.3125s0 -0.9375 0.9375 -0.9375" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></path><path d="m12.568125 10.3125 4.6875 0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></path><path d="m12.568125 13.125 4.6875 0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></path><path d="M5.068124999999999 8.4375h4.6875v4.6875h-4.6875Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></path></svg>
|
|
21
|
+
</a>{% endif %}</span>
|
|
22
|
+
</div>
|
|
23
|
+
</td>
|
|
24
|
+
<td class="whitespace-nowrap px-1 py-2 text-sm text-gray-500 w-1/12">
|
|
25
|
+
{% if field.type %}
|
|
26
|
+
{{ field.type }}
|
|
27
|
+
{% endif %}
|
|
28
|
+
</td>
|
|
29
|
+
<td class="px-3 py-2 text-sm text-gray-500 w-7/12">
|
|
30
|
+
{% if field.description %}
|
|
31
|
+
<div class="text-gray-500">{{ field.description }}</div>
|
|
32
|
+
{% else %}
|
|
33
|
+
<div class="text-gray-400">No description</div>
|
|
34
|
+
{% endif %}
|
|
35
|
+
|
|
36
|
+
{% if field.example %}
|
|
37
|
+
<div class="mt-1 italic">
|
|
38
|
+
Example: <span class="font-mono">{{ field.example }}</span>
|
|
39
|
+
</div>
|
|
40
|
+
{% endif %}
|
|
41
|
+
|
|
42
|
+
{% if field.examples %}
|
|
43
|
+
<div class="mt-1 italic">
|
|
44
|
+
Examples:
|
|
45
|
+
{% for example in field.examples %}
|
|
46
|
+
<span class="font-mono">{{ example }}</span>{% if not loop.last %}, {% endif %}
|
|
47
|
+
{% endfor %}
|
|
48
|
+
</div>
|
|
49
|
+
{% endif %}
|
|
50
|
+
|
|
51
|
+
{% if field.enum %}
|
|
52
|
+
<div class="mt-1 italic">
|
|
53
|
+
Enum:
|
|
54
|
+
{% for enum_value in field.enum %}
|
|
55
|
+
<span class="font-mono">{{ enum_value }}</span>{% if not loop.last %}, {% endif %}
|
|
56
|
+
{% endfor %}
|
|
57
|
+
</div>
|
|
58
|
+
{% endif %}
|
|
59
|
+
<div>
|
|
60
|
+
{% if field.primaryKey or field.primary %}
|
|
61
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">primary</span>
|
|
62
|
+
{% endif %}
|
|
63
|
+
{% if field.required %}
|
|
64
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">required</span>
|
|
65
|
+
{% endif %}
|
|
66
|
+
{% if field.unique %}
|
|
67
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">unique</span>
|
|
68
|
+
{% endif %}
|
|
69
|
+
{% if field.format %}
|
|
70
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">format:{{ field.format }}</span>
|
|
71
|
+
{% endif %}
|
|
72
|
+
{% if field.minLength %}
|
|
73
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">minLength:{{ field.minLength }}</span>
|
|
74
|
+
{% endif %}
|
|
75
|
+
{% if field.maxLength %}
|
|
76
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">maxLength:{{ field.maxLength }}</span>
|
|
77
|
+
{% endif %}
|
|
78
|
+
{% if field.pattern %}
|
|
79
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">pattern:{{ field.pattern }}</span>
|
|
80
|
+
{% endif %}
|
|
81
|
+
{% if field.precision %}
|
|
82
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">precision:{{ field.precision }}</span>
|
|
83
|
+
{% endif %}
|
|
84
|
+
{% if field.scale %}
|
|
85
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">scale:{{ field.scale }}</span>
|
|
86
|
+
{% endif %}
|
|
87
|
+
{% if field.minimum %}
|
|
88
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">minimum:{{ field.minimum }}</span>
|
|
89
|
+
{% endif %}
|
|
90
|
+
{% if field.exclusiveMinimum %}
|
|
91
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">exclusiveMinimum:{{ field.exclusiveMinimum }}</span>
|
|
92
|
+
{% endif %}
|
|
93
|
+
{% if field.maximum %}
|
|
94
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">maximum:{{ field.maximum }}</span>
|
|
95
|
+
{% endif %}
|
|
96
|
+
{% if field.exclusiveMaximum %}
|
|
97
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">exclusiveMaximum:{{ field.exclusiveMaximum }}</span>
|
|
98
|
+
{% endif %}
|
|
99
|
+
{% if field.classification %}
|
|
100
|
+
<span class="inline-flex items-center rounded-md bg-blue-50 px-1 py-1 text-xs font-medium text-blue-600 ring-1 ring-inset ring-blue-500/10 mr-1 mt-1">{{ field.classification }}</span>
|
|
101
|
+
{% endif %}
|
|
102
|
+
{% if field.pii %}
|
|
103
|
+
<span class="inline-flex items-center rounded-md bg-yellow-50 px-1 py-1 text-xs font-medium text-yellow-600 ring-1 ring-inset ring-yellow-500/10 mr-1 mt-1">PII</span>
|
|
104
|
+
{% endif %}
|
|
105
|
+
{% for key, value in field.model_extra.items() %}
|
|
106
|
+
<span class="inline-flex items-center rounded-md bg-gray-50 px-1 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 mr-1 mt-1">{{ key }}:{{ value }}</span>
|
|
107
|
+
{% endfor %}
|
|
108
|
+
{% if field.links %}
|
|
109
|
+
{% for name,href in field.links.items() %}
|
|
110
|
+
<a href="{{ href }}" class="inline-flex items-center px-1 py-1 mr-1 mt-1 text-sky-500 hover:text-gray-700 text-xs font-semibold">{{ name }}</a>
|
|
111
|
+
{% endfor %}
|
|
112
|
+
{% endif %}
|
|
113
|
+
</div>
|
|
114
|
+
{% if field.quality %}
|
|
115
|
+
{% for quality in field.quality %}
|
|
116
|
+
{{ render_partial('partials/quality.html', quality = quality) }}
|
|
117
|
+
{% endfor %}
|
|
118
|
+
{% endif %}
|
|
119
|
+
</td>
|
|
120
|
+
</tr>
|
|
121
|
+
|
|
122
|
+
{% macro render_nested_partial(field_name, field, level) %}
|
|
123
|
+
{{ render_partial('partials/model_field.html', nested=True, field_name=field_name, field=field, level=level + 1) }}
|
|
124
|
+
<!-- Mark the end of the contained fields -->
|
|
125
|
+
<tr style="--tw-divide-y-reverse: 2"></tr>
|
|
126
|
+
{% endmacro %}
|
|
127
|
+
|
|
128
|
+
{% if field.fields %}
|
|
129
|
+
{% for field_name, field in field.fields.items() %}
|
|
130
|
+
{{ render_nested_partial(field_name, field, level) }}
|
|
131
|
+
{% endfor %}
|
|
132
|
+
{% endif %}
|
|
133
|
+
|
|
134
|
+
{% if field.items %}
|
|
135
|
+
{{ render_nested_partial("items", field.items, level) }}
|
|
136
|
+
{% endif %}
|
|
137
|
+
|
|
138
|
+
{% if field.keys %}
|
|
139
|
+
{{ render_nested_partial("keys", field.keys, level) }}
|
|
140
|
+
{% endif %}
|
|
141
|
+
|
|
142
|
+
{% if field.values %}
|
|
143
|
+
{{ render_nested_partial("values", field.values, level) }}
|
|
144
|
+
{% endif %}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<div class="mt-2">
|
|
2
|
+
<span class="italic">Quality | {{quality.type|upper}}:</span> {{ quality.description }}
|
|
3
|
+
{% if quality.type == 'sql' and quality.query %}
|
|
4
|
+
<div class="pl-4">
|
|
5
|
+
Query:
|
|
6
|
+
<div class="ring-1 ring-inset ring-gray-500/10 bg-gray-50 p-2 rounded-md"><pre><code>{{ quality.query }}</code></pre></div>
|
|
7
|
+
{% if quality.mustBe != None %}
|
|
8
|
+
<div>
|
|
9
|
+
Must Be: <span class="font-mono font-bold"> {{quality.mustBe}}</span>
|
|
10
|
+
</div>
|
|
11
|
+
{% endif %}
|
|
12
|
+
{% if quality.mustNotBe != None %}
|
|
13
|
+
<div>
|
|
14
|
+
Must Not Be: <span class="font-mono font-bold"> {{quality.mustNotBe}}</span>
|
|
15
|
+
</div>
|
|
16
|
+
{% endif %}
|
|
17
|
+
{% if quality.mustBeGreaterThan != None %}
|
|
18
|
+
<div>
|
|
19
|
+
Must Be Greater Than: <span class="font-mono font-bold"> {{quality.mustBeGreaterThan}}</span>
|
|
20
|
+
</div>
|
|
21
|
+
{% endif %}
|
|
22
|
+
{% if quality.mustBeGreaterThanOrEqualTo != None %}
|
|
23
|
+
<div>
|
|
24
|
+
Must Be Greater Than Or Equal To: <span class="font-mono font-bold"> {{quality.mustBeGreaterThanOrEqualTo}}</span>
|
|
25
|
+
</div>
|
|
26
|
+
{% endif %}
|
|
27
|
+
{% if quality.mustBeLessThan != None %}
|
|
28
|
+
<div>
|
|
29
|
+
Must Be Less Than: <span class="font-mono font-bold"> {{quality.mustBeLessThan}}</span>
|
|
30
|
+
</div>
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% if quality.mustBeLessThanOrEqualTo != None %}
|
|
33
|
+
<div>
|
|
34
|
+
Must Be Less Than Or Equal To: <span class="font-mono font-bold"> {{quality.mustBeLessThanOrEqualTo}}</span>
|
|
35
|
+
</div>
|
|
36
|
+
{% endif %}
|
|
37
|
+
{% if quality.mustBeBetween %}
|
|
38
|
+
<div>
|
|
39
|
+
Must Be Between: <span class="font-mono font-bold"> {{quality.mustBeBetween|join(' and ')}}</span>
|
|
40
|
+
</div>
|
|
41
|
+
{% endif %}
|
|
42
|
+
{% if quality.mustNotBeBetween %}
|
|
43
|
+
<div>
|
|
44
|
+
Must Not Be Between: <span class="font-mono font-bold"> {{quality.mustNotBeBetween}}</span>
|
|
45
|
+
</div>
|
|
46
|
+
{% endif %}
|
|
47
|
+
</div>
|
|
48
|
+
{% endif %}
|
|
49
|
+
</div>
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<li class="relative flex gap-x-6 px-4 py-5 sm:px-6">
|
|
2
|
+
<div class="flex items-center gap-x-4">
|
|
3
|
+
<div class="sm:flex sm:flex-col">
|
|
4
|
+
<div class="flex flex-col">
|
|
5
|
+
<dt class="text-sm font-medium text-gray-500">Server</dt>
|
|
6
|
+
<dd class="mt-1 text-sm text-gray-900">{{server_name}}</dd>
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
{% if server.environment %}
|
|
12
|
+
<div class="flex items-center gap-x-4">
|
|
13
|
+
<div class="sm:flex sm:flex-col">
|
|
14
|
+
<div class="flex flex-col">
|
|
15
|
+
<dt class="text-sm font-medium text-gray-500">Environment</dt>
|
|
16
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.environment}}</dd>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
{% endif %}
|
|
21
|
+
|
|
22
|
+
{% if server.type %}
|
|
23
|
+
<div class="flex items-center gap-x-4">
|
|
24
|
+
<div class="sm:flex sm:flex-col">
|
|
25
|
+
<div class="flex flex-col">
|
|
26
|
+
<dt class="text-sm font-medium text-gray-500">Type</dt>
|
|
27
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.type}}</dd>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
{% endif %}
|
|
32
|
+
|
|
33
|
+
{% if server.project %}
|
|
34
|
+
<div class="flex items-center gap-x-4">
|
|
35
|
+
<div class="sm:flex sm:flex-col">
|
|
36
|
+
<div class="flex flex-col">
|
|
37
|
+
<dt class="text-sm font-medium text-gray-500">Project</dt>
|
|
38
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.project}}</dd>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
{% endif %}
|
|
43
|
+
|
|
44
|
+
{% if server.dataset %}
|
|
45
|
+
<div class="flex items-center gap-x-4">
|
|
46
|
+
<div class="sm:flex sm:flex-col">
|
|
47
|
+
<div class="flex flex-col">
|
|
48
|
+
<dt class="text-sm font-medium text-gray-500">Dataset</dt>
|
|
49
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.dataset}}</dd>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
{% endif %}
|
|
54
|
+
|
|
55
|
+
{% if server.location %}
|
|
56
|
+
<div class="flex items-center gap-x-4">
|
|
57
|
+
<div class="sm:flex sm:flex-col">
|
|
58
|
+
<div class="flex flex-col">
|
|
59
|
+
<dt class="text-sm font-medium text-gray-500">Location</dt>
|
|
60
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.location}}</dd>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
{% endif %}
|
|
65
|
+
|
|
66
|
+
{% if server.endpointUrl %}
|
|
67
|
+
<div class="flex items-center gap-x-4">
|
|
68
|
+
<div class="sm:flex sm:flex-col">
|
|
69
|
+
<div class="flex flex-col">
|
|
70
|
+
<dt class="text-sm font-medium text-gray-500">Endpoint URL</dt>
|
|
71
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.endpointUrl}}</dd>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
{% endif %}
|
|
76
|
+
|
|
77
|
+
{% if server.account %}
|
|
78
|
+
<div class="flex items-center gap-x-4">
|
|
79
|
+
<div class="sm:flex sm:flex-col">
|
|
80
|
+
<div class="flex flex-col">
|
|
81
|
+
<dt class="text-sm font-medium text-gray-500">Account</dt>
|
|
82
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.account}}</dd>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
{% endif %}
|
|
87
|
+
|
|
88
|
+
{% if server.host %}
|
|
89
|
+
<div class="flex items-center gap-x-4">
|
|
90
|
+
<div class="sm:flex sm:flex-col">
|
|
91
|
+
<div class="flex flex-col">
|
|
92
|
+
<dt class="text-sm font-medium text-gray-500">Host</dt>
|
|
93
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.host}}</dd>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
{% endif %}
|
|
98
|
+
|
|
99
|
+
{% if server.port %}
|
|
100
|
+
<div class="flex items-center gap-x-4">
|
|
101
|
+
<div class="sm:flex sm:flex-col">
|
|
102
|
+
<div class="flex flex-col">
|
|
103
|
+
<dt class="text-sm font-medium text-gray-500">Port</dt>
|
|
104
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.port}}</dd>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
{% endif %}
|
|
109
|
+
|
|
110
|
+
{% if server.catalog %}
|
|
111
|
+
<div class="flex items-center gap-x-4">
|
|
112
|
+
<div class="sm:flex sm:flex-col">
|
|
113
|
+
<div class="flex flex-col">
|
|
114
|
+
<dt class="text-sm font-medium text-gray-500">Catalog</dt>
|
|
115
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.catalog}}</dd>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
{% endif %}
|
|
120
|
+
|
|
121
|
+
{% if server.database %}
|
|
122
|
+
<div class="flex items-center gap-x-4">
|
|
123
|
+
<div class="sm:flex sm:flex-col">
|
|
124
|
+
<div class="flex flex-col">
|
|
125
|
+
<dt class="text-sm font-medium text-gray-500">Database</dt>
|
|
126
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.database}}</dd>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
{% endif %}
|
|
131
|
+
|
|
132
|
+
{% if server.schema_ %}
|
|
133
|
+
<div class="flex items-center gap-x-4">
|
|
134
|
+
<div class="sm:flex sm:flex-col">
|
|
135
|
+
<div class="flex flex-col">
|
|
136
|
+
<dt class="text-sm font-medium text-gray-500">Schema</dt>
|
|
137
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.schema_}}</dd>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
{% endif %}
|
|
142
|
+
|
|
143
|
+
{% if server.topic %}
|
|
144
|
+
<div class="flex items-center gap-x-4">
|
|
145
|
+
<div class="sm:flex sm:flex-col">
|
|
146
|
+
<div class="flex flex-col">
|
|
147
|
+
<dt class="text-sm font-medium text-gray-500">Topic</dt>
|
|
148
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.topic}}</dd>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
{% endif %}
|
|
153
|
+
|
|
154
|
+
{% if server.path %}
|
|
155
|
+
<div class="flex items-center gap-x-4">
|
|
156
|
+
<div class="sm:flex sm:flex-col">
|
|
157
|
+
<div class="flex flex-col">
|
|
158
|
+
<dt class="text-sm font-medium text-gray-500">Path</dt>
|
|
159
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.path}}</dd>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
{% endif %}
|
|
164
|
+
|
|
165
|
+
{% if server.format %}
|
|
166
|
+
<div class="flex items-center gap-x-4">
|
|
167
|
+
<div class="sm:flex sm:flex-col">
|
|
168
|
+
<div class="flex flex-col">
|
|
169
|
+
<dt class="text-sm font-medium text-gray-500">Format</dt>
|
|
170
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.format}}</dd>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
{% endif %}
|
|
175
|
+
|
|
176
|
+
{% if server.delimiter %}
|
|
177
|
+
<div class="flex items-center gap-x-4">
|
|
178
|
+
<div class="sm:flex sm:flex-col">
|
|
179
|
+
<div class="flex flex-col">
|
|
180
|
+
<dt class="text-sm font-medium text-gray-500">Delimiter</dt>
|
|
181
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.delimiter}}</dd>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
{% endif %}
|
|
186
|
+
|
|
187
|
+
{% if server.description %}
|
|
188
|
+
<div class="flex items-center gap-x-4">
|
|
189
|
+
<div class="sm:flex sm:flex-col">
|
|
190
|
+
<div class="flex flex-col">
|
|
191
|
+
<dt class="text-sm font-medium text-gray-500">Description</dt>
|
|
192
|
+
<dd class="mt-1 text-sm text-gray-900">{{server.description}}</dd>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
{% endif %}
|
|
197
|
+
|
|
198
|
+
{% if server.model_extra %}
|
|
199
|
+
{% for key, value in server.model_extra.items() %}
|
|
200
|
+
<div class="flex items-center gap-x-4">
|
|
201
|
+
<div class="sm:flex sm:flex-col">
|
|
202
|
+
<div class="flex flex-col">
|
|
203
|
+
<dt class="text-sm font-medium text-gray-500">{{ key }}</dt>
|
|
204
|
+
<dd class="mt-1 text-sm text-gray-900">{{ value }}</dd>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
{% endfor %}
|
|
209
|
+
{% endif %}
|
|
210
|
+
|
|
211
|
+
</li>
|