From 9a17f53d0d9fbefa051c661ab9291d53c6306252 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Thu, 10 Oct 2024 16:37:15 -0400
Subject: [PATCH 01/40] upgrade firebase.js
---
src/firebase.js | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/firebase.js b/src/firebase.js
index 57562f9f..7111922d 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -13,22 +13,23 @@ const prodConfig = {
// don't need to restrict api keys for firebase but might in some situations.
// To prevent the future foot gun, we are restricting the key now.
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY,
- authDomain: "cioos-metadata-form.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form.firebaseio.com",
- projectId: "cioos-metadata-form",
- storageBucket: "cioos-metadata-form.appspot.com",
- messagingSenderId: "646114203434",
- appId: "1:646114203434:web:bccceadc5144270f98f053",
+ authDomain: "cioos-metadata-form-f8c47.firebaseapp.com",
+ databaseURL: "https://cioos-metadata-form-production.firebaseio.com",
+ projectId: "cioos-metadata-form-f8c47",
+ storageBucket: "cioos-metadata-form-f8c47.appspot.com",
+ messagingSenderId: "1066019404951",
+ appId: "1:1066019404951:web:6d0fb7d59e20b8680b3dd2"
};
const devConfig = {
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY_DEV,
- authDomain: "cioos-metadata-form-dev.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form-dev-default-rtdb.firebaseio.com/",
- projectId: "cioos-metadata-form-dev",
- storageBucket: "cioos-metadata-form-dev.appspot.com",
- messagingSenderId: "392401521083",
- appId: "1:392401521083:web:45d1539f9d284f446d5c9e",
+ authDomain: "cioos-metadata-form-dev-258dc.firebaseapp.com",
+ databaseURL: "https://cioos-metadata-form-development.firebaseio.com",
+ projectId: "cioos-metadata-form-dev-258dc",
+ storageBucket: "cioos-metadata-form-dev-258dc.appspot.com",
+ messagingSenderId: "141560007794",
+ appId: "1:141560007794:web:861d99b02210ea4d17c6eb",
+ measurementId: "G-BSKRHNR1EW"
};
From fd93ba6404960d02fa8e2b140fc48315ab1396dc Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Wed, 16 Oct 2024 15:57:43 -0400
Subject: [PATCH 02/40] upgrade production config to new project firebase
config
---
src/firebase.js | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/firebase.js b/src/firebase.js
index 7111922d..8cd5c36a 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -13,12 +13,13 @@ const prodConfig = {
// don't need to restrict api keys for firebase but might in some situations.
// To prevent the future foot gun, we are restricting the key now.
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY,
- authDomain: "cioos-metadata-form-f8c47.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form-production.firebaseio.com",
- projectId: "cioos-metadata-form-f8c47",
- storageBucket: "cioos-metadata-form-f8c47.appspot.com",
- messagingSenderId: "1066019404951",
- appId: "1:1066019404951:web:6d0fb7d59e20b8680b3dd2"
+ authDomain: "cioos-metadata-form-8d942.firebaseapp.com",
+ databaseURL: "https://cioos-metadata-form-8d942-default-rtdb.firebaseio.com",
+ projectId: "cioos-metadata-form-8d942",
+ storageBucket: "cioos-metadata-form-8d942.appspot.com",
+ messagingSenderId: "467286137979",
+ appId: "1:467286137979:web:250b09e3db2a56716016de",
+ measurementId: "G-BEMJG40RHN"
};
const devConfig = {
From 835a07501572214eab0444a033f025e53d447e63 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 11:46:31 -0400
Subject: [PATCH 03/40] fix databaseURL link to cioos-metadata-form-dev project
---
src/firebase.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/firebase.js b/src/firebase.js
index 8cd5c36a..96019e3b 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -25,7 +25,7 @@ const prodConfig = {
const devConfig = {
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY_DEV,
authDomain: "cioos-metadata-form-dev-258dc.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form-development.firebaseio.com",
+ databaseURL: "https://cioos-metadata-form-dev-258dc-default-rtdb.firebaseio.com",
projectId: "cioos-metadata-form-dev-258dc",
storageBucket: "cioos-metadata-form-dev-258dc.appspot.com",
messagingSenderId: "141560007794",
From 79a08d81452e440395c69f53df1734d9160aa0fc Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:18:08 -0400
Subject: [PATCH 04/40] remove firebase original url dependancy and refactor
some of the code
---
.gitignore | 4 +-
firebase_to_xml/firebase_to_xml/__main__.py | 63 ++++++-------------
.../get_records_from_firebase.py | 10 ++-
firebase_to_xml/pyproject.toml | 19 ++++++
4 files changed, 45 insertions(+), 51 deletions(-)
create mode 100644 firebase_to_xml/pyproject.toml
diff --git a/.gitignore b/.gitignore
index ce230ee1..71bc2d86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,4 +39,6 @@ firebase-debug.log
.Rproj.user
yarn.lock
-.env
\ No newline at end of file
+.env
+firebase_to_xml/build
+output
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index aae5768e..6861a6a4 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -6,23 +6,18 @@
import argparse
import traceback
from pathlib import Path
+import os
import yaml
from dotenv import load_dotenv
from metadata_xml.template_functions import metadata_to_xml
+from loguru import logger
+from tqdm import tqdm
-from firebase_to_xml.get_records_from_firebase import get_records_from_firebase
-from firebase_to_xml.record_json_to_yaml import record_json_to_yaml
+from get_records_from_firebase import get_records_from_firebase
+from record_json_to_yaml import record_json_to_yaml
-def parse_status(status: str):
- """Return a list version fo their status selection"""
-
- if "," in status:
- return status.split(",")
-
- return [status]
-
def get_filename(record):
"""Creates a filename by combinig the title and UUID """
@@ -63,66 +58,46 @@ def main():
],
)
parser.add_argument("--record_url", required=False)
-
+ parser.add_argument("--database_url", default=os.getenv("DATABASE_URL"), required=False, help="Firebase database URL (default: %(default)s)")
args = vars(parser.parse_args())
- region = args["region"]
- record_status = parse_status(args["status"])
-
record_url = args["record_url"]
-
- firebase_auth_key_file = args["key"]
also_save_yaml = args["yaml"]
# get list of records from Firebase
record_list = get_records_from_firebase(
- region, firebase_auth_key_file, record_url, record_status
+ args["region"], args["key"], record_url, args["status"].split(','), args["database_url"]
)
# translate each record to YAML and then to XML
- for record in record_list:
+ for record in tqdm(record_list, desc="Convert records", unit="record"):
# if single record it uses std out, hide info
- if not record_url:
- print(
- "Processing",
- f"'{record['title']['en']}'",
- f"'{record['title']['fr']}'",
- record["identifier"],
- record["recordID"],
- "\n",
- )
-
try:
record_yaml = record_json_to_yaml(record)
organization = record.get("organization", "")
- name = record.get("filename") or get_filename(record)
-
- xml_directory = args["out"]
+ filename = record.get("filename") or get_filename(record)
- xml_directory = "/".join([args["out"], organization])
-
- Path(xml_directory).mkdir(parents=True, exist_ok=True)
+ output_directory = Path(args["out"]) / organization
+ output_directory.mkdir(parents=True, exist_ok=True)
# output yaml
if also_save_yaml:
- filename = f"{xml_directory}/{name}.yaml"
- file = open(filename, "w")
- file.write(yaml.dump(record_yaml, allow_unicode=True, sort_keys=False))
+ yaml_file = output_directory / f"{filename}.yaml"
+ yaml_file.write_text(yaml.dump(record_yaml, allow_unicode=True, sort_keys=False), encoding="utf-8")
# render xml template and write to file
xml = metadata_to_xml(record_yaml)
if record_url:
- print(xml)
- else:
- filename = f"{xml_directory}/{name}.xml"
- file = open(filename, "w")
- file.write(xml)
- print("Wrote " + file.name)
+ logger.info(xml)
+ continue
+
+ xml_file = output_directory / f"{filename}.xml"
+ xml_file.write_text(xml, encoding="utf-8")
except Exception:
- print(traceback.format_exc())
+ logger.error(traceback.format_exc())
if __name__ == "__main__":
diff --git a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
index a11ee807..3aa26a73 100644
--- a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
+++ b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
@@ -5,15 +5,13 @@
"""
import json
-import pprint
import sys
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account
-
def get_records_from_firebase(
- region, firebase_auth_key_file, record_url, record_status, firebase_auth_key_json=None
+ region:str, firebase_auth_key_file:str, record_url:str, record_status:list, database_url:str, firebase_auth_key_json:str=None
):
"""
Returns list of records from firebase for this region,
@@ -44,7 +42,7 @@ def get_records_from_firebase(
if record_url:
response = authed_session.get(
- f"https://cioos-metadata-form.firebaseio.com/{record_url}.json"
+ f"{database_url}{record_url}.json"
)
body = json.loads(response.text)
records.append(body)
@@ -52,12 +50,12 @@ def get_records_from_firebase(
else:
response = authed_session.get(
- f"https://cioos-metadata-form.firebaseio.com/{region}/users.json"
+ f"{database_url}{region}/users.json"
)
body = json.loads(response.text)
# Parse response
- if not body or type(body) != dict :
+ if not body or not isinstance(body, dict) :
print("Region",region,"not found?")
# print(response.content)
sys.exit()
diff --git a/firebase_to_xml/pyproject.toml b/firebase_to_xml/pyproject.toml
new file mode 100644
index 00000000..2262d7ca
--- /dev/null
+++ b/firebase_to_xml/pyproject.toml
@@ -0,0 +1,19 @@
+[project]
+name = "firebase-to-xml"
+version = "0.1.0"
+description = "Python module translates metadata records from Firebase into XML"
+readme = "README.md"
+requires-python = ">=3.12"
+dependencies = [
+ "firebase-to-xml",
+ "google-auth>=2.35.0",
+ "google-oauth>=1.0.1",
+ "loguru>=0.7.2",
+ "metadata-xml",
+ "python-dotenv>=1.0.1",
+ "tqdm>=4.66.5",
+]
+
+[tool.uv.sources]
+metadata-xml = { git = "https://github.com/cioos-siooc/metadata-xml.git" }
+firebase-to-xml = { workspace = true }
From 8921c05ea54c753135dd93278e9449f872fdfd79 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:18:56 -0400
Subject: [PATCH 05/40] drop setup.py
---
firebase_to_xml/.python-version | 1 +
firebase_to_xml/setup.py | 24 --
firebase_to_xml/uv.lock | 378 ++++++++++++++++++++++++++++++++
3 files changed, 379 insertions(+), 24 deletions(-)
create mode 100644 firebase_to_xml/.python-version
delete mode 100644 firebase_to_xml/setup.py
create mode 100644 firebase_to_xml/uv.lock
diff --git a/firebase_to_xml/.python-version b/firebase_to_xml/.python-version
new file mode 100644
index 00000000..e4fba218
--- /dev/null
+++ b/firebase_to_xml/.python-version
@@ -0,0 +1 @@
+3.12
diff --git a/firebase_to_xml/setup.py b/firebase_to_xml/setup.py
deleted file mode 100644
index 756a5b3e..00000000
--- a/firebase_to_xml/setup.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python3
-
-"""
-Setup file for firebase_to_yaml
-"""
-
-from distutils.core import setup
-
-setup(
- name="firebase_to_xml",
- version="0.1",
- description="Python module translates metadata records from" + "Firebase into XML",
- url="https://github.com/cioos-siooc/metadata-entry-form",
- packages=["firebase_to_xml"],
- package_data={'firebase_to_xml': ['resources/*.json']},
- include_package_data=True,
-
- install_requires=[
- "google-auth",
- "google-oauth",
- "python-dotenv",
- "metadata_xml@git+https://github.com/cioos-siooc/metadata-xml.git",
- ],
-)
diff --git a/firebase_to_xml/uv.lock b/firebase_to_xml/uv.lock
new file mode 100644
index 00000000..0f20d1f8
--- /dev/null
+++ b/firebase_to_xml/uv.lock
@@ -0,0 +1,378 @@
+version = 1
+requires-python = ">=3.12"
+
+[[package]]
+name = "cachetools"
+version = "5.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/38/a0f315319737ecf45b4319a8cd1f3a908e29d9277b46942263292115eee7/cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a", size = 27661 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a4/07/14f8ad37f2d12a5ce41206c21820d8cb6561b728e51fad4530dff0552a67/cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", size = 9524 },
+]
+
+[[package]]
+name = "certifi"
+version = "2024.8.30"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 },
+]
+
+[[package]]
+name = "cffi"
+version = "1.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
+ { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
+ { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
+ { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
+ { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
+ { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
+ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
+ { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
+ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
+ { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
+ { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
+ { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
+ { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
+ { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
+ { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
+ { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
+ { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
+ { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
+ { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
+ { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
+ { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
+ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 },
+ { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 },
+ { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 },
+ { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 },
+ { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 },
+ { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 },
+ { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 },
+ { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 },
+ { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 },
+ { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 },
+ { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 },
+ { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 },
+ { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 },
+ { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 },
+ { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 },
+ { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 },
+ { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 },
+ { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 },
+ { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 },
+ { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 },
+ { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 },
+ { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 },
+ { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 },
+ { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 },
+ { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 },
+ { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 },
+ { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 },
+ { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 },
+ { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 },
+ { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 },
+ { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
+]
+
+[[package]]
+name = "cryptography"
+version = "43.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/f3/01fdf26701a26f4b4dbc337a26883ad5bccaa6f1bbbdd29cd89e22f18a1c/cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", size = 6225303 },
+ { url = "https://files.pythonhosted.org/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905 },
+ { url = "https://files.pythonhosted.org/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271 },
+ { url = "https://files.pythonhosted.org/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606 },
+ { url = "https://files.pythonhosted.org/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484 },
+ { url = "https://files.pythonhosted.org/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131 },
+ { url = "https://files.pythonhosted.org/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647 },
+ { url = "https://files.pythonhosted.org/packages/56/48/7b6b190f1462818b324e674fa20d1d5ef3e24f2328675b9b16189cbf0b3c/cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", size = 2623873 },
+ { url = "https://files.pythonhosted.org/packages/eb/b1/0ebff61a004f7f89e7b65ca95f2f2375679d43d0290672f7713ee3162aff/cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", size = 3068039 },
+ { url = "https://files.pythonhosted.org/packages/30/d5/c8b32c047e2e81dd172138f772e81d852c51f0f2ad2ae8a24f1122e9e9a7/cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", size = 6222984 },
+ { url = "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968 },
+ { url = "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754 },
+ { url = "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458 },
+ { url = "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220 },
+ { url = "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898 },
+ { url = "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592 },
+ { url = "https://files.pythonhosted.org/packages/81/1e/ffcc41b3cebd64ca90b28fd58141c5f68c83d48563c88333ab660e002cd3/cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", size = 2623145 },
+ { url = "https://files.pythonhosted.org/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026 },
+]
+
+[[package]]
+name = "decorator"
+version = "5.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
+]
+
+[[package]]
+name = "firebase-to-xml"
+version = "0.1.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "google-auth" },
+ { name = "google-oauth" },
+ { name = "loguru" },
+ { name = "metadata-xml" },
+ { name = "python-dotenv" },
+ { name = "tqdm" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "firebase-to-xml", virtual = "." },
+ { name = "google-auth", specifier = ">=2.35.0" },
+ { name = "google-oauth", specifier = ">=1.0.1" },
+ { name = "loguru", specifier = ">=0.7.2" },
+ { name = "metadata-xml", git = "https://github.com/cioos-siooc/metadata-xml.git" },
+ { name = "python-dotenv", specifier = ">=1.0.1" },
+ { name = "tqdm", specifier = ">=4.66.5" },
+]
+
+[[package]]
+name = "google-auth"
+version = "2.35.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cachetools" },
+ { name = "pyasn1-modules" },
+ { name = "rsa" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a1/37/c854a8b1b1020cf042db3d67577c6f84cd1e8ff6515e4f5498ae9e444ea5/google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a", size = 267223 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/27/1f/3a72917afcb0d5cd842cbccb81bf7a8a7b45b4c66d8dc4556ccb3b016bfc/google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f", size = 208968 },
+]
+
+[[package]]
+name = "google-oauth"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyopenssl" },
+ { name = "requests" },
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f9/4d/bbf432c241095672133a4f22363c0e3937520e480f9e7bd6a3e330526c0f/google-oauth-1.0.1.tar.gz", hash = "sha256:5d26c0d995aafd5f4884424159146c81569b9762ed9516d9fd13c7d6c11cc5aa", size = 5622 }
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+]
+
+[[package]]
+name = "jinja2"
+version = "2.10.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7b/db/1d037ccd626d05a7a47a1b81ea73775614af83c2b3e53d86a0bb41d8d799/Jinja2-2.10.3.tar.gz", hash = "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de", size = 257888 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl", hash = "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", size = 125326 },
+]
+
+[[package]]
+name = "loguru"
+version = "0.7.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "win32-setctime", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9e/30/d87a423766b24db416a46e9335b9602b054a72b96a88a241f2b09b560fa8/loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac", size = 145103 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/03/0a/4f6fed21aa246c6b49b561ca55facacc2a44b87d65b8b92362a8e99ba202/loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb", size = 62549 },
+]
+
+[[package]]
+name = "markupsafe"
+version = "2.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bf/10/ff66fea6d1788c458663a84d88787bae15d45daa16f6b3ef33322a51fc7e/MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", size = 18596 }
+
+[[package]]
+name = "metadata-xml"
+version = "0.1"
+source = { git = "https://github.com/cioos-siooc/metadata-xml.git#0f6c2a94565112c1ef30d680a7cf24c6ac7a7be3" }
+dependencies = [
+ { name = "jinja2" },
+ { name = "markupsafe" },
+ { name = "pyyaml" },
+ { name = "validators" },
+ { name = "yattag" },
+]
+
+[[package]]
+name = "pyasn1"
+version = "0.6.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 },
+]
+
+[[package]]
+name = "pyasn1-modules"
+version = "0.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyasn1" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1d/67/6afbf0d507f73c32d21084a79946bfcfca5fbc62a72057e9c23797a737c9/pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c", size = 310028 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd", size = 181537 },
+]
+
+[[package]]
+name = "pycparser"
+version = "2.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
+]
+
+[[package]]
+name = "pyopenssl"
+version = "24.2.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cryptography" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5d/70/ff56a63248562e77c0c8ee4aefc3224258f1856977e0c1472672b62dadb8/pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", size = 184323 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/dd/e0aa7ebef5168c75b772eda64978c597a9129b46be17779054652a7999e4/pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d", size = 58390 },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
+]
+
+[[package]]
+name = "pyyaml"
+version = "5.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz", hash = "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", size = 265034 }
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+]
+
+[[package]]
+name = "rsa"
+version = "4.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyasn1" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 },
+]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 },
+]
+
+[[package]]
+name = "tqdm"
+version = "4.66.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "platform_system == 'Windows'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", size = 78351 },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 },
+]
+
+[[package]]
+name = "validators"
+version = "0.20.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "decorator" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/14/ed0af6865d378cfc3c504aed0d278a890cbefb2f1934bf2dbe92ecf9d6b1/validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a", size = 30665 }
+
+[[package]]
+name = "win32-setctime"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6b/dd/f95a13d2b235a28d613ba23ebad55191514550debb968b46aab99f2e3a30/win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2", size = 3676 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/e6/a7d828fef907843b2a5773ebff47fb79ac0c1c88d60c0ca9530ee941e248/win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad", size = 3604 },
+]
+
+[[package]]
+name = "yattag"
+version = "1.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/dc/53ce10a508df291c973293535536961fdc014de088cf0c9534165af880d5/yattag-1.14.0.tar.gz", hash = "sha256:5731a31cb7452c0c6930dd1a284e0170b39eee959851a2aceb8d6af4134a5fa8", size = 26857 }
From af9dd9055b01208c3821ec5d7a1a49691c8cf4d2 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:21:37 -0400
Subject: [PATCH 06/40] add ruff dependancies for development
---
firebase_to_xml/pyproject.toml | 5 +++++
firebase_to_xml/uv.lock | 33 +++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/firebase_to_xml/pyproject.toml b/firebase_to_xml/pyproject.toml
index 2262d7ca..39873c0b 100644
--- a/firebase_to_xml/pyproject.toml
+++ b/firebase_to_xml/pyproject.toml
@@ -14,6 +14,11 @@ dependencies = [
"tqdm>=4.66.5",
]
+[tool.uv]
+dev-dependencies = [
+ "ruff>=0.7.0",
+]
+
[tool.uv.sources]
metadata-xml = { git = "https://github.com/cioos-siooc/metadata-xml.git" }
firebase-to-xml = { workspace = true }
diff --git a/firebase_to_xml/uv.lock b/firebase_to_xml/uv.lock
index 0f20d1f8..54880608 100644
--- a/firebase_to_xml/uv.lock
+++ b/firebase_to_xml/uv.lock
@@ -151,6 +151,11 @@ dependencies = [
{ name = "tqdm" },
]
+[package.dev-dependencies]
+dev = [
+ { name = "ruff" },
+]
+
[package.metadata]
requires-dist = [
{ name = "firebase-to-xml", virtual = "." },
@@ -162,6 +167,9 @@ requires-dist = [
{ name = "tqdm", specifier = ">=4.66.5" },
]
+[package.metadata.requires-dev]
+dev = [{ name = "ruff", specifier = ">=0.7.0" }]
+
[[package]]
name = "google-auth"
version = "2.35.0"
@@ -323,6 +331,31 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 },
]
+[[package]]
+name = "ruff"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/c7/f3367d1da5d568192968c5c9e7f3d51fb317b9ac04828493b23d8fce8ce6/ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b", size = 3146645 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/48/59/a0275a0913f3539498d116046dd679cd657fe3b7caf5afe1733319414932/ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628", size = 10434007 },
+ { url = "https://files.pythonhosted.org/packages/cd/94/da0ba5f956d04c90dd899209904210600009dcda039ce840d83eb4298c7d/ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737", size = 10048066 },
+ { url = "https://files.pythonhosted.org/packages/57/1d/e5cc149ecc46e4f203403a79ccd170fad52d316f98b87d0f63b1945567db/ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06", size = 9711389 },
+ { url = "https://files.pythonhosted.org/packages/05/67/fb7ea2c869c539725a16c5bc294e9aa34f8b1b6fe702f1d173a5da517c2b/ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be", size = 10755174 },
+ { url = "https://files.pythonhosted.org/packages/5f/f0/13703bc50536a0613ea3dce991116e5f0917a1f05528c6ab738b33c08d3f/ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa", size = 10196040 },
+ { url = "https://files.pythonhosted.org/packages/99/c1/77b04ab20324ab03d333522ee55fb0f1c38e3ca0d326b4905f82ce6b6c70/ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495", size = 11033684 },
+ { url = "https://files.pythonhosted.org/packages/f2/97/f463334dc4efeea3551cd109163df15561c18a1c3ec13d51643740fd36ba/ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598", size = 11803700 },
+ { url = "https://files.pythonhosted.org/packages/b4/f8/a31d40c4bb92933d376a53e7c5d0245d9b27841357e4820e96d38f54b480/ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e", size = 11347848 },
+ { url = "https://files.pythonhosted.org/packages/83/62/0c133b35ddaf91c65c30a56718b80bdef36bfffc35684d29e3a4878e0ea3/ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914", size = 12480632 },
+ { url = "https://files.pythonhosted.org/packages/46/96/464058dd1d980014fb5aa0a1254e78799efb3096fc7a4823cd66a1621276/ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9", size = 10941919 },
+ { url = "https://files.pythonhosted.org/packages/a0/f7/bda37ec77986a435dde44e1f59374aebf4282a5fa9cf17735315b847141f/ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4", size = 10745519 },
+ { url = "https://files.pythonhosted.org/packages/c2/33/5f77fc317027c057b61a848020a47442a1cbf12e592df0e41e21f4d0f3bd/ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9", size = 10284872 },
+ { url = "https://files.pythonhosted.org/packages/ff/50/98aec292bc9537f640b8d031c55f3414bf15b6ed13b3e943fed75ac927b9/ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d", size = 10600334 },
+ { url = "https://files.pythonhosted.org/packages/f2/85/12607ae3201423a179b8cfadc7cb1e57d02cd0135e45bd0445acb4cef327/ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11", size = 11017333 },
+ { url = "https://files.pythonhosted.org/packages/d4/7f/3b85a56879e705d5f46ec14daf8a439fca05c3081720fe3dc3209100922d/ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec", size = 8570962 },
+ { url = "https://files.pythonhosted.org/packages/39/9f/c5ee2b40d377354dabcc23cff47eb299de4b4d06d345068f8f8cc1eadac8/ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2", size = 9365544 },
+ { url = "https://files.pythonhosted.org/packages/89/8b/ee1509f60148cecba644aa718f6633216784302458340311898aaf0b1bed/ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e", size = 8695763 },
+]
+
[[package]]
name = "six"
version = "1.16.0"
From 06300a09afd8bb6672213ce4d0faaf5163e16f82 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:22:17 -0400
Subject: [PATCH 07/40] ruff format .
---
firebase_to_xml/firebase_to_xml/__main__.py | 28 +++--
.../get_records_from_firebase.py | 20 ++--
.../firebase_to_xml/record_json_to_yaml.py | 106 +++++++++++-------
firebase_to_xml/firebase_to_xml/scrubbers.py | 5 +-
4 files changed, 100 insertions(+), 59 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index 6861a6a4..51678f21 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -3,6 +3,7 @@
"""
Command line interface to part of firebase_to_xml
"""
+
import argparse
import traceback
from pathlib import Path
@@ -18,9 +19,8 @@
from record_json_to_yaml import record_json_to_yaml
-
def get_filename(record):
- """Creates a filename by combinig the title and UUID """
+ """Creates a filename by combinig the title and UUID"""
name = record["title"][record["language"]][0:30] + "_" + record["identifier"][0:5]
char_list = [
character if character.isalnum() else "_" for character in name.strip().lower()
@@ -43,9 +43,7 @@ def main():
parser.add_argument(
"--yaml", action="store_true", help="Whether to output yaml file as well as xml"
)
- parser.add_argument(
- "--region", required=True, help="Eg pacific/stlaurent/atlantic"
- )
+ parser.add_argument("--region", required=True, help="Eg pacific/stlaurent/atlantic")
parser.add_argument(
"--status",
default="published",
@@ -58,7 +56,12 @@ def main():
],
)
parser.add_argument("--record_url", required=False)
- parser.add_argument("--database_url", default=os.getenv("DATABASE_URL"), required=False, help="Firebase database URL (default: %(default)s)")
+ parser.add_argument(
+ "--database_url",
+ default=os.getenv("DATABASE_URL"),
+ required=False,
+ help="Firebase database URL (default: %(default)s)",
+ )
args = vars(parser.parse_args())
record_url = args["record_url"]
@@ -66,7 +69,11 @@ def main():
# get list of records from Firebase
record_list = get_records_from_firebase(
- args["region"], args["key"], record_url, args["status"].split(','), args["database_url"]
+ args["region"],
+ args["key"],
+ record_url,
+ args["status"].split(","),
+ args["database_url"],
)
# translate each record to YAML and then to XML
@@ -85,7 +92,10 @@ def main():
# output yaml
if also_save_yaml:
yaml_file = output_directory / f"{filename}.yaml"
- yaml_file.write_text(yaml.dump(record_yaml, allow_unicode=True, sort_keys=False), encoding="utf-8")
+ yaml_file.write_text(
+ yaml.dump(record_yaml, allow_unicode=True, sort_keys=False),
+ encoding="utf-8",
+ )
# render xml template and write to file
xml = metadata_to_xml(record_yaml)
@@ -94,7 +104,7 @@ def main():
continue
xml_file = output_directory / f"{filename}.xml"
- xml_file.write_text(xml, encoding="utf-8")
+ xml_file.write_text(xml, encoding="utf-8")
except Exception:
logger.error(traceback.format_exc())
diff --git a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
index 3aa26a73..65f617d4 100644
--- a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
+++ b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
@@ -10,8 +10,14 @@
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account
+
def get_records_from_firebase(
- region:str, firebase_auth_key_file:str, record_url:str, record_status:list, database_url:str, firebase_auth_key_json:str=None
+ region: str,
+ firebase_auth_key_file: str,
+ record_url: str,
+ record_status: list,
+ database_url: str,
+ firebase_auth_key_json: str = None,
):
"""
Returns list of records from firebase for this region,
@@ -41,22 +47,18 @@ def get_records_from_firebase(
records = []
if record_url:
- response = authed_session.get(
- f"{database_url}{record_url}.json"
- )
+ response = authed_session.get(f"{database_url}{record_url}.json")
body = json.loads(response.text)
records.append(body)
return records
else:
- response = authed_session.get(
- f"{database_url}{region}/users.json"
- )
+ response = authed_session.get(f"{database_url}{region}/users.json")
body = json.loads(response.text)
# Parse response
- if not body or not isinstance(body, dict) :
- print("Region",region,"not found?")
+ if not body or not isinstance(body, dict):
+ print("Region", region, "not found?")
# print(response.content)
sys.exit()
diff --git a/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py b/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
index 89529ce8..61f558fc 100644
--- a/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
+++ b/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
@@ -8,43 +8,49 @@
import json
from firebase_to_xml.scrubbers import scrub_dict, scrub_keys, remove_nones
import os
+
dir = os.path.dirname(os.path.realpath(__file__))
+
def get_licenses():
- with open(dir + '/resources/licenses.json') as f:
+ with open(dir + "/resources/licenses.json") as f:
return json.load(f)
+
def get_eov_translations():
- with open(dir + '/resources/eov.json') as f:
- eovs= json.load(f)
- translation={}
+ with open(dir + "/resources/eov.json") as f:
+ eovs = json.load(f)
+ translation = {}
for eov in eovs:
- translation[eov['value']]=eov['label FR']
+ translation[eov["value"]] = eov["label FR"]
return translation
def get_epsg():
- with open(dir + '/resources/epsg.json') as f:
+ with open(dir + "/resources/epsg.json") as f:
epsgDict = {}
epsgJson = json.load(f)
if epsgJson:
- epsgDict = {str(x['Code']): x for x in epsgJson}
+ epsgDict = {str(x["Code"]): x for x in epsgJson}
return epsgDict
-licenses=get_licenses()
-eov_translations=get_eov_translations()
+
+licenses = get_licenses()
+eov_translations = get_eov_translations()
epsg = get_epsg()
def eovs_to_fr(eovs_en):
- """ Translate a list of EOVs in english to a list in french"""
- return [eov_translations.get(eov,"") for eov in eovs_en if eov]
+ """Translate a list of EOVs in english to a list in french"""
+ return [eov_translations.get(eov, "") for eov in eovs_en if eov]
+
def verify_translation(verified, message):
if not verified:
return message
return ""
+
def strip_keywords(keywords):
"""Strips whitespace from each keyword in either language"""
stripped = {
@@ -61,33 +67,40 @@ def date_from_datetime_str(datetime_str):
return None
return (datetime_str or "")[:10]
+
def fix_lat_long_polygon(polygon):
"""Change lat,long to long, lat, which is what is expected in the XML"""
if not polygon:
return ""
fixed = []
- cleanPolygon = polygon.replace(", ",",")
+ cleanPolygon = polygon.replace(", ", ",")
coords = cleanPolygon.split(" ")
for coord in coords:
[lat, long] = coord.split(",")
fixed.append(",".join([long, lat]))
return " ".join(fixed)
+
def format_taxa(taxa):
taxaKeywords = []
if isinstance(taxa, str):
taxa = [taxa]
for t in taxa:
- taxaKeywords = taxaKeywords + ",".join(filter(None, (
- t.get("kingdom"),
- t.get("phylum"),
- t.get("class"),
- t.get("order"),
- t.get("family"),
- t.get("genus"),
- t.get("species")
- ))).split(",")
-
+ taxaKeywords = taxaKeywords + ",".join(
+ filter(
+ None,
+ (
+ t.get("kingdom"),
+ t.get("phylum"),
+ t.get("class"),
+ t.get("order"),
+ t.get("family"),
+ t.get("genus"),
+ t.get("species"),
+ ),
+ )
+ ).split(",")
+
return taxaKeywords
@@ -102,7 +115,6 @@ def record_json_to_yaml(record):
base_url = "https://cioos-siooc.github.io/metadata-entry-form#"
full_url = f"{base_url}/{language}/{region}/{user_id}/{record_id}"
-
polygon = record.get("map", {}).get("polygon", "")
record_yaml = {
@@ -110,8 +122,7 @@ def record_json_to_yaml(record):
"naming_authority": "ca.cioos",
"identifier": record.get("identifier"),
"language": record.get("language"),
- "maintenance_note": "Generated from "
- + full_url,
+ "maintenance_note": "Generated from " + full_url,
"use_constraints": {
"limitations": record.get("limitations", "None"),
"licence": licenses.get(
@@ -139,13 +150,19 @@ def record_json_to_yaml(record):
else "",
"polygon": fix_lat_long_polygon(polygon),
"vertical": [
- 0 if record.get("noVerticalExtent") else float(
- record.get("verticalExtentMin")),
- 0 if record.get("noVerticalExtent") else float(
- record.get("verticalExtentMax")),
+ 0
+ if record.get("noVerticalExtent")
+ else float(record.get("verticalExtentMin")),
+ 0
+ if record.get("noVerticalExtent")
+ else float(record.get("verticalExtentMax")),
],
- "vertical_positive": "heightPositive" if record.get("noVerticalExtent") else record.get("verticalExtentDirection"),
- "vertical_epsg": epsg.get("5829") if record.get("noVerticalExtent") else epsg.get(record.get("verticalExtentEPSG")),
+ "vertical_positive": "heightPositive"
+ if record.get("noVerticalExtent")
+ else record.get("verticalExtentDirection"),
+ "vertical_epsg": epsg.get("5829")
+ if record.get("noVerticalExtent")
+ else epsg.get(record.get("verticalExtentEPSG")),
"description": record["map"].get("description"),
"descriptionIdentifier": record["map"].get("descriptionIdentifier"),
},
@@ -161,8 +178,14 @@ def record_json_to_yaml(record):
},
"keywords": {
"default": strip_keywords(record.get("keywords", {"en": [], "fr": []})),
- "eov": {"en": record.get("eov",[]), "fr": eovs_to_fr(record.get("eov",[]))},
- "taxa": {"en": format_taxa(record.get("taxa",[])), "fr": format_taxa(record.get("taxa",[]))}
+ "eov": {
+ "en": record.get("eov", []),
+ "fr": eovs_to_fr(record.get("eov", [])),
+ },
+ "taxa": {
+ "en": format_taxa(record.get("taxa", [])),
+ "fr": format_taxa(record.get("taxa", [])),
+ },
},
"temporal_begin": record.get("dateStart"),
"temporal_end": record.get("dateEnd"),
@@ -184,7 +207,14 @@ def record_json_to_yaml(record):
"ror": contact.get("orgRor"),
},
"individual": {
- "name": ", ".join(remove_nones([contact.get("lastName") or None, contact.get("givenNames") or None])),
+ "name": ", ".join(
+ remove_nones(
+ [
+ contact.get("lastName") or None,
+ contact.get("givenNames") or None,
+ ]
+ )
+ ),
"position": contact.get("indPosition"),
"email": contact.get("indEmail"),
"orcid": contact.get("indOrcid"),
@@ -203,14 +233,14 @@ def record_json_to_yaml(record):
],
}
- if record.get("noTaxa") and record_yaml.get("identification",{}).get("keywords"):
+ if record.get("noTaxa") and record_yaml.get("identification", {}).get("keywords"):
record_yaml["identification"]["keywords"].pop("taxa", None)
-
+
if record.get("noPlatform"):
record_yaml["instruments"] = record.get("instruments")
else:
- instrumentsList = record.get("instruments",[])
- platformList = record.get("platforms",[])
+ instrumentsList = record.get("instruments", [])
+ platformList = record.get("platforms", [])
# If platforms has only one element, add it to the platform dict and add all instruments as a key
if len(platformList) == 1:
record["platforms"][0]["instruments"] = instrumentsList
diff --git a/firebase_to_xml/firebase_to_xml/scrubbers.py b/firebase_to_xml/firebase_to_xml/scrubbers.py
index b79121c2..26118c09 100644
--- a/firebase_to_xml/firebase_to_xml/scrubbers.py
+++ b/firebase_to_xml/firebase_to_xml/scrubbers.py
@@ -18,7 +18,7 @@ def scrub_dict(d_in):
val = scrub_dict(val)
if isinstance(val, list):
val = scrub_list(val)
- if val not in (u"", None, {}):
+ if val not in ("", None, {}):
new_dict[key] = val
return new_dict
@@ -41,5 +41,4 @@ def scrub_keys(d_in):
scrubbed[k] = d_in[k]
return scrubbed
-def remove_nones(l):
- return list(filter(lambda item: item is not None, l))
+
From 81328b03dfeb40b5527236b202ec242ea3492b1e Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:22:42 -0400
Subject: [PATCH 08/40] ruff check fix .
---
firebase_to_xml/firebase_to_xml/scrubbers.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/firebase_to_xml/firebase_to_xml/scrubbers.py b/firebase_to_xml/firebase_to_xml/scrubbers.py
index 26118c09..a4524570 100644
--- a/firebase_to_xml/firebase_to_xml/scrubbers.py
+++ b/firebase_to_xml/firebase_to_xml/scrubbers.py
@@ -42,3 +42,5 @@ def scrub_keys(d_in):
return scrubbed
+def remove_nones(items):
+ return list(filter(lambda item: item is not None, items))
From 3d73ff220819c0ccfe28dc1b23495c6e007ceb39 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:33:05 -0400
Subject: [PATCH 09/40] add encoding cli input
---
firebase_to_xml/firebase_to_xml/__main__.py | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index 51678f21..b8507395 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -62,10 +62,14 @@ def main():
required=False,
help="Firebase database URL (default: %(default)s)",
)
+ parser.add_argument(
+ "--encoding",default="utf-8", required=False, help="Encoding of the output files"
+ )
args = vars(parser.parse_args())
record_url = args["record_url"]
also_save_yaml = args["yaml"]
+ encoding=args["encoding"]
# get list of records from Firebase
record_list = get_records_from_firebase(
@@ -94,7 +98,7 @@ def main():
yaml_file = output_directory / f"{filename}.yaml"
yaml_file.write_text(
yaml.dump(record_yaml, allow_unicode=True, sort_keys=False),
- encoding="utf-8",
+ encoding=encoding,
)
# render xml template and write to file
@@ -104,7 +108,7 @@ def main():
continue
xml_file = output_directory / f"{filename}.xml"
- xml_file.write_text(xml, encoding="utf-8")
+ xml_file.write_text(xml, encoding=encoding)
except Exception:
logger.error(traceback.format_exc())
From 3d95bdb4c691e93f0c73510746a2c72e87698321 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:33:22 -0400
Subject: [PATCH 10/40] drop print line
---
firebase_to_xml/firebase_to_xml/get_records_from_firebase.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
index 65f617d4..9ea934af 100644
--- a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
+++ b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
@@ -9,7 +9,7 @@
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account
-
+from loguru import logger
def get_records_from_firebase(
region: str,
@@ -58,8 +58,7 @@ def get_records_from_firebase(
# Parse response
if not body or not isinstance(body, dict):
- print("Region", region, "not found?")
- # print(response.content)
+ logger.warning("Region", region, "not found?")
sys.exit()
for users_tree in body.values():
From 82eceb4b926113b510c333cac937e303bb3067fc Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:35:29 -0400
Subject: [PATCH 11/40] refactor call
---
firebase_to_xml/firebase_to_xml/__main__.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index b8507395..37cbde02 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -73,11 +73,11 @@ def main():
# get list of records from Firebase
record_list = get_records_from_firebase(
- args["region"],
- args["key"],
- record_url,
- args["status"].split(","),
- args["database_url"],
+ region=args["region"],
+ firebase_auth_key_file=args["key"],
+ record_url=record_url,
+ record_status=args["status"].split(","),
+ database_url=args["database_url"],
)
# translate each record to YAML and then to XML
From 7c6efa5c2381239b01b19d6b8d94af4447569cd2 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:36:24 -0400
Subject: [PATCH 12/40] ruff format .
---
firebase_to_xml/firebase_to_xml/__main__.py | 7 +++++--
.../firebase_to_xml/get_records_from_firebase.py | 1 +
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index 37cbde02..5058d870 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -63,13 +63,16 @@ def main():
help="Firebase database URL (default: %(default)s)",
)
parser.add_argument(
- "--encoding",default="utf-8", required=False, help="Encoding of the output files"
+ "--encoding",
+ default="utf-8",
+ required=False,
+ help="Encoding of the output files",
)
args = vars(parser.parse_args())
record_url = args["record_url"]
also_save_yaml = args["yaml"]
- encoding=args["encoding"]
+ encoding = args["encoding"]
# get list of records from Firebase
record_list = get_records_from_firebase(
diff --git a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
index 9ea934af..5d789146 100644
--- a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
+++ b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
@@ -11,6 +11,7 @@
from google.oauth2 import service_account
from loguru import logger
+
def get_records_from_firebase(
region: str,
firebase_auth_key_file: str,
From 4c6f7d032b7c383a929f5cd93a780bd238002db2 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:37:06 -0400
Subject: [PATCH 13/40] sort imports with ruff
---
firebase_to_xml/firebase_to_xml/__main__.py | 9 ++++-----
firebase_to_xml/firebase_to_xml/record_json_to_yaml.py | 3 ++-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index 5058d870..0c68c5c5 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -5,18 +5,17 @@
"""
import argparse
+import os
import traceback
from pathlib import Path
-import os
import yaml
from dotenv import load_dotenv
-from metadata_xml.template_functions import metadata_to_xml
-from loguru import logger
-from tqdm import tqdm
-
from get_records_from_firebase import get_records_from_firebase
+from loguru import logger
+from metadata_xml.template_functions import metadata_to_xml
from record_json_to_yaml import record_json_to_yaml
+from tqdm import tqdm
def get_filename(record):
diff --git a/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py b/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
index 61f558fc..75754441 100644
--- a/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
+++ b/firebase_to_xml/firebase_to_xml/record_json_to_yaml.py
@@ -6,9 +6,10 @@
"""
import json
-from firebase_to_xml.scrubbers import scrub_dict, scrub_keys, remove_nones
import os
+from firebase_to_xml.scrubbers import remove_nones, scrub_dict, scrub_keys
+
dir = os.path.dirname(os.path.realpath(__file__))
From 70007f1f9244da6564e3fd310f67d390c76264a6 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Wed, 23 Oct 2024 13:03:31 -0400
Subject: [PATCH 14/40] add missing comma to firebase.js
---
src/firebase.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/firebase.js b/src/firebase.js
index 96019e3b..0e9eb3a6 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -19,7 +19,7 @@ const prodConfig = {
storageBucket: "cioos-metadata-form-8d942.appspot.com",
messagingSenderId: "467286137979",
appId: "1:467286137979:web:250b09e3db2a56716016de",
- measurementId: "G-BEMJG40RHN"
+ measurementId: "G-BEMJG40RHN",
};
const devConfig = {
@@ -30,7 +30,7 @@ const devConfig = {
storageBucket: "cioos-metadata-form-dev-258dc.appspot.com",
messagingSenderId: "141560007794",
appId: "1:141560007794:web:861d99b02210ea4d17c6eb",
- measurementId: "G-BSKRHNR1EW"
+ measurementId: "G-BSKRHNR1EW",
};
From 25dcf3a9a9ffc1f86362e6b0475838864da505b1 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Wed, 23 Oct 2024 13:36:41 -0400
Subject: [PATCH 15/40] update firebase projects to match new ones
---
.firebaserc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.firebaserc b/.firebaserc
index 7536d832..56c94657 100644
--- a/.firebaserc
+++ b/.firebaserc
@@ -1,7 +1,7 @@
{
"projects": {
- "default": "cioos-metadata-form",
- "dev": "cioos-metadata-form-dev"
+ "default": "cioos-metadata-form-8d942",
+ "dev": "cioos-metadata-form-dev-258dc"
},
"targets": {},
"etags": {}
From 19ec7bd5f0564abce3d317007293286419ddbbcd Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Wed, 23 Oct 2024 13:45:46 -0400
Subject: [PATCH 16/40] update projectids
---
.../firebase-hosting-delete-channel.yml | 2 +-
.../workflows/firebase-hosting-pull-request.yml | 2 +-
README.md | 16 ++++++++--------
firebase-functions/.firebaserc | 12 ++++++------
src/firebase.js | 10 +++++-----
5 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/.github/workflows/firebase-hosting-delete-channel.yml b/.github/workflows/firebase-hosting-delete-channel.yml
index 948de945..924fd6d3 100644
--- a/.github/workflows/firebase-hosting-delete-channel.yml
+++ b/.github/workflows/firebase-hosting-delete-channel.yml
@@ -19,5 +19,5 @@ jobs:
args: hosting:channel:delete pr${{github.event.number}}-${{steps.get-short-name.outputs.id}} --force
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
- PROJECT_ID: cioos-metadata-form-dev
+ PROJECT_ID: cioos-metadata-form-dev-258dc
GITHUB_AUTH: ${{ secrets.ISSUE_CREATOR_PAT }}
\ No newline at end of file
diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml
index 0b1d48b5..7053ac45 100644
--- a/.github/workflows/firebase-hosting-pull-request.yml
+++ b/.github/workflows/firebase-hosting-pull-request.yml
@@ -26,7 +26,7 @@ jobs:
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_CIOOS_METADATA_FORM }}'
expires: 30d
entryPoint: '.'
- projectId: cioos-metadata-form-dev
+ projectId: cioos-metadata-form-dev-258dc
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
GMAIL_USER: ${{ secrets.GMAIL_USER }}
diff --git a/README.md b/README.md
index 470bb5cc..94084ef1 100644
--- a/README.md
+++ b/README.md
@@ -73,12 +73,12 @@ We use a GitHub Actions workflow named `firebase-deploy` for deploying Firebase
### Deploying to Development Project
-To deploy updated Firebase functions to the "cioos-metadata-form-dev" development project, follow these steps:
+To deploy updated Firebase functions to the "cioos-metadata-form-dev-258dc" development project, follow these steps:
-1. **Ensure your local setup is linked to the correct Firebase project** by using the Firebase CLI to login and select the "cioos-metadata-form-dev" project.
+1. **Ensure your local setup is linked to the correct Firebase project** by using the Firebase CLI to login and select the "cioos-metadata-form-dev-258dc" project.
```bash
- firebase use cioos-metadata-form-dev
+ firebase use cioos-metadata-form-dev-258dc
```
2. **Make necessary changes to your Firebase functions.**
@@ -103,7 +103,7 @@ The workflow utilizes the following secrets to create the virtual `.env` file fo
- `GITHUB_AUTH` used to push to github pages branch and other github action type stuff
- `REACT_APP_DEV_DEPLOYMENT` used to switch between development and production databases. Default False, set to True to use Dev database
- `REACT_APP_GOOGLE_CLOUD_API_KEY` found at https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form
-- `REACT_APP_GOOGLE_CLOUD_API_KEY_DEV` found at https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form-dev
+- `REACT_APP_GOOGLE_CLOUD_API_KEY_DEV` found at https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form-dev-258dc
### Using Parameterized Configuration in Firebase Functions
@@ -137,12 +137,12 @@ Deploying Firebase Realtime Database security rules via the Firebase CLI is reco
### Define targets
-This project has two databases: `cioos-metadata-form` (this is the default/main db for production) and `cioos-metadata-form-dev` (dev).
+This project has two databases: `cioos-metadata-form` (this is the default/main db for production) and `cioos-metadata-form-dev-258dc` (dev).
Use Firebase CLI targets to manage rules deployment:
```bash
firebase target:apply database prod cioos-metadata-form
-firebase target:apply database dev cioos-metadata-form-dev
+firebase target:apply database dev cioos-metadata-form-dev-258dc
```
### Configure firebase.json
@@ -188,10 +188,10 @@ When hosting the application in a new place there are a couple of things to upda
- You must add your new domain to the allowed list for authenication in firebase.
https://console.firebase.google.com/u/0/project/cioos-metadata-form/authentication/settings
- https://console.firebase.google.com/u/0/project/cioos-metadata-form-dev/authentication/settings
+ https://console.firebase.google.com/u/0/project/cioos-metadata-form-dev-258dc/authentication/settings
- You have to allow your domain under Website restrictions for the firebase browser key
https://console.cloud.google.com/apis/credentials/key/405d637a-efd4-48f5-95c6-f0af1d7f4889?project=cioos-metadata-form
- https://console.cloud.google.com/apis/credentials/key/23d360a3-4b55-43f2-bc1c-b485371c0e07?project=cioos-metadata-form-dev
+ https://console.cloud.google.com/apis/credentials/key/23d360a3-4b55-43f2-bc1c-b485371c0e07?project=cioos-metadata-form-dev-258dc
\ No newline at end of file
diff --git a/firebase-functions/.firebaserc b/firebase-functions/.firebaserc
index 71dcf944..c52d8663 100644
--- a/firebase-functions/.firebaserc
+++ b/firebase-functions/.firebaserc
@@ -1,26 +1,26 @@
{
"projects": {
- "default": "cioos-metadata-form",
- "dev": "cioos-metadata-form-dev"
+ "default": "cioos-metadata-form-8d942",
+ "dev": "cioos-metadata-form-dev-258dc"
},
"targets": {
"cioos-metadata-form": {
"database": {
"prod": [
- "cioos-metadata-form"
+ "cioos-metadata-form-8d942"
],
"dev": [
- "cioos-metadata-form-dev"
+ "cioos-metadata-form-dev-258dc"
]
}
},
"development": {
"database": {
"prod": [
- "cioos-metadata-form"
+ "cioos-metadata-form-8d942"
],
"dev": [
- "cioos-metadata-form-dev"
+ "cioos-metadata-form-dev-258dc"
]
}
}
diff --git a/src/firebase.js b/src/firebase.js
index 0e9eb3a6..a6a4c6a5 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -6,7 +6,7 @@ const deployedOnTestServer = process.env.REACT_APP_DEV_DEPLOYMENT;
const prodConfig = {
// see https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form
- // and https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form-dev
+ // and https://console.cloud.google.com/apis/credentials?project=cioos-metadata-form-dev-258dc
// for api key location which is then stored in a github secret and added to several
// github actions to support testing and deployment.
// see https://firebase.google.com/docs/projects/api-keys for a discussion of why we
@@ -24,10 +24,10 @@ const prodConfig = {
const devConfig = {
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY_DEV,
- authDomain: "cioos-metadata-form-dev-258dc.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form-dev-258dc-default-rtdb.firebaseio.com",
- projectId: "cioos-metadata-form-dev-258dc",
- storageBucket: "cioos-metadata-form-dev-258dc.appspot.com",
+ authDomain: "cioos-metadata-form-dev-258dc-258dc.firebaseapp.com",
+ databaseURL: "https://cioos-metadata-form-dev-258dc-258dc-default-rtdb.firebaseio.com",
+ projectId: "cioos-metadata-form-dev-258dc-258dc",
+ storageBucket: "cioos-metadata-form-dev-258dc-258dc.appspot.com",
messagingSenderId: "141560007794",
appId: "1:141560007794:web:861d99b02210ea4d17c6eb",
measurementId: "G-BSKRHNR1EW",
From c81d7f42f13df494edbcb00b833e95b6ea67e6dc Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Wed, 23 Oct 2024 14:05:38 -0400
Subject: [PATCH 17/40] fix dev firebase config
---
src/firebase.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/firebase.js b/src/firebase.js
index a6a4c6a5..8a080fcc 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -24,10 +24,10 @@ const prodConfig = {
const devConfig = {
apiKey: process.env.REACT_APP_GOOGLE_CLOUD_API_KEY_DEV,
- authDomain: "cioos-metadata-form-dev-258dc-258dc.firebaseapp.com",
- databaseURL: "https://cioos-metadata-form-dev-258dc-258dc-default-rtdb.firebaseio.com",
- projectId: "cioos-metadata-form-dev-258dc-258dc",
- storageBucket: "cioos-metadata-form-dev-258dc-258dc.appspot.com",
+ authDomain: "cioos-metadata-form-dev-258dc.firebaseapp.com",
+ databaseURL: "https://cioos-metadata-form-dev-258dc-default-rtdb.firebaseio.com",
+ projectId: "cioos-metadata-form-dev-258dc",
+ storageBucket: "cioos-metadata-form-dev-258dc.appspot.com",
messagingSenderId: "141560007794",
appId: "1:141560007794:web:861d99b02210ea4d17c6eb",
measurementId: "G-BSKRHNR1EW",
From 003d02f87a27b7428e6daa9a984714a7d6a06dde Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Fri, 1 Nov 2024 13:49:16 -0400
Subject: [PATCH 18/40] set node v20
---
firebase-functions/functions/package-lock.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/firebase-functions/functions/package-lock.json b/firebase-functions/functions/package-lock.json
index 0ba06238..dcd69c04 100644
--- a/firebase-functions/functions/package-lock.json
+++ b/firebase-functions/functions/package-lock.json
@@ -18,7 +18,7 @@
"firebase-functions-test": "^0.2.0"
},
"engines": {
- "node": "14"
+ "node": "20"
}
},
"node_modules/@babel/parser": {
From 81ef781b6b1292831d52983c6d0ffb3b127e5593 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Fri, 1 Nov 2024 13:50:03 -0400
Subject: [PATCH 19/40] add .env.* and *.logs to gitgnore
---
.gitignore | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.gitignore b/.gitignore
index 71bc2d86..66cbf978 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,5 +40,9 @@ firebase-debug.log
yarn.lock
.env
+.env.*
firebase_to_xml/build
output
+
+
+*.log
From f20bae7f402c54decbefdcfe5e24ea34f291940d Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Fri, 1 Nov 2024 14:03:11 -0400
Subject: [PATCH 20/40] Revert "remove firebase original url dependancy and
refactor some of the code"
This reverts commit 79a08d81452e440395c69f53df1734d9160aa0fc.
---
.gitignore | 6 +-
firebase_to_xml/firebase_to_xml/__main__.py | 63 +++++++++++++------
.../get_records_from_firebase.py | 10 +--
firebase_to_xml/pyproject.toml | 19 ------
4 files changed, 51 insertions(+), 47 deletions(-)
delete mode 100644 firebase_to_xml/pyproject.toml
diff --git a/.gitignore b/.gitignore
index 66cbf978..a230e760 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,8 +41,4 @@ firebase-debug.log
yarn.lock
.env
.env.*
-firebase_to_xml/build
-output
-
-
-*.log
+*.log
\ No newline at end of file
diff --git a/firebase_to_xml/firebase_to_xml/__main__.py b/firebase_to_xml/firebase_to_xml/__main__.py
index 6861a6a4..aae5768e 100644
--- a/firebase_to_xml/firebase_to_xml/__main__.py
+++ b/firebase_to_xml/firebase_to_xml/__main__.py
@@ -6,18 +6,23 @@
import argparse
import traceback
from pathlib import Path
-import os
import yaml
from dotenv import load_dotenv
from metadata_xml.template_functions import metadata_to_xml
-from loguru import logger
-from tqdm import tqdm
-from get_records_from_firebase import get_records_from_firebase
-from record_json_to_yaml import record_json_to_yaml
+from firebase_to_xml.get_records_from_firebase import get_records_from_firebase
+from firebase_to_xml.record_json_to_yaml import record_json_to_yaml
+def parse_status(status: str):
+ """Return a list version fo their status selection"""
+
+ if "," in status:
+ return status.split(",")
+
+ return [status]
+
def get_filename(record):
"""Creates a filename by combinig the title and UUID """
@@ -58,46 +63,66 @@ def main():
],
)
parser.add_argument("--record_url", required=False)
- parser.add_argument("--database_url", default=os.getenv("DATABASE_URL"), required=False, help="Firebase database URL (default: %(default)s)")
+
args = vars(parser.parse_args())
+ region = args["region"]
+ record_status = parse_status(args["status"])
+
record_url = args["record_url"]
+
+ firebase_auth_key_file = args["key"]
also_save_yaml = args["yaml"]
# get list of records from Firebase
record_list = get_records_from_firebase(
- args["region"], args["key"], record_url, args["status"].split(','), args["database_url"]
+ region, firebase_auth_key_file, record_url, record_status
)
# translate each record to YAML and then to XML
- for record in tqdm(record_list, desc="Convert records", unit="record"):
+ for record in record_list:
# if single record it uses std out, hide info
+ if not record_url:
+ print(
+ "Processing",
+ f"'{record['title']['en']}'",
+ f"'{record['title']['fr']}'",
+ record["identifier"],
+ record["recordID"],
+ "\n",
+ )
+
try:
record_yaml = record_json_to_yaml(record)
organization = record.get("organization", "")
- filename = record.get("filename") or get_filename(record)
+ name = record.get("filename") or get_filename(record)
+
+ xml_directory = args["out"]
- output_directory = Path(args["out"]) / organization
- output_directory.mkdir(parents=True, exist_ok=True)
+ xml_directory = "/".join([args["out"], organization])
+
+ Path(xml_directory).mkdir(parents=True, exist_ok=True)
# output yaml
if also_save_yaml:
- yaml_file = output_directory / f"{filename}.yaml"
- yaml_file.write_text(yaml.dump(record_yaml, allow_unicode=True, sort_keys=False), encoding="utf-8")
+ filename = f"{xml_directory}/{name}.yaml"
+ file = open(filename, "w")
+ file.write(yaml.dump(record_yaml, allow_unicode=True, sort_keys=False))
# render xml template and write to file
xml = metadata_to_xml(record_yaml)
if record_url:
- logger.info(xml)
- continue
-
- xml_file = output_directory / f"{filename}.xml"
- xml_file.write_text(xml, encoding="utf-8")
+ print(xml)
+ else:
+ filename = f"{xml_directory}/{name}.xml"
+ file = open(filename, "w")
+ file.write(xml)
+ print("Wrote " + file.name)
except Exception:
- logger.error(traceback.format_exc())
+ print(traceback.format_exc())
if __name__ == "__main__":
diff --git a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
index 3aa26a73..a11ee807 100644
--- a/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
+++ b/firebase_to_xml/firebase_to_xml/get_records_from_firebase.py
@@ -5,13 +5,15 @@
"""
import json
+import pprint
import sys
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account
+
def get_records_from_firebase(
- region:str, firebase_auth_key_file:str, record_url:str, record_status:list, database_url:str, firebase_auth_key_json:str=None
+ region, firebase_auth_key_file, record_url, record_status, firebase_auth_key_json=None
):
"""
Returns list of records from firebase for this region,
@@ -42,7 +44,7 @@ def get_records_from_firebase(
if record_url:
response = authed_session.get(
- f"{database_url}{record_url}.json"
+ f"https://cioos-metadata-form.firebaseio.com/{record_url}.json"
)
body = json.loads(response.text)
records.append(body)
@@ -50,12 +52,12 @@ def get_records_from_firebase(
else:
response = authed_session.get(
- f"{database_url}{region}/users.json"
+ f"https://cioos-metadata-form.firebaseio.com/{region}/users.json"
)
body = json.loads(response.text)
# Parse response
- if not body or not isinstance(body, dict) :
+ if not body or type(body) != dict :
print("Region",region,"not found?")
# print(response.content)
sys.exit()
diff --git a/firebase_to_xml/pyproject.toml b/firebase_to_xml/pyproject.toml
deleted file mode 100644
index 2262d7ca..00000000
--- a/firebase_to_xml/pyproject.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[project]
-name = "firebase-to-xml"
-version = "0.1.0"
-description = "Python module translates metadata records from Firebase into XML"
-readme = "README.md"
-requires-python = ">=3.12"
-dependencies = [
- "firebase-to-xml",
- "google-auth>=2.35.0",
- "google-oauth>=1.0.1",
- "loguru>=0.7.2",
- "metadata-xml",
- "python-dotenv>=1.0.1",
- "tqdm>=4.66.5",
-]
-
-[tool.uv.sources]
-metadata-xml = { git = "https://github.com/cioos-siooc/metadata-xml.git" }
-firebase-to-xml = { workspace = true }
From 6458c1d8de3490438589ffae8add75a6eee261b2 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Fri, 1 Nov 2024 14:36:27 -0400
Subject: [PATCH 21/40] add json from database output
---
.../FormComponents/MetadataRecordListItem.jsx | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/components/FormComponents/MetadataRecordListItem.jsx b/src/components/FormComponents/MetadataRecordListItem.jsx
index 8efbdc72..62cb1d05 100644
--- a/src/components/FormComponents/MetadataRecordListItem.jsx
+++ b/src/components/FormComponents/MetadataRecordListItem.jsx
@@ -102,7 +102,9 @@ const MetadataRecordListItem = ({
} else if (fileType === "erddap") {
data = [recordToERDDAP(record)];
} else if (fileType === "json") {
- data = await [JSON.stringify(recordToDataCite( record, language, region, datacitePrefix ), null, 2)];
+ data = await [JSON.stringify(record)];
+ } else if (fileType === "datacite-json") {
+ data = await [JSON.stringify(recordToDataCite(record, language, region, datacitePrefix), null, 2)];
} else {
const res = await downloadRecord({ record, fileType, region });
data = Object.values(res.data.message);
@@ -379,11 +381,20 @@ const MetadataRecordListItem = ({
EML for OBIS IPT
+
From 1b4a1d57ff5adb3b4c57c2b244788c26518701f3 Mon Sep 17 00:00:00 2001
From: Jessy Barrette <30420025+JessyBarrette@users.noreply.github.com>
Date: Fri, 1 Nov 2024 14:52:34 -0400
Subject: [PATCH 22/40] fix json out string and mimeTypes
---
src/components/FormComponents/MetadataRecordListItem.jsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/components/FormComponents/MetadataRecordListItem.jsx b/src/components/FormComponents/MetadataRecordListItem.jsx
index 62cb1d05..27bdd8eb 100644
--- a/src/components/FormComponents/MetadataRecordListItem.jsx
+++ b/src/components/FormComponents/MetadataRecordListItem.jsx
@@ -102,8 +102,8 @@ const MetadataRecordListItem = ({
} else if (fileType === "erddap") {
data = [recordToERDDAP(record)];
} else if (fileType === "json") {
- data = await [JSON.stringify(record)];
- } else if (fileType === "datacite-json") {
+ data = await [JSON.stringify(record, null, 2)];
+ } else if (fileType === "dataciteJson") {
data = await [JSON.stringify(recordToDataCite(record, language, region, datacitePrefix), null, 2)];
} else {
const res = await downloadRecord({ record, fileType, region });
@@ -115,6 +115,7 @@ const MetadataRecordListItem = ({
eml: "application/xml",
erddap: "application/xml",
json: "application/json",
+ dataciteJson: "application/json",
};
const blob = new Blob(data, {
type: `${mimeTypes[fileType]};charset=utf-8`,
@@ -392,7 +393,7 @@ const MetadataRecordListItem = ({