{ "info": { "author": "Tyler Young", "author_email": "tyler@x-plane.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Games/Entertainment :: Simulation" ], "description": "Tools for working with X-Plane airport data\n============================================================================================================================================================\n\n[![CircleCI](https://circleci.com/gh/X-Plane/xplane_airports/tree/master.svg?style=svg)](https://circleci.com/gh/X-Plane/xplane_airports/tree/master)\n\n`xplane_airports` is a Python package for interacting with [X-Plane](https://www.x-plane.com)'s airport data ([`apt.dat`](https://developer.x-plane.com/article/airport-data-apt-dat-file-format-specification/)) files.\n\nThis includes the following major components:\n\n1. [The `AptDat` module](#the-aptdat-module): Used to parse & query raw `apt.dat` files (e.g., the files stored on disk in your X-Plane installation)\n - The [`AptDat`](#aptdataptdat) class itself: A parser for X-Plane's airport data files (which may contain more than 35,000 airports); a collection of [`Airport`](#aptdatairport) objects\n - The [`Airport`](#aptdatairport) class: Represents an individual airport from an `apt.dat` file.\n2. [The `gateway` module](#the-gateway-module): Used to interact with [the X-Plane Scenery Gateway](https://gateway.x-plane.com) to get information about what airports are available, and to download individual scenery packs contributed by the community.\n - [`airports()`](#xplane_airportsgatewayairports---dict): Queries for metadata on all 35,000+ airports on the Gateway. \n - [`airport()`](#xplane_airportsgatewayairportairport_id---dict): Queries the Gateway for information about the specified airport itself, as well as metadata on all scenery packs submitted for it. Unlike [`scenery_pack()`](#xplane_airportsgatewayscenery_packpack_to_download---gatewayapt), though, this does *not* include actual `apt.dat` or DSF data. \n - [`scenery_pack()`](#xplane_airportsgatewayscenery_packpack_to_download---gatewayapt): Downloads either the recommended pack for the specified airport, or the scenery pack with the specified `int` ID. Includes both the `apt.dat` data and DSF, where applicable.\n - [`recommended_scenery_packs()`](#xplane_airportsgatewayrecommended_scenery_packsselective_apt_idsnone---collectionsiterablegatewayapt): A generator equivalent to calling [`scenery_pack()`](#xplane_airportsgatewayscenery_packpack_to_download---gatewayapt) to download the recommended scenery pack for every airport (or only a preselected list of airports, at your discretion).\n\n## Installation instructions\n\n`xplane_airports` requires Python 3.6 or newer.\n\nInstall via pip with:\n\n`$ pip install xplane_airports`\n\n## Sample code\n\n### Parsing the default apt.dat file in your local X-Plane installation\n\n```python\nfrom xplane_airports.AptDat import AptDat, Airport\n\nxplane_installation = input(\"Path to your X-Plane installation: \")\nprint(\"Reading 35,000+ airports from disk\")\ndefault_xplane_apt_dat = AptDat(xplane_installation + 'Resources/default scenery/default apt dat/Earth nav data/apt.dat')\nprint(\"%d airports found in your default apt.dat\\n\" % len(default_xplane_apt_dat))\n\nksea = default_xplane_apt_dat['KSEA']\n\"\"\":type ksea: Airport\"\"\"\nprint(\"KSEA's airport data on disk begins:\")\nprint(ksea.head())\n```\n\n### Getting metadata on airports from the Gateway\n\n```python\nfrom xplane_airports.gateway import airports\nall_apts = airports()\nprint(\"There are %d airports on the X-Plane Scenery Gateway\" % len(all_apts))\nprint(\"KSEA has the following metadata on the Gateway:\")\nfor key, value in all_apts['KSEA'].items():\n print('\\t' + key + ':', value)\n```\n\n### Downloaded the recommended scenery pack for an airport from the Gateway\n\n```python\nfrom xplane_airports.gateway import scenery_pack, GatewayApt\nksea_recommended_pack = scenery_pack('KSEA')\n\"\"\":type ksea_recommended_pack: GatewayApt\"\"\"\nprint(\"KSEA downloaded from the Gateway begins:\")\nprint(ksea_recommended_pack.apt.head())\n```\n\nMore sample code is available in the doctests in [the `gateway` module](#the-gateway-module) docs below.\n\n## The `AptDat` module\n\nTools for reading, inspecting, and manipulating X-Plane\u2019s airport (apt.dat) files.\n\n### AptDat.AptDat\n\n_class_ `AptDat.AptDat`(_path\\_to\\_file=None_)\n\nA container class for [`Airport`](#aptdatairport) objects. Parses X-Plane\u2019s gigantic `apt.dat` files, which may have data on hundreds of airports.\n\n**Field** `airports` (list\\[Airport\\])\n\n**Static method** `from_file_text`(_apt\\_dat\\_file\\_text_, _from\\_file_) -> [`AptDat`](#aptdataptdat)\\\nParameters:\n\n- **apt\\_dat\\_file\\_text** (_str_|_pathlib.Path_): The contents of an apt.dat (or ICAO.dat) file\n- **from\\_file** (_str_): Path to the file from which this was read\n\n**Property** `ids`\\\nA generator containing the X-Plane IDs of all airports in the collection. Note that these IDs may or may not correspond to the airports\u2019 ICAO identifiers.\\\nType: collection.Iterable\\[str\\]\n\n**Property** `names`\\\nA generator containing the names of all airports in the collection\\\nType: collection.Iterable\\[str\\]\n\n**Method** `search_by_id`(_apt\\_id_)\\\nParameter: **apt\\_id** (_str_) \u2013 The X-Plane ID of the airport you want to query\\\nReturns: The airport with the specified ID, or `None` if no matching airport exists in this collection.\\\nReturn type: Union\\[[Airport](#aptdatairport), None\\]\n\n**Method** `search_by_name`(_apt\\_name_)\\\nParameter: **apt\\_name** (_str_) \u2013 The name of the airport you want to query\\\nReturns: All airports that match the specified name, case-insensitive (an empty list if no airports match)\nReturn type: list\\[[Airport](#aptdatairport)\\]\n\n**Method** `search_by_predicate`(_predicate\\_fn_)\\\nParameter: **predicate\\_fn** (_(_[_Airport_](#aptdatairport)_)_ _\\-> bool_) \u2013 We will collect all airports for which this function returns `True`\\\nReturn type: list\\[[Airport](#aptdatairport)\\]\n\n**Method** `sort`(_key='name'_)\\\nBy default, we store the airport data in whatever order we read it from the apt.dat file. When you call sort, though, we\u2019ll ensure that it\u2019s in order (default to name order, just like it\u2019s always been in the shipping versions of X-Plane).\\\nParameter: **key** (_str_) \u2013 The [Airport](#aptdatairport) key to sort on\n\n**Method** `write_to_disk`(_path_to_write_to_)\\\nWrites a complete apt.dat file containing this entire collection of airports.\\\nParameter: **path_to_write_to** (_str_) \u2013 A complete file path (ending in .dat)\n\n### AptDat.Airport\n\nA single airport from an apt.dat file.\n\n_class_ `xplane_airports.AptDat.Airport`(_name: str_, _id: str_, _from\\_file: str = ''_, _has\\_atc: bool = False_, _elevation\\_ft\\_amsl: float = 0_, _text: List\\[[AptDat.AptDatLine](#aptdataptdatline)\\]=\\[\\]_)\\\n\nDataclass members:\n\n- _name_ (str): The name of the airport, like \"Seattle-Tacoma Intl\"\n- _id_ (str): The X-Plane identifier for the airport, which may or may not correspond to its ICAO ID\n- _from_file_ (_pathlib.Path_; default empty): Path to the `apt.dat` file from which this airport was read\n- _has_atc_ (bool; default `False`): True if the airport header indicates the airport has air traffic control\n- _elevation_ft_amsl_ (float; default 0): The elevation, in feat above mean sea level, indicated in the airport header line\n- _text_ (List\\[[AptDatLine](#aptdataptdatline)\\]; default empty): The complete text of the portion of the apt.dat file pertaining to this airport\n\n**Static method** `from_lines`(_apt\\_dat\\_lines_, _from\\_file\\_name_) -> [Airport](#aptdatairport)\\\nParameters:\\\n\n- **from\\_file\\_name** (_str_) \u2013 The name of the apt.dat file you read this airport in from\n- **apt\\_dat\\_lines** (_collections.Iterable\\[[AptDatLine](#aptdataptdatline)|str\\]_) \u2013 The lines of the apt.dat file (either strings or parsed AptDatLine objects)\n\n**Static method** `from_str`(_file\\_text_, _from\\_file\\_name_) -> [Airport](#aptdatairport)\\\nParameters:\n\n- **file\\_text** (_str_) \u2013 The portion of the apt.dat file text that specifies this airport\n- **from\\_file\\_name** (_str_) \u2013 The name of the apt.dat file you read this airport in from\n\n**Method** `head(num_lines=10)` -> str\\\nReturns the first `num_lines` of the `apt.dat` text for this airport\n\n**Property** `has_comm_freq` (bool)\\\nTrue if this airport defines communication radio frequencies for interacting with ATC\\\n\n**Property** `has_ground_routes` (bool)\\ \nTrue if this airport defines any destinations for ground vehicles (like baggage cars, fuel trucks, etc.), ground truck parking locations, or taxi routes\\\n\n**Property** `has_taxi_route` (bool)\\\nTrue if this airport defines routing rules for ATC\u2019s use of its taxiways.\\\n\n**Property** `has_taxiway` (bool)\\\nTrue if this airport defines any taxiway geometry\\\n\n**Property** `has_taxiway_sign` (bool)\\\nTrue if this airport defines any taxi signs\\\n\n**Property** `has_traffic_flow` (bool)\\\nTrue if this airport defines rules for when and under what conditions certain runways should be used by ATC\\\n\n**Property** `latitude` (float)\\\nThe latitude of the airport, which X-Plane calculates as the latitude of the center of the first runway.\\\n\n**Property** `longitude` (float)\\\nThe longitude of the airport, which X-Plane calculates as the longitude of the center of the first runway.\\\n\n**Method** `has_row_code`(_row\\_code\\_or\\_codes_) -> bool\\\nTrue if the airport has any lines in its text that begin with the specified row code(s)\\\nParameter: **row\\_code\\_or\\_codes** (_Union__\\[__int__,_ _str__,_ _collections.Iterable__\\[__int__\\]__\\]_) \u2013 One or more \u201crow codes\u201d (the first token at the beginning of a line; almost always int)\n\n**Method** `write_to_disk`(_path_to_write_to_)\\\nWrites a complete apt.dat file containing just this airport.\\\nParameter: **path_to_write_to** (_str_) \u2013 A complete file path (ending in .dat)\n\n### AptDat.AptDatLine\n\nA single line from an `apt.dat` file.\n\n_class_ `xplane_airports.AptDat.AptDatLine`(_line\\_text_)\n\n**Method** `is_airport_header`() -> bool\\\nTrue if this line marks the beginning of an airport, seaport, or heliport\n\n**Method** `is_file_header`() -> bool\nTrue if this is part of an apt.dat file header\n\n**Method** `is_ignorable`() -> bool\\\nTrue if this line carries no semantic value for any airport in the apt.dat file.\n\n**Method** `is_runway`() -> bool\\\nTrue if this line represents a land runway, waterway, or helipad\n\n**Method** `runway_type` -> [RunwayType](#aptdatrunwaytype)\\\nThe type of runway represented by this line\n\n**Property** `tokens` -> list\\[str\\]\\\nThe tokens in this line\n\n### AptDat.RunwayType\n\n_class_ `xplane_airports.AptDat.RunwayType`\n\nEnum for row codes used to identify different types of runways:\n\n- LAND_RUNWAY\n- WATER_RUNWAY\n- HELIPAD\n\nThe `gateway` module\n=====================================================================================\n\nTools for interfacing with the X-Plane Scenery Gateway\u2019s API.\n\nDocs at: [https://gateway.x-plane.com/api](https://gateway.x-plane.com/api)\n\n### gateway.GatewayApt\n\n_class_ `xplane_airports.gateway.GatewayApt`(_apt: [AptDat.Airport](#aptdatairport), txt: Optional\\[str\\], readme: str, copying: str, pack\\_metadata: dict, apt\\_metadata: Optional\\[dict\\]_)\n\nAll the data we get back about an airport when we download a scenery pack via `scenery_pack()`\n\nDataclass members:\n\n- _apt_ ([Airport](#aptdatairport)): Python object with the contents of the `apt.dat` file\n- _txt_ (str or `None`): Contents of the DSF .txt file; airports with no 3D will not include this\n- _readme_ (str): Contents of the README for this scenery pack\n- _copying_ (str): Contents of the COPYING instructions for this scenery pack\n- _pack_metadata_ (dict): The JSON object received from the Gateway with metadata about this particular scenery pack\n- _apt_metadata_ (dict or `None`): The JSON object received from the Gateway with metadata about the airport this scenery pack represents; None if this hasn't been downloaded (yet)\n\n\n### gateway.GatewayFeature\n\n_class_ `xplane_airports.gateway.GatewayFeature`\n\nEnum class representing the features that may be used to tag scenery packs on the Gateway. Note that these are subject to frequent addition/removal/change; only a few are guaranteed to be stable.\n\n- HasATCFlow (guaranteed stable)\n- HasTaxiRoute (guaranteed stable)\n- HasNavaidConflict\n- AlwaysFlatten\n- HasLogTxtIssue\n- LRInternalUse (guaranteed stable)\n- ExcludeSubmissions (guaranteed stable)\n- HasGroundRoutes (guaranteed stable)\n- TerrainIncompatible\n- RunwayNumberingOrLengthFix\n- AlwaysFlattenIneffective\n- MajorAirport\n- TerrainIncompatibleAtPerimeter\n- RunwayNumberingFix\n- IconicAirport\n- FloatingRunway\n- GroundRoutesCertified\n- FacadeInjection\n- ScenicAirport\n- MisusedGroundPolygons\n- Top30\n- Top50\n- RunwayInWater\n- RunwayUnusable\n- TerrainMeshMissing\n- LowResolutionTerrainPolygons\n\n### API wrapping functions\n\n#### `xplane_airports.gateway.airport`(_airport\\_id_) -> dict\n\nQueries the Scenery Gateway for metadata on a single airport, plus metadata on all the scenery packs uploaded for that airport.\\\nAPI endpoint documented at: [https://gateway.x-plane.com/api#get-a-single-airport](https://gateway.x-plane.com/api#get-a-single-airport)\\\n\nReturns: A dict with metadata about the airport\\\nParameter: **airport\\_id** (_str_) \u2013 The identifier of the airport on the Gateway (may or may not be an ICAO ID)\n\n```python\n>>> expected_keys = {'icao', 'airportName', 'airportClass', 'latitude', 'longitude', 'elevation', 'acceptedSceneryCount', 'approvedSceneryCount', 'recommendedSceneryId', 'scenery'}\n>>> ksea = airport('KSEA')\n>>> all(key in ksea for key in expected_keys)\nTrue\n```\n\nIncludes metadata of all scenery packs uploaded for this airport:\n\n```python\n>>> len(airport('KSEA')['scenery']) >= 9\nTrue\n```\n\n```python\n>>> all_scenery_metadata = airport('KSEA')['scenery']\n>>> first_scenery_pack_metadata = all_scenery_metadata[0]\n>>> expected_keys = {'sceneryId', 'parentId', 'userId', 'userName', 'dateUploaded', 'dateAccepted', 'dateApproved', 'dateDeclined', 'type', 'features', 'artistComments', 'moderatorComments', 'Status'}\n>>> all(key in first_scenery_pack_metadata for key in expected_keys)\nTrue\n```\n\n#### `xplane_airports.gateway.airports`() -> dict\n\nQueries the Scenery Gateway for all the airports it knows about. Note that the download size is greater than 1 MB.\\\nAPI endpoint documented at: [https://gateway.x-plane.com/api#get-all-airports](https://gateway.x-plane.com/api#get-all-airports)\\\n\nReturns a dict with metadata on all 35,000+ airports; keys are X-Plane identifiers (which may or may not correspond to ICAO identifiers), and values are various airport metadata.\n\n```python\n>>> airports()['KSEA']\n{'AirportCode': 'KSEA', 'AirportName': 'Seattle Tacoma Intl', 'AirportClass': None, 'Latitude': 47, 'Longitude': -122, 'Elevation': None, 'Deprecated': None, 'DeprecatedInFavorOf': None, 'AcceptedSceneryCount': 2, 'ApprovedSceneryCount': 2, 'ExcludeSubmissions': 0, 'RecommendedSceneryId': 45283, 'Status': 'Scenery Submitted', 'SceneryType': 0, 'SubmissionCount': 2}\n```\n\n```python\n>>> len(airports()) > 35000\nTrue\n```\n\n#### `xplane_airports.gateway.recommended_scenery_packs`(_selective\\_apt\\_ids=None_) -> collections.Iterable\\[[GatewayApt](#gatewaygatewayapt)\\] \n\nA generator to iterate over the recommended scenery packs for all (or just the selected) airports on the Gateway. Downloads and unzips all files into memory.\n\nParameter: **selective\\_apt\\_ids** (_Union__\\[__collections.Iterable__\\[__str__\\]__,_ _None__\\]_) \u2013 If `None`, we will download scenery for all 35,000+ airports; if a list of airport IDs (as returned by `airports()`), the airports whose recommended packs we should download.\\\nReturns a generator of the recommended scenery packs; each pack contains the same data as a call to `scenery_pack()` directly\n\nEasily request a subset of airports:\n\n```python\n>>> packs = recommended_scenery_packs(['KSEA', 'KLAX', 'KBOS'])\n>>> len(list(packs)) == 3 and all(isinstance(pack, GatewayApt) for pack in packs)\nTrue\n```\n\nAudit airports for specific features:\n\n```python\n>>> all_3d = True\n>>> all_have_atc_flow = True\n>>> all_have_taxi_route = True\n>>> for pack in recommended_scenery_packs(['KATL', 'KORD', 'KDFW', 'KLAX']):\n... all_3d &= pack.pack_metadata['type'] == '3D' and pack.txt is not None\n... all_have_atc_flow &= GatewayFeature.HasATCFlow in pack.pack_metadata['features'] and pack.apt.has_traffic_flow()\n... all_have_taxi_route &= GatewayFeature.HasTaxiRoute in pack.pack_metadata['features'] and pack.apt.has_taxi_route()\n>>> all_3d and all_have_atc_flow and all_have_taxi_route\nTrue\n```\n\n#### `xplane_airports.gateway.scenery_pack`(_pack\\_to\\_download_) -> [GatewayApt](#gatewaygatewayapt)\n\nDownloads a single scenery pack, including its apt.dat and any associated DSF from the Gateway, and unzips it into memory.\n\nParameter: **pack\\_to\\_download** (_str_ or _int_) \u2013 If `int`, the scenery ID of the pack to be downloaded; if `str`, the airport whose recommended pack we should download.\\\nReturns the downloaded files and the metadata about the scenery pack\n\n```python\n>>> expected_keys = {'sceneryId', 'parentId', 'icao', 'aptName', 'userId', 'userName', 'dateUploaded', 'dateAccepted', 'dateApproved', 'dateDeclined', 'type', 'features', 'artistComments', 'moderatorComments', 'additionalMetadata', 'masterZipBlob'}\n>>> ksea_pack_metadata = scenery_pack('KSEA').pack_metadata\n>>> all(key in ksea_pack_metadata for key in expected_keys)\nTrue\n>>> scenery_pack('KORD').pack_metadata['type'] in ('3D', '2D')\nTrue\n>>> all(isinstance(feature, GatewayFeature) for feature in scenery_pack('KMCI').pack_metadata['features'])\nTrue\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/X-Plane/xplane_airports", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "xplane-airports", "package_url": "https://pypi.org/project/xplane-airports/", "platform": "", "project_url": "https://pypi.org/project/xplane-airports/", "project_urls": { "Homepage": "https://github.com/X-Plane/xplane_airports" }, "release_url": "https://pypi.org/project/xplane-airports/3.0.1/", "requires_dist": [ "requests", "dataclasses (>=0.6); python_version < \"3.7\"" ], "requires_python": ">=3.6", "summary": "Tools for manipulating X-Plane's apt.dat files & interfacing with the X-Plane Scenery Gateway", "version": "3.0.1" }, "last_serial": 5874329, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "f44a8e7d97469f22d83756ac83626a50", "sha256": "b35bcdbcd96dee120d9f9fe8a2d55f06e9f049c033731414185a58a63fc4a583" }, "downloads": -1, "filename": "xplane_airports-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f44a8e7d97469f22d83756ac83626a50", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 8226, "upload_time": "2018-11-09T20:44:48", "url": "https://files.pythonhosted.org/packages/af/96/c3da9794ba6a147aa888a9a8643cd3e0e2cae378157abbac39e627341e04/xplane_airports-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "564834b6dda2604dca8f59833260d101", "sha256": "3f537ef320758340e46e8e3cd58f0940703c6d5098f5b100da7e0de2e0e9475f" }, "downloads": -1, "filename": "xplane_airports-0.0.1.tar.gz", "has_sig": false, "md5_digest": "564834b6dda2604dca8f59833260d101", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 6763, "upload_time": "2018-11-09T20:44:50", "url": "https://files.pythonhosted.org/packages/2f/9a/d577f1a44c7711c046efc2e975c2dfe161ac400b65043c7fcccf4f5aff7e/xplane_airports-0.0.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "f089a41eaf6b702003cfc0632cf4422f", "sha256": "bfce93809ace38381c8bacf0bf36be7b3f0c83b2481ea7d4750135d2e2c73e5c" }, "downloads": -1, "filename": "xplane_airports-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f089a41eaf6b702003cfc0632cf4422f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16554, "upload_time": "2018-11-11T22:12:49", "url": "https://files.pythonhosted.org/packages/0e/f8/79f9f38d672ad7edfec5efe190fe5cb82db3e368263544b9bc6033938675/xplane_airports-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91b15c37edfb68318bfa3a565030ae65", "sha256": "42523029c9cd22a1b3e44658c836368bfbd843e8ae1c812aaa3d709f410a1195" }, "downloads": -1, "filename": "xplane_airports-1.0.0.tar.gz", "has_sig": false, "md5_digest": "91b15c37edfb68318bfa3a565030ae65", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 17428, "upload_time": "2018-11-11T22:12:51", "url": "https://files.pythonhosted.org/packages/dc/9e/9721ae5572ad83f66de76b0518fdcc7568e2a8357b0029738e47c28fd9b1/xplane_airports-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "222e6a319ef7a1d5e83e80c279ac0d50", "sha256": "d272544bc4553e8714ed8b9709c6649e5f1b62003505eeb9ce16372159980c33" }, "downloads": -1, "filename": "xplane_airports-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "222e6a319ef7a1d5e83e80c279ac0d50", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17484, "upload_time": "2018-11-12T13:57:30", "url": "https://files.pythonhosted.org/packages/ab/85/8882e12b95c05ee8e65db59276d244d8ae0cda087c4bb5d9a851a94f2f28/xplane_airports-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "71e27053c703e401e98c4bf4a9e5dff6", "sha256": "85f40e2d08af5eeb2024860c32760dac8785e090b56805656ba81bbe45dc472c" }, "downloads": -1, "filename": "xplane_airports-1.0.1.tar.gz", "has_sig": false, "md5_digest": "71e27053c703e401e98c4bf4a9e5dff6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 18849, "upload_time": "2018-11-12T13:57:31", "url": "https://files.pythonhosted.org/packages/da/e4/aefbcf37d8e2859381c36e381407cbf51e3be13b3f7e2ecd84ba6a082413/xplane_airports-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "02175d295837471b7af07239ed77f27b", "sha256": "ad90212be2b2cf51f4a42894ed67a4c9f74b0313e0fa5673794e0aabf28df10c" }, "downloads": -1, "filename": "xplane_airports-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "02175d295837471b7af07239ed77f27b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17979, "upload_time": "2018-11-12T14:35:27", "url": "https://files.pythonhosted.org/packages/3a/ce/c03b550481152a21bfd772766df7901a150d62f499996772b1158469d84c/xplane_airports-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea52f3f047b3e85a30966d0aa7f6ecae", "sha256": "b007855f28414a982eb23946ab382b5c31f360ed949c25c70c6d7a429543379b" }, "downloads": -1, "filename": "xplane_airports-1.1.0.tar.gz", "has_sig": false, "md5_digest": "ea52f3f047b3e85a30966d0aa7f6ecae", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 19858, "upload_time": "2018-11-12T14:35:29", "url": "https://files.pythonhosted.org/packages/f4/c2/33a6985cb41679969f2636811c7ce5a7557c8c8d820c3669951dcbfbf21c/xplane_airports-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "a0bb65c4cfc7d998e1e94fc99fb12024", "sha256": "702dbc2b01e274f84d3a3bc2d365127f4b1c35cdc40de8aff14cd81276af21e3" }, "downloads": -1, "filename": "xplane_airports-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a0bb65c4cfc7d998e1e94fc99fb12024", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 18056, "upload_time": "2018-11-12T16:54:58", "url": "https://files.pythonhosted.org/packages/a6/99/59578acd79d7aa9a2faee382bf423364651e389301be6ef0b448d54671a2/xplane_airports-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0255d43006a0a24948ce2728b61e7f8f", "sha256": "46aacba39a223214d28eb2dc9107cb3ad6260e9b3b5fd82671fada1af4889297" }, "downloads": -1, "filename": "xplane_airports-1.1.1.tar.gz", "has_sig": false, "md5_digest": "0255d43006a0a24948ce2728b61e7f8f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 20042, "upload_time": "2018-11-12T16:55:01", "url": "https://files.pythonhosted.org/packages/f5/d9/62fb8b264bdfcdb62b885016e5184648a36d1a5cb08cce5cf275338ff692/xplane_airports-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "48cd1fea20d38fc666c259a3b263b608", "sha256": "5d166fd67061cbbc7210f3c55348c88a1a25aaa118a55ce7531f5c2460e4cc3a" }, "downloads": -1, "filename": "xplane_airports-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "48cd1fea20d38fc666c259a3b263b608", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 18306, "upload_time": "2018-11-12T20:37:36", "url": "https://files.pythonhosted.org/packages/4e/c7/1da4a29be46d9de204dcb65a3888e0b6004bcc55297ffcbd0e12fa83aab4/xplane_airports-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "142ac201b0b843e0b649a5aad3a6e7cb", "sha256": "d2dff65b51a659e41c9d1147d3410f986cec37a09f2a94b09d2b2b2239e8c4b9" }, "downloads": -1, "filename": "xplane_airports-1.2.0.tar.gz", "has_sig": false, "md5_digest": "142ac201b0b843e0b649a5aad3a6e7cb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 20337, "upload_time": "2018-11-12T20:37:40", "url": "https://files.pythonhosted.org/packages/ca/4f/91ff4d99ff2744ff02869449795af6cd07be4d9a78a7b5a6bae8076f7612/xplane_airports-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "5dcda67d5e95229250265b3fbda2c912", "sha256": "c2e3d93723d29c7db9e98315318de78fd1a95c32b7ee56320030badd356e8fc6" }, "downloads": -1, "filename": "xplane_airports-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5dcda67d5e95229250265b3fbda2c912", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 19364, "upload_time": "2019-03-06T21:46:56", "url": "https://files.pythonhosted.org/packages/70/d8/347d686895b20c06433aad25267ecfa99eda4177e74a83c6c28804b49f54/xplane_airports-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3df0cc8ab8e5f588cbdd69eced41341c", "sha256": "fe4a4d12dccf4481fd2a53d3396b13d6435890c0b8c8564e694a39706d256695" }, "downloads": -1, "filename": "xplane_airports-1.2.1.tar.gz", "has_sig": false, "md5_digest": "3df0cc8ab8e5f588cbdd69eced41341c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 21860, "upload_time": "2019-03-06T21:46:57", "url": "https://files.pythonhosted.org/packages/a4/02/bc1639196a937c09a458239879ad526c1d64b16adea01571553aa8c97501/xplane_airports-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "3cacd59141e9e3e7e2bd2d28dc88151b", "sha256": "cf95319e0b2dea8cecbbd1e08535c94f3ece9f7e099729d48c87a704de3ed52f" }, "downloads": -1, "filename": "xplane_airports-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3cacd59141e9e3e7e2bd2d28dc88151b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 19941, "upload_time": "2019-05-24T18:08:38", "url": "https://files.pythonhosted.org/packages/ef/63/6ec6aea696e1f10905208160a0c6a655e036e36a6e4c10862a2644a908d3/xplane_airports-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "65867c6e1867e96b29635569234164e0", "sha256": "d947cea075270fdad7834a4bc94f32492b096814cdf30b47c610608e5521a193" }, "downloads": -1, "filename": "xplane_airports-1.3.0.tar.gz", "has_sig": false, "md5_digest": "65867c6e1867e96b29635569234164e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 22745, "upload_time": "2019-05-24T18:08:41", "url": "https://files.pythonhosted.org/packages/dc/e2/da556af80354f39a8e0707332521a79751a64c8d6326480f39ce841a75e7/xplane_airports-1.3.0.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "ece9e06efce7585bcdb3f3fd819c6e2d", "sha256": "cafbd4152c8941ab5e18d28bb42a7974bcbbf1983b41918bd28b26ce85dc3350" }, "downloads": -1, "filename": "xplane_airports-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ece9e06efce7585bcdb3f3fd819c6e2d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 20160, "upload_time": "2019-05-27T19:58:20", "url": "https://files.pythonhosted.org/packages/51/e4/c5aa8ae2a2dfbc1a8705384fcdf7e6a57fa280fe4bcc019ebb36273882e6/xplane_airports-2.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "57f8c9e84f785b23cd003e7b5180ad2f", "sha256": "e6fcf9d8c0fdf755d27a510d0d335e8926f66236a7f79ffa8ca9ab076deef877" }, "downloads": -1, "filename": "xplane_airports-2.0.0.tar.gz", "has_sig": false, "md5_digest": "57f8c9e84f785b23cd003e7b5180ad2f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 22913, "upload_time": "2019-05-27T19:58:24", "url": "https://files.pythonhosted.org/packages/ad/0f/8e6ba6b822fa32dab079a24b47c8429347c0ddb0fc43edf21205bca767cf/xplane_airports-2.0.0.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "dc7db5ddeec86b2126b8283ef2bbc0ae", "sha256": "0185ae88b978cc1be38070234452d418957e79527f3ce0d1025aa07a778c2c28" }, "downloads": -1, "filename": "xplane_airports-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dc7db5ddeec86b2126b8283ef2bbc0ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 20503, "upload_time": "2019-05-29T17:52:10", "url": "https://files.pythonhosted.org/packages/be/e1/0e3bd58f68219e5eec1a7b557b65e13fe88bf8250ddd97071088e5a44bdc/xplane_airports-2.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e5dc1819277233db614eed142e6e5dfa", "sha256": "e94823b045349934d60ecd9002590fb348b59bf83f1452cc465eaa32051b5bce" }, "downloads": -1, "filename": "xplane_airports-2.1.0.tar.gz", "has_sig": false, "md5_digest": "e5dc1819277233db614eed142e6e5dfa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 23493, "upload_time": "2019-05-29T17:52:15", "url": "https://files.pythonhosted.org/packages/53/5d/602f3e2a518f1a8295211cb5038e9bb2ac644735cce63905e0bca0b79d6f/xplane_airports-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "f1d19c6a51eb3aef6f0e981895a6f630", "sha256": "e21b78363bed27b1ea01410ebefd492c9e440cc0946b678f81243e08f8169e1a" }, "downloads": -1, "filename": "xplane_airports-2.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f1d19c6a51eb3aef6f0e981895a6f630", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 20766, "upload_time": "2019-05-29T18:52:26", "url": "https://files.pythonhosted.org/packages/e7/f0/58d29810beac2aa6278a7896ab67f04710679f533c0b613f951e1356d00e/xplane_airports-2.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3fb3160b7a3fb4d7ee1369635b456df4", "sha256": "458e1a9d4f741a5470ed202733af761f51a4d68a7b2f37952a7f9f427d8d6c52" }, "downloads": -1, "filename": "xplane_airports-2.1.1.tar.gz", "has_sig": false, "md5_digest": "3fb3160b7a3fb4d7ee1369635b456df4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 24049, "upload_time": "2019-05-29T18:52:32", "url": "https://files.pythonhosted.org/packages/88/c4/d56750e9231e7e11ede79977030c63ab1223706e053f9c3457b4ef2173ec/xplane_airports-2.1.1.tar.gz" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "38f7ee1a9c9ecf88a1bde59a3848d6b3", "sha256": "9dda987e46660b884bf027f0e519fe83d466a36415ddd7e1c6f84a814943eb0a" }, "downloads": -1, "filename": "xplane_airports-3.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "38f7ee1a9c9ecf88a1bde59a3848d6b3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 20952, "upload_time": "2019-06-03T19:39:05", "url": "https://files.pythonhosted.org/packages/4a/ec/8bcc84663389f739e28fd2c383279a6a656c5d14a1bc4e3e3b467279d693/xplane_airports-3.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "683d2c4e35726f463625663a6ac78c12", "sha256": "f958bb2c19da1a92308f871c7d7d3876470bf17e41af7a85c3afd286db5d8556" }, "downloads": -1, "filename": "xplane_airports-3.0.0.tar.gz", "has_sig": false, "md5_digest": "683d2c4e35726f463625663a6ac78c12", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 24343, "upload_time": "2019-06-03T19:39:11", "url": "https://files.pythonhosted.org/packages/61/de/97ff8d299795396d34d40f04e873ad1fbb36afb2a227c125ed343bbf7e16/xplane_airports-3.0.0.tar.gz" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "ff8a573c829ec1823cad5c321a1549b2", "sha256": "c005464a5b6c3ee0d5ffad27f603263d68e498144b6673776683a0ebf3c69342" }, "downloads": -1, "filename": "xplane_airports-3.0.1-py3.7.egg", "has_sig": false, "md5_digest": "ff8a573c829ec1823cad5c321a1549b2", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.6", "size": 39901, "upload_time": "2019-09-23T15:32:36", "url": "https://files.pythonhosted.org/packages/96/85/0bde96ce7dbefec32dd520a9ddb51490c8762c2fb1b07e5a8f263f2b1643/xplane_airports-3.0.1-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "dca523feec6880ebf38cf2bec6ed3c07", "sha256": "f3446614f0a164d03f31caae531eabe4a0f92778252449f253dec5a72c4fee98" }, "downloads": -1, "filename": "xplane_airports-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dca523feec6880ebf38cf2bec6ed3c07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20997, "upload_time": "2019-09-23T15:32:26", "url": "https://files.pythonhosted.org/packages/19/c1/02e8b6145aa144ab1a6113108d2e92dacb50be6ec5b5e40ab3ce2d55ce93/xplane_airports-3.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1cfd3cd1a7fda34902cc006e475a7c6d", "sha256": "f9353706700b01a981f988a01aa08fa369ec700ec1d3e60bf468997dd440393e" }, "downloads": -1, "filename": "xplane_airports-3.0.1.tar.gz", "has_sig": false, "md5_digest": "1cfd3cd1a7fda34902cc006e475a7c6d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 24546, "upload_time": "2019-09-23T15:32:38", "url": "https://files.pythonhosted.org/packages/9e/ab/5868379cb81026d82dbcc0d9a870b25617daf4ed020896044cf80eb9e5aa/xplane_airports-3.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ff8a573c829ec1823cad5c321a1549b2", "sha256": "c005464a5b6c3ee0d5ffad27f603263d68e498144b6673776683a0ebf3c69342" }, "downloads": -1, "filename": "xplane_airports-3.0.1-py3.7.egg", "has_sig": false, "md5_digest": "ff8a573c829ec1823cad5c321a1549b2", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.6", "size": 39901, "upload_time": "2019-09-23T15:32:36", "url": "https://files.pythonhosted.org/packages/96/85/0bde96ce7dbefec32dd520a9ddb51490c8762c2fb1b07e5a8f263f2b1643/xplane_airports-3.0.1-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "dca523feec6880ebf38cf2bec6ed3c07", "sha256": "f3446614f0a164d03f31caae531eabe4a0f92778252449f253dec5a72c4fee98" }, "downloads": -1, "filename": "xplane_airports-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dca523feec6880ebf38cf2bec6ed3c07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20997, "upload_time": "2019-09-23T15:32:26", "url": "https://files.pythonhosted.org/packages/19/c1/02e8b6145aa144ab1a6113108d2e92dacb50be6ec5b5e40ab3ce2d55ce93/xplane_airports-3.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1cfd3cd1a7fda34902cc006e475a7c6d", "sha256": "f9353706700b01a981f988a01aa08fa369ec700ec1d3e60bf468997dd440393e" }, "downloads": -1, "filename": "xplane_airports-3.0.1.tar.gz", "has_sig": false, "md5_digest": "1cfd3cd1a7fda34902cc006e475a7c6d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 24546, "upload_time": "2019-09-23T15:32:38", "url": "https://files.pythonhosted.org/packages/9e/ab/5868379cb81026d82dbcc0d9a870b25617daf4ed020896044cf80eb9e5aa/xplane_airports-3.0.1.tar.gz" } ] }