diff --git a/data_ingest/.gitattributes b/data_ingest/.gitattributes new file mode 100644 index 0000000..c07c57a --- /dev/null +++ b/data_ingest/.gitattributes @@ -0,0 +1 @@ +tests/scrape_responses/*.html linguist-generated diff --git a/data_ingest/.gitignore b/data_ingest/.gitignore index 09dd1da..633d78f 100644 --- a/data_ingest/.gitignore +++ b/data_ingest/.gitignore @@ -1 +1,2 @@ venv/* +__pycache__/ diff --git a/data_ingest/.python-version b/data_ingest/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/data_ingest/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/data_ingest/README.md b/data_ingest/README.md new file mode 100644 index 0000000..e69de29 diff --git a/data_ingest/main.py b/data_ingest/main.py new file mode 100644 index 0000000..006a11f --- /dev/null +++ b/data_ingest/main.py @@ -0,0 +1,2 @@ +if __name__ == "__main__": + print("starting import") diff --git a/data_ingest/pyproject.toml b/data_ingest/pyproject.toml new file mode 100644 index 0000000..0b20852 --- /dev/null +++ b/data_ingest/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "data-ingest" +version = "0.1.0" +description = "Scripts to scrape data and insert into database" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "imslp>=0.2.3", + "pytest>=8.3.3", + "ruff>=0.7.4", +] +[tool.pytest.ini_options] +pythonpath = ["."] diff --git a/data_ingest/tests/scrape_responses/pieces.html b/data_ingest/tests/scrape_responses/pieces.html new file mode 100644 index 0000000..b363f70 --- /dev/null +++ b/data_ingest/tests/scrape_responses/pieces.html @@ -0,0 +1,2014 @@ + + + + +13 Preludes, Op.32 (Rachmaninoff, Sergei) - IMSLP + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+

+

+ 13 Preludes, Op.32 (Rachmaninoff, Sergei)

+
+

Contents

+ +
+

Performances

+

Recordings

+
+ +
+

MP4 file (audio/video)
+Visionfugitiva (2011/1/16) +

+
+
+

+

+
+ + + + + + + + + + + + + + + +
Performer Pages +Marco Alejandro Gil Esteva (Piano) +
Publisher Info. +Marco Alejandro Gil Esteva +
Copyright + +
Misc. Notes +Escuela Nacional de Musica UNAM - 2009 +
Purchase +
Javascript is required for this feature.
+
+
+
+
+ +
+

MP3 file (audio)
+Hreichgott (2013/1/14) +

+
+
+

+

+
+ + + + + + + + + + + + + + + +
Performer Pages +Heather W. Reichgott (Piano) +
Publisher Info. +Heather W. Reichgott +
Copyright + +
Misc. Notes +Recorded December 2011 +
Purchase +
Javascript is required for this feature.
+
+
+
+
+ +
+

MP3 file (audio)
+Lumineux (2015/1/10) +

+
+
+

+

+
+ + + + + + + + + + + + + + + +
Performer Pages +Peter Bradley-Fulgoni (piano) +
Publisher Info. +Peter Bradley-Fulgoni +
Copyright + +
Misc. Notes +Recorded 2014, St. Paul's Hall, Huddersfield University. Peter Hill, sound engineer +
Purchase +
Javascript is required for this feature.
+
+
+
+
+ +
+

MP3 file (audio)
+Aniela (2016/11/6) +

+
+
+

+

+
+ + + + + + + + + + + + +
Performer Pages +Angela Yurchenko (piano) +
Publisher Info. +Angela Yurchenko +
Copyright + +
Purchase +
Javascript is required for this feature.
+
+
+
+
+ +
+

MP3 file (audio)
+Lucas-coelho (2021/7/25) +

+
+
+
+ + + + + + + + + + + + + + + +
Performer Pages +Nelson Freire (piano) +
Publisher Info. +Recorded in 1964 at Theatro Municipal de São Paulo. +
Copyright + +
Misc. Notes +Source: Instituto Piano Brasileiro +
Purchase +
Javascript is required for this feature.
+
+
+
+
+ +
+

MP3 file (audio)
+Lucas-coelho (2021/11/21) +

+
+
+
+ + + + + + + + + + + + + + + +
Performer Pages +Nelson Freire (piano) +
Publisher Info. +Classic Riosom, 1964. RSCL 4.002. +
Copyright + +
Misc. Notes +Source: Instituto Piano Brasileiro +
Purchase +
Javascript is required for this feature.
+
+
TN-PMLP412275-1 LP Nelson Freire (1964) Bach-Busoni - Ich ruf' zu dir, Herr Jesu Christ-2687.png
+
+

Naxos

+
Javascript not enabled.
+
+

+

+

Synthesized/MIDI

+

Allegro con brio (No.4)

+
For Orchestra (Johnson)
+
+ +
+

MID file (audio/video)
+Clsmaestro (2023/8/31) +

+
+
+
+ + + + + + + + + + + + +
Publisher Info. +Charles A Johnson, 2022. +
Performers +synthesizer +
Copyright + +
Purchase +
Javascript is required for this feature.
+
+
+
+
+

Sheet Music

+

Scores

+

Complete

+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+

13 more: 1. Allegro vivace (C major) • 2. Allegretto (B♭ minor) • 3. Allegro vivace (E major) • 4. Allegro con brio (E minor) • 5. Moderato (G major) • 6. Allegro appassionato (F minor) • 7. Moderato (F major) • 8. Vivo (A minor) • 9. Allegro moderato (A major) • 10. Lento (B minor) • 11. Allegretto (B major) • 12. Allegro (G♯ minor) • 13. Grave (D♭ major) +

+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ +
+

PDF scanned by RUS-Mrg
+Khwjtm21 (2013/12/31)
+

+
+
+
+ + + + + + + + + + + + +
Editor +First edition +
Publisher. Info. +Moscow: A. Gutheil, n.d.(1911). Plate A. 9612-24 G. +
Copyright + +
Purchase +
Javascript is required for this feature.
+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+

13 more: 1. Allegro vivace (C major) • 2. Allegretto (B♭ minor) • 3. Allegro vivace (E major) • 4. Allegro con brio (E minor) • 5. Moderato (G major) • 6. Allegro appassionato (F minor) • 7. Moderato (F major) • 8. Vivo (A minor) • 9. Allegro moderato (A major) • 10. Lento (B minor) • 11. Allegretto (B major) • 12. Allegro (G♯ minor) • 13. Grave (D♭ major) +

+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ +
+

PDF scanned by Pfsunmin
+Pfsunmin (2023/8/6)
+

+
+
+
+ + + + + + + + + + + + + + + + + + +
Editor +First edition (reprint) +
Publisher. Info. +Moscow: A. Gutheil, n.d.(1911). Plate A. 9612-24 G. +
Reprinted +London: Boosey & Hawkes, 1992. Plate B. & H. 20707. +
Copyright + +
Misc. Notes +600 dpi. Authentic Edition revised in 1992 as part of the Complete 24 Preludes. +
Purchase +
Javascript is required for this feature.
+
+
+
+ +
+

PDF scanned by Unknown
+Feldmahler (2006/2/21)
+

+
+
+
+ + + + + + + + + + + + + + + + + + +
Editor +Pavel Lamm (1882-1951) +
Publisher. Info. +24 Prelyudi dlia Fortepiano (pp.54-112)
Moscow: Muzgiz, No.1365, n.d.(ca.1948). Plate M. 17654 Г. +
Reprinted +Moscow: Muzgiz, n.d.(1966). +
Copyright + +
Misc. Notes +Re-engraved in DDR (Röder) and reissued in 1966 +
Purchase +
Javascript is required for this feature.
+
+
+

Selections

+
+ +
+

PDF typeset by editor
+Raybird (2020/7/5)
+

+
+
+
+

7 more: 2. Allegretto (B♭ minor) • 5. Moderato (G major) • 7. Moderato (F major) • 9. Allegro moderato (A major) • 10. Lento (B minor) • 12. Allegro (G♯ minor) • 13. Grave (D♭ major) +

+
+ +
+

PDF typeset by editor
+Raybird (2020/7/5)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/12/3)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/12/3)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/12/3)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/7/5)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/7/5)
+

+
+
+
+ +
+

PDF typeset by editor
+Raybird (2020/7/5)
+

+
+
+
+ + + + + + + + + + + + + + + +
Editor +Ray Alston +
Publisher. Info. +Ray Alston +
Copyright + +
Misc. Notes +A creative and critical new edition including changes of key and time-signatures, improved layout and hand distribution. High quality, re-worked text for maximum clarity, sostenuto pedal and practical performance suggestions. +
Purchase +
Javascript is required for this feature.
+
+
+
+ +
+

PDF scanned by RUS-Mrg
+QuinnMason (2016/5/31)
+

+
+
+
+ + + + + + + + + + + + +
Publisher. Info. +Moscow: A. Gutheil, n.d.[1911]. Plate A. 9621 G. +
Copyright + +
Misc. Notes +Restored missing 4th page +
Purchase +
Javascript is required for this feature.
+
+
+
+ +
+

PDF scanned by UC Berkeley Lib...
+Silotissimus (2020/8/14)
+

+
+
+
+ + + + + + + + + + + + + + + +
Editor +Alexander Siloti (1863-1945) +
Publisher. Info. +Moscow: Gutheil, n.d. Plate A. 9683. +
Copyright + +
Misc. Notes +Revized and simplefied by Siloti. This edition provides aditional pedal marking, fingerings, and simplifies some parts. +
Purchase +
Javascript is required for this feature.
+
+
+
+

+

+

Arrangements and Transcriptions

+

Allegro con brio (No.4)

+
For Orchestra (Johnson)
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+

13 more: Flutes 1, 2, 3/Piccolo • Oboes 1, 2 • Clarinets 1, 2 (B♭) • Bassoons 1, 2 • Horns 1, 2, 3, 4 (F) • Trumpets 1, 2 (B♭) • Trombones 1, 2, Bass Trombone, Tuba • Timpani • Violins I • Violins II • Violas • Cellos • Basses +

+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ +
+

PDF typeset by arranger
+Clsmaestro (2022/6/13)
+

+
+
+
+ + + + + + + + + + + + +
Arranger +Charles Anthony Johnson (b. 1939) +
Publisher. Info. +Charles Anthony Johnson, 2022. +
Copyright + +
Purchase +
Javascript is required for this feature.
+
+
+
+

+

+
+

+

+
+

+

+
Javascript is required to submit files.
+

General Information

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Work Title +13 Preludes +
Alternative. Title +Прелюдии / Prelyudii +
Name Translations +Préludes de Rachmaninov; 13 Preludes, Op. 32; Preludes, Op. 32; Preludia op. 32 (Rachmaninow); Прелюдії op. 32 (Рахманінов); 13 Préludes, op. 32; Preludios, Op. 32 (Rajmáninov); Tredici preludi, Op. 32 +
Name Aliases +Preludes, Op. 32 (Rachmaninov) +
Authorities +WorldCat; Wikipedia; VIAF: 2935157884807660620003; LCCN: no96055342; GND: 300124015 +
Composer +Rachmaninoff, Sergei +
Opus/Catalogue NumberOp./Cat. No. +Op.32 +
I-Catalogue NumberI-Cat. No. +ISR 44 +
Key +Uses all major and minor keys (together with 10 Preludes, Op.23 and Prelude in C minor (No.2) from Morceaux de fantaisie, Op.3) +
Movements/SectionsMov'ts/Sec's +13 pieces: +
1. Allegro vivace (C major) +
2. Allegretto (B minor) +
3. Allegro vivace (E major) +
4. Allegro con brio (E minor) +
5. Moderato (G major) +
6. Allegro appassionato (F minor) +
7. Moderato (F major) +
8. Vivo (A minor) +
9. Allegro moderato (A major) +
10. Lento (B minor) +
11. Allegretto (B major) +
12. Allegro (G minor) +
13. Grave (D major) +
+
Year/Date of CompositionY/D of Comp. +1910 +
First Publication. +1911 – Moscow: A. Gutheil, Plates A. 9612-24 G., 57 pages +
Average DurationAvg. Duration +39 minutes +
Composer Time PeriodComp. Period +Romantic +
Piece Style +Romantic +
Instrumentation +piano +
External Links +Wikipedia article +
+
+

Navigation etc.

+
+
See Also
+
List of Intermediate Piano Repertoire
+ + +
+
+
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + diff --git a/data_ingest/tests/test_parse_movements.py b/data_ingest/tests/test_parse_movements.py new file mode 100644 index 0000000..3bb3338 --- /dev/null +++ b/data_ingest/tests/test_parse_movements.py @@ -0,0 +1,15 @@ +from bs4 import BeautifulSoup + +from utils import parse_movements + + +def test_parse_movements(): + with open("tests/scrape_responses/pieces.html", "r") as file: + html_content = file.read() + soup = BeautifulSoup(html_content, "html.parser") + general_info_div = soup.find("div", class_="wi_body") + if general_info_div is None: + raise ValueError("Could not find 'div' with class 'wi_body'") + result = parse_movements(general_info_div) + assert isinstance( result, list) + assert set(result[0].keys()) == ['name', 'number'] diff --git a/data_ingest/utils.py b/data_ingest/utils.py new file mode 100644 index 0000000..9943289 --- /dev/null +++ b/data_ingest/utils.py @@ -0,0 +1,64 @@ +import re + +from bs4 import NavigableString, Tag + + +def parse_movements(data: Tag | NavigableString): + movements = [] + + print(f"data: {data}") + movement_list = data.find("ol") + if movement_list: + print("movement list") + for index, li in enumerate(movement_list.find_all("li")): + line = li.get_text(strip=True).replace("\xa0", " ") + number = 3 + + if "(" in line and line.endswith(")"): + name, key_signature = line.rsplit("(", 1) + key_signature = key_signature.rstrip(")").replace("\xa0", " ") + movements.append( + { + "type": "movement", + "number": number, + "name": name.strip(), + "key_signature": key_signature.strip(), + } + ) + else: + movements.append( + { + "type": "movement", + "number": number, + "name": line.strip(), + "key_signature": None, + } + ) + piece_list = data.find("dl") + if piece_list: + for index, dd in enumerate(piece_list.find_all("dd")): + line = dd.get_text(strip=True).replace("\xa0", " ") + number = 3 + + if "(" in line and line.endswith(")"): + name, key_signature = line.rsplit("(", 1) + key_signature = key_signature.rstrip(")").replace("\xa0", " ") + movements.append( + { + "type": "piece", + "number": number, + "name": name.strip(), + "key_signature": key_signature.strip(), + } + ) + else: + movements.append( + { + "type": "piece", + "number": number, + "name": line.strip(), + "key_signature": None, + } + ) + print(f"movements {movements}") + return movements diff --git a/data_ingest/uv.lock b/data_ingest/uv.lock new file mode 100644 index 0000000..782e84c --- /dev/null +++ b/data_ingest/uv.lock @@ -0,0 +1,264 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "bs4" +version = "0.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a", size = 1121 } + +[[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 = "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 = "data-ingest" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "imslp" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "imslp", specifier = ">=0.2.3" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.7.4" }, +] + +[[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 = "imslp" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bs4" }, + { name = "mwclient" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/39/84eaea22a89d52e479149c3aa92dc5aa85a00da4b793439d689ca550717b/imslp-0.2.3.tar.gz", hash = "sha256:ecc731560c0e55460b6506bb3d7db30d9dd7ca15daa7a68f545f24ca59a46277", size = 14045 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/ff/d4d989ccaa27861fd9bb33a4bb2144fb9d8733088915b31bb08f2bba4ef5/imslp-0.2.3-py3-none-any.whl", hash = "sha256:f5bb7a3b9a401ea685889dfad21403cfdf4eeac066d2a98e5c6b78939d72e27d", size = 19102 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "mwclient" +version = "0.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests-oauthlib" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/b4/5fc70ad3286a8d8ec4b9ac01acad0f6b00c5a48d4a16b9d3be6519b7eb21/mwclient-0.10.1.tar.gz", hash = "sha256:79363dd8d12f5e3b91b92b63152bf9dfef27da786c076a244e1f148c8dd67139", size = 34923 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/23/5c91d28558315124250715bf3978adcb9dfaed98ca76efad154a05bf27b3/mwclient-0.10.1-py2.py3-none-any.whl", hash = "sha256:7aad000c4c7f239c7c92c43e2d5fbdaf8573262accd6070524ff42e46950306e", size = 27987 }, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "pytest" +version = "8.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, +] + +[[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 = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, +] + +[[package]] +name = "ruff" +version = "0.7.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/8b/bc4e0dfa1245b07cf14300e10319b98e958a53ff074c1dd86b35253a8c2a/ruff-0.7.4.tar.gz", hash = "sha256:cd12e35031f5af6b9b93715d8c4f40360070b2041f81273d0527683d5708fce2", size = 3275547 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/4b/f5094719e254829766b807dadb766841124daba75a37da83e292ae5ad12f/ruff-0.7.4-py3-none-linux_armv6l.whl", hash = "sha256:a4919925e7684a3f18e18243cd6bea7cfb8e968a6eaa8437971f681b7ec51478", size = 10447512 }, + { url = "https://files.pythonhosted.org/packages/9e/1d/3d2d2c9f601cf6044799c5349ff5267467224cefed9b35edf5f1f36486e9/ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfb365c135b830778dda8c04fb7d4280ed0b984e1aec27f574445231e20d6c63", size = 10235436 }, + { url = "https://files.pythonhosted.org/packages/62/83/42a6ec6216ded30b354b13e0e9327ef75a3c147751aaf10443756cb690e9/ruff-0.7.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:63a569b36bc66fbadec5beaa539dd81e0527cb258b94e29e0531ce41bacc1f20", size = 9888936 }, + { url = "https://files.pythonhosted.org/packages/4d/26/e1e54893b13046a6ad05ee9b89ee6f71542ba250f72b4c7a7d17c3dbf73d/ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d06218747d361d06fd2fdac734e7fa92df36df93035db3dc2ad7aa9852cb109", size = 10697353 }, + { url = "https://files.pythonhosted.org/packages/21/24/98d2e109c4efc02bfef144ec6ea2c3e1217e7ce0cfddda8361d268dfd499/ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0cea28d0944f74ebc33e9f934238f15c758841f9f5edd180b5315c203293452", size = 10228078 }, + { url = "https://files.pythonhosted.org/packages/ad/b7/964c75be9bc2945fc3172241b371197bb6d948cc69e28bc4518448c368f3/ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80094ecd4793c68b2571b128f91754d60f692d64bc0d7272ec9197fdd09bf9ea", size = 11264823 }, + { url = "https://files.pythonhosted.org/packages/12/8d/20abdbf705969914ce40988fe71a554a918deaab62c38ec07483e77866f6/ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:997512325c6620d1c4c2b15db49ef59543ef9cd0f4aa8065ec2ae5103cedc7e7", size = 11951855 }, + { url = "https://files.pythonhosted.org/packages/b8/fc/6519ce58c57b4edafcdf40920b7273dfbba64fc6ebcaae7b88e4dc1bf0a8/ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00b4cf3a6b5fad6d1a66e7574d78956bbd09abfd6c8a997798f01f5da3d46a05", size = 11516580 }, + { url = "https://files.pythonhosted.org/packages/37/1a/5ec1844e993e376a86eb2456496831ed91b4398c434d8244f89094758940/ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7dbdc7d8274e1422722933d1edddfdc65b4336abf0b16dfcb9dedd6e6a517d06", size = 12692057 }, + { url = "https://files.pythonhosted.org/packages/50/90/76867152b0d3c05df29a74bb028413e90f704f0f6701c4801174ba47f959/ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e92dfb5f00eaedb1501b2f906ccabfd67b2355bdf117fea9719fc99ac2145bc", size = 11085137 }, + { url = "https://files.pythonhosted.org/packages/c8/eb/0a7cb6059ac3555243bd026bb21785bbc812f7bbfa95a36c101bd72b47ae/ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3bd726099f277d735dc38900b6a8d6cf070f80828877941983a57bca1cd92172", size = 10681243 }, + { url = "https://files.pythonhosted.org/packages/5e/76/2270719dbee0fd35780b05c08a07b7a726c3da9f67d9ae89ef21fc18e2e5/ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2e32829c429dd081ee5ba39aef436603e5b22335c3d3fff013cd585806a6486a", size = 10319187 }, + { url = "https://files.pythonhosted.org/packages/9f/e5/39100f72f8ba70bec1bd329efc880dea8b6c1765ea1cb9d0c1c5f18b8d7f/ruff-0.7.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:662a63b4971807623f6f90c1fb664613f67cc182dc4d991471c23c541fee62dd", size = 10803715 }, + { url = "https://files.pythonhosted.org/packages/a5/89/40e904784f305fb56850063f70a998a64ebba68796d823dde67e89a24691/ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:876f5e09eaae3eb76814c1d3b68879891d6fde4824c015d48e7a7da4cf066a3a", size = 11162912 }, + { url = "https://files.pythonhosted.org/packages/8d/1b/dd77503b3875c51e3dbc053fd8367b845ab8b01c9ca6d0c237082732856c/ruff-0.7.4-py3-none-win32.whl", hash = "sha256:75c53f54904be42dd52a548728a5b572344b50d9b2873d13a3f8c5e3b91f5cac", size = 8702767 }, + { url = "https://files.pythonhosted.org/packages/63/76/253ddc3e89e70165bba952ecca424b980b8d3c2598ceb4fc47904f424953/ruff-0.7.4-py3-none-win_amd64.whl", hash = "sha256:745775c7b39f914238ed1f1b0bebed0b9155a17cd8bc0b08d3c87e4703b990d6", size = 9497534 }, + { url = "https://files.pythonhosted.org/packages/aa/70/f8724f31abc0b329ca98b33d73c14020168babcf71b0cba3cded5d9d0e66/ruff-0.7.4-py3-none-win_arm64.whl", hash = "sha256:11bff065102c3ae9d3ea4dc9ecdfe5a5171349cdd0787c1fc64761212fc9cf1f", size = 8851590 }, +] + +[[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 = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[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 }, +]