├── pyproject.toml ├── src └── fastfeedparser │ └── __init__.py ├── tests ├── integration │ ├── utf16_encoded.xml │ ├── malformed_rss_namespaced.xml │ ├── utf16_encoded.json │ ├── malformed_rss_namespaced.json │ ├── json_feed_sample.json │ ├── json_feed_sample.expected.json │ ├── stackoverflow.json │ ├── stackoverflow.xml │ ├── davidbau.json │ ├── foolcontrol.xml │ ├── osm-pl.json │ ├── osm-pl.xml │ ├── foolcontrol.json │ ├── postgis.xml │ └── postgis.json └── test_integration.py ├── LICENSE ├── setup.cfg ├── .gitignore ├── README.md └── benchmark.py /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools~=67.0", "wheel"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | -------------------------------------------------------------------------------- /src/fastfeedparser/__init__.py: -------------------------------------------------------------------------------- 1 | from .main import parse, FastFeedParserDict 2 | 3 | __version__ = "0.1.0" 4 | __all__ = ["parse", "FastFeedParserDict"] 5 | -------------------------------------------------------------------------------- /tests/integration/utf16_encoded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UTF-16 Encoded Feed 5 | https://example.com/ 6 | A feed encoded in UTF-16 7 | 8 | UTF-16 Entry 1 9 | https://example.com/entry1 10 | First entry in UTF-16 11 | Wed, 03 Jan 2024 12:00:00 GMT 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/integration/malformed_rss_namespaced.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | copyright 1979-2025 dylan harris 7 | Test Feed with Namespaced RSS 8 | https://example.com/ 9 | A malformed RSS feed with namespace prefixes 10 | 11 | Test Entry 1 12 | https://example.com/entry1 13 | First test entry 14 | Mon, 01 Jan 2024 12:00:00 GMT 15 | 16 | 17 | Test Entry 2 18 | https://example.com/entry2 19 | Second test entry 20 | Tue, 02 Jan 2024 12:00:00 GMT 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/integration/utf16_encoded.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "content": [ 5 | { 6 | "base": null, 7 | "language": null, 8 | "type": "text/html", 9 | "value": "First entry in UTF-16" 10 | } 11 | ], 12 | "description": "First entry in UTF-16", 13 | "id": "https://example.com/entry1", 14 | "link": "https://example.com/entry1", 15 | "links": [], 16 | "published": "2024-01-03T12:00:00+00:00", 17 | "title": "UTF-16 Entry 1" 18 | } 19 | ], 20 | "feed": { 21 | "id": null, 22 | "language": null, 23 | "link": "https://example.com/", 24 | "links": [], 25 | "subtitle": "A feed encoded in UTF-16", 26 | "subtitle_detail": { 27 | "base": null, 28 | "language": null, 29 | "type": "text/plain", 30 | "value": "A feed encoded in UTF-16" 31 | }, 32 | "title": "UTF-16 Encoded Feed", 33 | "title_detail": { 34 | "base": null, 35 | "language": null, 36 | "type": "text/plain", 37 | "value": "UTF-16 Encoded Feed" 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Kagi Search 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/integration/malformed_rss_namespaced.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "description": "First test entry", 5 | "id": "https://example.com/entry1", 6 | "link": "https://example.com/entry1", 7 | "links": [], 8 | "published": "2024-01-01T12:00:00+00:00", 9 | "title": "Test Entry 1" 10 | }, 11 | { 12 | "description": "Second test entry", 13 | "id": "https://example.com/entry2", 14 | "link": "https://example.com/entry2", 15 | "links": [], 16 | "published": "2024-01-02T12:00:00+00:00", 17 | "title": "Test Entry 2" 18 | } 19 | ], 20 | "feed": { 21 | "id": null, 22 | "language": null, 23 | "link": "https://example.com/", 24 | "links": [], 25 | "subtitle": "A malformed RSS feed with namespace prefixes", 26 | "subtitle_detail": { 27 | "base": null, 28 | "language": null, 29 | "type": "text/plain", 30 | "value": "A malformed RSS feed with namespace prefixes" 31 | }, 32 | "title": "Test Feed with Namespaced RSS", 33 | "title_detail": { 34 | "base": null, 35 | "language": null, 36 | "type": "text/plain", 37 | "value": "Test Feed with Namespaced RSS" 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = fastfeedparser 3 | version = 0.4.4 4 | author = Vladimir Prelovac 5 | author_email = vlad@kagi.com 6 | description = High performance RSS, Atom, JSON and RDF feed parser in Python 7 | long_description = file: README.md 8 | long_description_content_type = text/markdown 9 | url = https://github.com/kagisearch/fastfeedparser 10 | project_urls = 11 | Bug Tracker = https://github.com/kagisearch/fastfeedparser/issues 12 | classifiers = 13 | Programming Language :: Python :: 3 14 | Programming Language :: Python :: 3.7 15 | Programming Language :: Python :: 3.8 16 | Programming Language :: Python :: 3.9 17 | Programming Language :: Python :: 3.10 18 | Programming Language :: Python :: 3.11 19 | Programming Language :: Python :: 3.12 20 | Programming Language :: Python :: 3.13 21 | License :: OSI Approved :: MIT License 22 | Operating System :: OS Independent 23 | Development Status :: 4 - Beta 24 | Intended Audience :: Developers 25 | Topic :: Software Development :: Libraries :: Python Modules 26 | Topic :: Text Processing :: Markup :: XML 27 | 28 | [options] 29 | package_dir = 30 | = src 31 | packages = find: 32 | python_requires = >=3.7 33 | install_requires = 34 | dateparser 35 | lxml 36 | python-dateutil 37 | brotli 38 | 39 | [options.packages.find] 40 | where = src 41 | -------------------------------------------------------------------------------- /tests/integration/json_feed_sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "https://jsonfeed.org/version/1.1", 3 | "title": "Example JSON Feed", 4 | "home_page_url": "https://example.org/", 5 | "feed_url": "https://example.org/feed.json", 6 | "description": "An example JSON Feed for testing", 7 | "icon": "https://example.org/icon.png", 8 | "authors": [ 9 | { 10 | "name": "John Doe", 11 | "url": "https://example.org/john" 12 | } 13 | ], 14 | "language": "en-US", 15 | "items": [ 16 | { 17 | "id": "https://example.org/item1", 18 | "url": "https://example.org/item1", 19 | "title": "First JSON Feed Item", 20 | "content_html": "

This is the first item in our JSON feed.

", 21 | "summary": "First item summary", 22 | "date_published": "2024-01-15T12:00:00Z", 23 | "date_modified": "2024-01-15T13:00:00Z", 24 | "image": "https://example.org/item1.jpg", 25 | "authors": [ 26 | { 27 | "name": "Jane Smith" 28 | } 29 | ], 30 | "tags": ["test", "json", "feed"] 31 | }, 32 | { 33 | "id": "https://example.org/item2", 34 | "url": "https://example.org/item2", 35 | "title": "Second JSON Feed Item", 36 | "content_text": "This is plain text content for the second item.", 37 | "date_published": "2024-01-14T10:30:00Z", 38 | "tags": ["example"] 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /tests/test_integration.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | import pytest 5 | 6 | from fastfeedparser import parse 7 | 8 | _TESTS_DIR = Path(__file__).parent 9 | _INTEGRATION_DIR = _TESTS_DIR.joinpath("integration") 10 | 11 | 12 | def pytest_generate_tests(metafunc: pytest.Metafunc): 13 | # Include both XML and JSON feed files 14 | xml_files = list(_INTEGRATION_DIR.glob("*.xml")) 15 | 16 | # Only include JSON files that don't have a corresponding .xml file 17 | # (to avoid treating expected output files as feed inputs) 18 | json_files = [] 19 | for f in _INTEGRATION_DIR.glob("*.json"): 20 | # Skip .expected.json files 21 | if f.name.endswith(".expected.json"): 22 | continue 23 | # Skip .json files that have a corresponding .xml file (these are expected outputs) 24 | xml_equivalent = f.with_suffix(".xml") 25 | if xml_equivalent.exists(): 26 | continue 27 | # This is an actual JSON feed file 28 | json_files.append(f) 29 | 30 | all_feeds = sorted(xml_files + json_files) 31 | metafunc.parametrize("feed_path", all_feeds) 32 | 33 | 34 | def test_integration(feed_path: Path): 35 | feed = feed_path.read_bytes() 36 | feed_parsed = parse(feed) 37 | 38 | # For JSON feeds, use .expected.json extension for expected output 39 | # For XML feeds, use .json extension for expected output 40 | if feed_path.suffix == ".json": 41 | expected_path = feed_path.with_suffix(".expected.json") 42 | else: 43 | expected_path = feed_path.with_suffix(".json") 44 | 45 | try: 46 | expected = json.loads(expected_path.read_text()) 47 | except FileNotFoundError: 48 | expected_path.write_text( 49 | json.dumps(feed_parsed, ensure_ascii=False, indent=2, sort_keys=True) 50 | ) 51 | return 52 | assert feed_parsed == expected 53 | -------------------------------------------------------------------------------- /tests/integration/json_feed_sample.expected.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "author": "Jane Smith", 5 | "content": [ 6 | { 7 | "type": "text/html", 8 | "value": "

This is the first item in our JSON feed.

" 9 | } 10 | ], 11 | "description": "First item summary", 12 | "id": "https://example.org/item1", 13 | "image": "https://example.org/item1.jpg", 14 | "link": "https://example.org/item1", 15 | "links": [ 16 | { 17 | "href": "https://example.org/item1", 18 | "rel": "alternate", 19 | "type": "text/html" 20 | } 21 | ], 22 | "published": "2024-01-15T12:00:00+00:00", 23 | "tags": [ 24 | { 25 | "label": null, 26 | "scheme": null, 27 | "term": "test" 28 | }, 29 | { 30 | "label": null, 31 | "scheme": null, 32 | "term": "json" 33 | }, 34 | { 35 | "label": null, 36 | "scheme": null, 37 | "term": "feed" 38 | } 39 | ], 40 | "title": "First JSON Feed Item", 41 | "updated": "2024-01-15T13:00:00+00:00" 42 | }, 43 | { 44 | "content": [ 45 | { 46 | "type": "text/plain", 47 | "value": "This is plain text content for the second item." 48 | } 49 | ], 50 | "description": "This is plain text content for the second item.", 51 | "id": "https://example.org/item2", 52 | "link": "https://example.org/item2", 53 | "links": [ 54 | { 55 | "href": "https://example.org/item2", 56 | "rel": "alternate", 57 | "type": "text/html" 58 | } 59 | ], 60 | "published": "2024-01-14T10:30:00+00:00", 61 | "tags": [ 62 | { 63 | "label": null, 64 | "scheme": null, 65 | "term": "example" 66 | } 67 | ], 68 | "title": "Second JSON Feed Item" 69 | } 70 | ], 71 | "feed": { 72 | "author": "John Doe", 73 | "icon": "https://example.org/icon.png", 74 | "id": "https://example.org/feed.json", 75 | "language": "en-US", 76 | "link": "https://example.org/", 77 | "links": [ 78 | { 79 | "href": "https://example.org/", 80 | "rel": "alternate", 81 | "type": "text/html" 82 | }, 83 | { 84 | "href": "https://example.org/feed.json", 85 | "rel": "self", 86 | "type": "application/json" 87 | } 88 | ], 89 | "subtitle": "An example JSON Feed for testing", 90 | "title": "Example JSON Feed" 91 | } 92 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | .aider* 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FastFeedParser 2 | 3 | A high-performance feed parser for Python that handles RSS, Atom, and RDF. Built for speed, efficiency, and ease of use while delivering complete parsing capabilities. 4 | 5 | ### Why FastFeedParser? 6 | 7 | It's about 10x faster (check included `benchmark.py`) than popular feedparser 8 | library while keeping a familiar API. This speed comes from: 9 | 10 | - lxml for efficient XML parsing 11 | - Smart memory management 12 | - Minimal dependencies 13 | - Focused, streamlined code 14 | 15 | Powers feed processing for [Kagi Small Web](https://github.com/kagisearch/smallweb), handling processing of thousands of feeds at scale. 16 | 17 | 18 | ## Features 19 | 20 | - Fast parsing of RSS 2.0, Atom 1.0, and RDF/RSS 1.0 feeds 21 | - Robust error handling and encoding detection 22 | - Support for media content and enclosures 23 | - Automatic date parsing and standardization to UTC ISO 8601 format 24 | - Clean, Pythonic API similar to feedparser 25 | - Comprehensive handling of feed metadata 26 | - Support for various feed extensions (Media RSS, Dublin Core, etc.) 27 | 28 | 29 | ## Installation 30 | 31 | ```bash 32 | pip install fastfeedparser 33 | ``` 34 | 35 | ## Quick Start 36 | 37 | ```python 38 | import fastfeedparser 39 | 40 | # Parse from URL 41 | myfeed = fastfeedparser.parse('https://example.com/feed.xml') 42 | 43 | # Parse from string 44 | xml_content = ''' 45 | 46 | 47 | Example Feed 48 | ... 49 | 50 | ''' 51 | myfeed = fastfeedparser.parse(xml_content) 52 | 53 | # Access feed global information 54 | print(myfeed.feed.title) 55 | print(myfeed.feed.link) 56 | 57 | # Access feed entries 58 | for entry in myfeed.entries: 59 | print(entry.title) 60 | print(entry.link) 61 | print(entry.published) 62 | ``` 63 | 64 | ## Run Benchmark 65 | 66 | ```bash 67 | python benchmark.py 68 | ``` 69 | 70 | This will run benchmark on a number of feeds with output looking like this 71 | 72 | ``` 73 | Testing https://gessfred.xyz/rss.xml 74 | FastFeedParser: 17 entries in 0.004s 75 | Feedparser: 17 entries in 0.098s 76 | Speedup: 26.3x 77 | 78 | Testing https://fanf.dreamwidth.org/data/rss 79 | FastFeedParser: 25 entries in 0.005s 80 | Feedparser: 25 entries in 0.087s 81 | Speedup: 17.9x 82 | 83 | Testing https://jacobwsmith.xyz/feed.xml 84 | FastFeedParser: 121 entries in 0.030s 85 | Feedparser: 121 entries in 0.166s 86 | Speedup: 5.5x 87 | 88 | Testing https://bernsteinbear.com/feed.xml 89 | FastFeedParser: 11 entries in 0.007s 90 | Feedparser: 11 entries in 0.339s 91 | Speedup: 50.1x 92 | ``` 93 | 94 | 95 | ## Key Features 96 | 97 | ### Feed Types Support 98 | - RSS 2.0 99 | - Atom 1.0 100 | - RDF/RSS 1.0 101 | 102 | ### Content Handling 103 | - Automatic encoding detection 104 | - HTML content parsing 105 | - Media content extraction 106 | - Enclosure handling 107 | 108 | ### Metadata Support 109 | - Feed title, link, and description 110 | - Publication dates 111 | - Author information 112 | - Categories and tags 113 | - Media content and thumbnails 114 | 115 | ## API Reference 116 | 117 | ### Main Functions 118 | 119 | - `parse(source)`: Parse feed from a source that can be URL or a string 120 | 121 | 122 | ### Feed Object Structure 123 | 124 | The parser returns a `FastFeedParserDict` object with two main sections: 125 | 126 | - `feed`: Contains feed-level metadata 127 | - `entries`: List of feed entries 128 | 129 | Each entry contains: 130 | - `title`: Entry title 131 | - `link`: Entry URL 132 | - `description`: Entry description/summary 133 | - `published`: Publication date 134 | - `author`: Author information 135 | - `content`: Full content 136 | - `media_content`: Media attachments 137 | - `enclosures`: Attached files 138 | 139 | ## Requirements 140 | 141 | - Python 3.7+ 142 | - dateparser 143 | - lxml 144 | - python-dateutil 145 | 146 | ## Contributing 147 | 148 | Contributions are welcome! Please feel free to submit a Pull Request. 149 | 150 | ## License 151 | 152 | This project is licensed under the MIT License - see the LICENSE file for details. 153 | 154 | ## Acknowledgments 155 | 156 | Inspired by the [feedparser](https://github.com/kurtmckee/feedparser) project, FastFeedParser aims to provide a modern, high-performance alternative while maintaining a familiar API. 157 | -------------------------------------------------------------------------------- /tests/integration/stackoverflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "author": "nfarrar", 5 | "description": "

TL;DR: Is there a way to hook setuptool's 'develop' to install a set of development requirements when running python setup.py develop?

\n\n

I'm building my first python package using setuptools. I'm specifying the requirements as:

\n\n
requirements = [\n    'click',\n    'ansible',\n    'fabric',\n    'gitpython',\n    'pyyaml',\n    'jinja2',\n    'yapsy'\n]\n\ntest_requirements = [\n    'pytest',\n    'pytest-pep8',\n    'pytest-cov',\n]\n\nsetup(\n...\n    install_requires=requirements,\n    tests_require=test_requirements,\n...\n)\n
\n\n

During development, I've been installing the package (in a virtual environment) with:

\n\n
python setup.py develop\n
\n\n

and uninstalling with:

\n\n
python setup.py develop -u\n
\n\n

The package uses entry_points to install some command line scripts, so this sets up the commands for me and allows me to edit the package while testing the command at the same time.

\n\n

I also have some dependencies that I use for development ... sphinx + extensions and a couple other things (things that aren't needed to use the package). I'm just manually installing them in the virtual environment at the moment. I didn't see any documentation (and haven't found any examples on the googles) about how to wire them in with setuptools.

\n\n

Maybe there's a way to hook 'setup.py develop' to install an additional set of requirements? Another method I haven't read about?

", 6 | "id": "https://stackoverflow.com/q/28509965", 7 | "link": "https://stackoverflow.com/questions/28509965/setuptools-development-requirements", 8 | "links": [ 9 | { 10 | "href": "https://stackoverflow.com/questions/28509965/setuptools-development-requirements", 11 | "rel": "alternate", 12 | "title": null, 13 | "type": null 14 | } 15 | ], 16 | "published": "2015-02-13T22:39:34+00:00", 17 | "tags": [ 18 | { 19 | "label": null, 20 | "scheme": "https://stackoverflow.com/tags", 21 | "term": "python" 22 | }, 23 | { 24 | "label": null, 25 | "scheme": "https://stackoverflow.com/tags", 26 | "term": "setuptools" 27 | }, 28 | { 29 | "label": null, 30 | "scheme": "https://stackoverflow.com/tags", 31 | "term": "requirements" 32 | } 33 | ], 34 | "title": "Setuptools \"development\" Requirements", 35 | "updated": "2017-02-02T00:36:19+00:00" 36 | }, 37 | { 38 | "author": "Sean", 39 | "description": "

For more info on using setup.py vs requirements.txt, I found this article helpful.

\n\n

Update: September 2016

\n\n

I no longer use requirements.txt (see original answer below) for installing development only packages. The prevailing wisdom seems to be that requirements.txt should be used to pin deployments to specific version numbers, typically using pip freeze > requirements.txt. This ensures that the exact same versions of your project's dependencies and also your project's dependencies' dependencies are installed on all of your servers.

\n\n

I instead use the extras_require option to setup.

\n\n
requirements = [\n    'click',\n    'ansible',\n    'fabric',\n    'gitpython',\n    'pyyaml',\n    'jinja2',\n    'yapsy'\n]\n\nsetup({\n    install_requires=requirements,\n    extras_require={\n        'dev': [\n            'pytest',\n            'pytest-pep8',\n            'pytest-cov'\n        ]\n    }\n})\n
\n\n

Now, to install your package for development, you run pip install -e .[dev]. This installs all the regular required packages and those listed in the dev section of extras_require.

\n\n

Production installs can still be done with python setup.py install or pip install . (or with a requirements.txt file).

\n\n

Original Answer

\n\n

Here is a way to do it that seems to be in keeping with the recommendations I've run into regarding setup.py vs requirements.txt. Specify all your production dependencies in the install_requires parameter of setup.py.

\n\n
requirements = [\n    'click',\n    'ansible',\n    'fabric',\n    'gitpython',\n    'pyyaml',\n    'jinja2',\n    'yapsy'\n]\n\nsetup({\n    # ...\n    install_requires=requirements\n    # ...\n})\n
\n\n

Then create a requirements.txt file that instructs pip to install your production dependencies from setup.py as well as your testing dependencies.

\n\n
-e .\n\npytest\npytest-pep8\npytest-cov\n
\n\n

Now you can install your package for development with pip install -r requirements.txt. The -e . line will install your package and its dependencies from setup.py in development mode. To install on production, you could use python setup.py install or pip install .. This will only install the dependencies listed in setup.py.

", 40 | "id": "https://stackoverflow.com/questions/28509965/-/28842733#28842733", 41 | "link": "https://stackoverflow.com/questions/28509965/setuptools-development-requirements/28842733#28842733", 42 | "links": [ 43 | { 44 | "href": "https://stackoverflow.com/questions/28509965/setuptools-development-requirements/28842733#28842733", 45 | "rel": "alternate", 46 | "title": null, 47 | "type": null 48 | } 49 | ], 50 | "published": "2015-03-03T21:57:44+00:00", 51 | "title": "Answer by Sean for Setuptools \"development\" Requirements", 52 | "updated": "2017-02-02T00:36:19+00:00" 53 | } 54 | ], 55 | "feed": { 56 | "id": "https://stackoverflow.com/feeds/question/28509965", 57 | "language": null, 58 | "link": "https://stackoverflow.com/feeds/question/28509965", 59 | "links": [ 60 | { 61 | "href": "https://stackoverflow.com/q/28509965", 62 | "rel": "alternate", 63 | "title": null, 64 | "type": "text/html" 65 | } 66 | ], 67 | "subtitle": "most recent 30 from stackoverflow.com", 68 | "subtitle_detail": { 69 | "base": null, 70 | "language": null, 71 | "type": "text/plain", 72 | "value": "most recent 30 from stackoverflow.com" 73 | }, 74 | "title": "Setuptools \"development\" Requirements - Stack Overflow", 75 | "title_detail": { 76 | "base": null, 77 | "language": null, 78 | "type": "text/plain", 79 | "value": "Setuptools \"development\" Requirements - Stack Overflow" 80 | }, 81 | "updated": "2024-11-29T16:41:05Z" 82 | } 83 | } -------------------------------------------------------------------------------- /tests/integration/stackoverflow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Setuptools "development" Requirements - Stack Overflow 4 | 5 | 6 | most recent 30 from stackoverflow.com 7 | 2024-11-29T16:41:05Z 8 | https://stackoverflow.com/feeds/question/28509965 9 | https://creativecommons.org/licenses/by-sa/4.0/rdf 10 | 11 | https://stackoverflow.com/q/28509965 12 | 93 13 | Setuptools "development" Requirements 14 | 15 | 16 | 17 | 18 | nfarrar 19 | https://stackoverflow.com/users/212343 20 | 21 | 22 | 2015-02-13T22:39:34Z 23 | 2017-02-02T00:36:19Z 24 | 25 | <p><strong>TL;DR</strong>: Is there a way to hook setuptool's 'develop' to install a set of development requirements when running <code>python setup.py develop</code>? </p> <p>I'm building my first python package using setuptools. I'm specifying the requirements as:</p> <pre><code>requirements = [ 'click', 'ansible', 'fabric', 'gitpython', 'pyyaml', 'jinja2', 'yapsy' ] test_requirements = [ 'pytest', 'pytest-pep8', 'pytest-cov', ] setup( ... install_requires=requirements, tests_require=test_requirements, ... ) </code></pre> <p>During development, I've been installing the package (in a virtual environment) with:</p> <pre><code>python setup.py develop </code></pre> <p>and uninstalling with:</p> <pre><code>python setup.py develop -u </code></pre> <p>The package uses entry_points to install some command line scripts, so this sets up the commands for me and allows me to edit the package while testing the command at the same time.</p> <p>I also have some dependencies that I use for development ... sphinx + extensions and a couple other things (things that aren't needed to use the package). I'm just manually installing them in the virtual environment at the moment. I didn't see any documentation (and haven't found any examples on the googles) about how to wire them in with setuptools.</p> <p>Maybe there's a way to hook 'setup.py develop' to install an additional set of requirements? Another method I haven't read about?</p> 26 | 27 | 28 | 29 | https://stackoverflow.com/questions/28509965/-/28842733#28842733 30 | 158 31 | Answer by Sean for Setuptools "development" Requirements 32 | 33 | Sean 34 | https://stackoverflow.com/users/302898 35 | 36 | 37 | 2015-03-03T21:57:44Z 38 | 2017-02-02T00:36:19Z 39 | <p>For more info on using <code>setup.py</code> vs <code>requirements.txt</code>, I found <a href="https://caremad.io/2013/07/setup-vs-requirement/" rel="noreferrer">this article</a> helpful.</p> <h1>Update: September 2016</h1> <p>I no longer use <code>requirements.txt</code> (see original answer below) for installing development only packages. The prevailing wisdom seems to be that <code>requirements.txt</code> should be used to pin deployments to specific version numbers, typically using <code>pip freeze &gt; requirements.txt</code>. This ensures that the exact same versions of your project's dependencies and also your project's dependencies' dependencies are installed on all of your servers.</p> <p>I instead use the <code>extras_require</code> option to <code>setup</code>.</p> <pre><code>requirements = [ 'click', 'ansible', 'fabric', 'gitpython', 'pyyaml', 'jinja2', 'yapsy' ] setup({ install_requires=requirements, extras_require={ 'dev': [ 'pytest', 'pytest-pep8', 'pytest-cov' ] } }) </code></pre> <p>Now, to install your package for development, you run <code>pip install -e .[dev]</code>. This installs all the regular required packages <strong>and</strong> those listed in the <code>dev</code> section of <code>extras_require</code>.</p> <p>Production installs can still be done with <code>python setup.py install</code> or <code>pip install .</code> (or with a <code>requirements.txt</code> file).</p> <h1>Original Answer</h1> <p>Here is <em>a</em> way to do it that seems to be in keeping with the recommendations I've run into regarding <code>setup.py</code> vs <code>requirements.txt</code>. Specify all your production dependencies in the <code>install_requires</code> parameter of <code>setup.py</code>.</p> <pre><code>requirements = [ 'click', 'ansible', 'fabric', 'gitpython', 'pyyaml', 'jinja2', 'yapsy' ] setup({ # ... install_requires=requirements # ... }) </code></pre> <p>Then create a <code>requirements.txt</code> file that instructs pip to install your production dependencies from <code>setup.py</code> as well as your testing dependencies.</p> <pre><code>-e . pytest pytest-pep8 pytest-cov </code></pre> <p>Now you can install your package for development with <code>pip install -r requirements.txt</code>. The <code>-e .</code> line will install your package and its dependencies from <code>setup.py</code> in development mode. To install on production, you could use <code>python setup.py install</code> or <code>pip install .</code>. This will only install the dependencies listed in <code>setup.py</code>.</p> 40 | 41 | 42 | -------------------------------------------------------------------------------- /tests/integration/davidbau.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "author": "David", 5 | "description": "There is a false dichotomy between two alternatives facing us in the burgeoning AI industry today: \"open\" versus \"closed.\" This dichotomy is being promoted by both sides: Closed-AI advocates (oddly, including the company named \"Open AI\") justifiably warn about the...", 6 | "id": "http://davidbau.com/archives/2024/03/28/the_right_kind_of_openness_for_ai.html", 7 | "link": "http://davidbau.com/archives/2024/03/28/the_right_kind_of_openness_for_ai.html", 8 | "links": [], 9 | "published": "2024-03-28T11:08:34+00:00", 10 | "title": "The Right Kind of Openness for AI" 11 | }, 12 | { 13 | "author": "David", 14 | "description": "Following my 2017 blog entry, Reinvention, where I had looked back to recount my jump from industry back to academia. Here is a video from the CSAIL 60th anniversary celebration where I finish telling my personal academic story about a...", 15 | "id": "http://davidbau.com/archives/2024/03/16/reinvented.html", 16 | "link": "http://davidbau.com/archives/2024/03/16/reinvented.html", 17 | "links": [], 18 | "published": "2024-03-16T22:27:29+00:00", 19 | "title": "Reinvented" 20 | }, 21 | { 22 | "author": "David", 23 | "description": "In 1936, Alonzo Church made an amazing discovery: if a function can treat other functions as data, then it becomes so powerful that it can even express unsolvable problems. We know that deep neural networks learn to represent many concepts...", 24 | "id": "http://davidbau.com/archives/2023/10/28/function_vectors_in_large_language_models.html", 25 | "link": "http://davidbau.com/archives/2023/10/28/function_vectors_in_large_language_models.html", 26 | "links": [], 27 | "published": "2023-10-28T16:17:50+00:00", 28 | "title": "Function Vectors in Large Language Models" 29 | }, 30 | { 31 | "author": "David", 32 | "description": "The idea that large language models could be capable of cognition is not obvious. Neural language modeling has been around since Jeff Elman�s 1990 structure-in-time work, but 33 years passed between that initial idea and first contact with ChatGPT. What...", 33 | "id": "http://davidbau.com/archives/2023/04/02/is_artificial_intelligence_intelligent.html", 34 | "link": "http://davidbau.com/archives/2023/04/02/is_artificial_intelligence_intelligent.html", 35 | "links": [], 36 | "published": "2023-04-02T20:08:00+00:00", 37 | "title": "Is Artificial Intelligence Intelligent?" 38 | }, 39 | { 40 | "author": "David", 41 | "description": "Today, I received an email from my good college friend David Maymudes. David got his math degree from Harvard a few years ahead of me, and we have both worked at Microsoft and Google at overlapping times. He is still...", 42 | "id": "http://davidbau.com/archives/2023/03/28/catching_up.html", 43 | "link": "http://davidbau.com/archives/2023/03/28/catching_up.html", 44 | "links": [], 45 | "published": "2023-03-28T10:44:36+00:00", 46 | "title": "Catching Up" 47 | }, 48 | { 49 | "author": "David", 50 | "description": "Here is runningstats.py, a useful little module for computing efficient online GPU statistics in Pytorch. Pytorch is great for working with small batches of data: if you want to do some calculations over 100 small images, all the features fit...", 51 | "id": "http://davidbau.com/archives/2021/12/28/running_statistics_for_pytorch.html", 52 | "link": "http://davidbau.com/archives/2021/12/28/running_statistics_for_pytorch.html", 53 | "links": [], 54 | "published": "2021-12-28T19:23:45+00:00", 55 | "title": "Running Statistics for Pytorch" 56 | }, 57 | { 58 | "author": "David", 59 | "description": "Join me at this link on Reddit on Tuesday 3pmET/12PT to #AMA about interpreting deep nets, AI research in academia vs industry; life as a PhD student. I am a new CS Prof at Northeastern @KhouryCollege; postdoc at Harvard; recent...", 60 | "id": "http://davidbau.com/archives/2021/11/26/reddit_ama.html", 61 | "link": "http://davidbau.com/archives/2021/11/26/reddit_ama.html", 62 | "links": [], 63 | "published": "2021-11-26T16:21:47+00:00", 64 | "title": "Reddit AMA" 65 | }, 66 | { 67 | "author": "David", 68 | "description": "I am thrilled to announce that I will be joining the Northeastern University Khoury College of Computer Science as an Assistant Professor in Fall 2022. For prospective students who are thinking of a PhD, now is a perfect time to...", 69 | "id": "http://davidbau.com/archives/2021/08/25/assistant_professor_at_neu_khoury.html", 70 | "link": "http://davidbau.com/archives/2021/08/25/assistant_professor_at_neu_khoury.html", 71 | "links": [], 72 | "published": "2021-08-25T23:48:54+00:00", 73 | "title": "Assistant Professor at NEU Khoury" 74 | }, 75 | { 76 | "author": "David", 77 | "description": "Today I did my PhD defense, and my talk will be posted here on youtube. Here is the talk! Title: Dissection of Deep Networks Do deep networks contain concepts? One of the great challenges of neural networks is to understand...", 78 | "id": "http://davidbau.com/archives/2021/08/24/phd_defense.html", 79 | "link": "http://davidbau.com/archives/2021/08/24/phd_defense.html", 80 | "links": [], 81 | "published": "2021-08-24T20:13:57+00:00", 82 | "title": "PhD Defense" 83 | }, 84 | { 85 | "author": "David", 86 | "description": "Do you think the world is much darker than it used to be? If so, you are not alone. I have always assumed that a feeling of psychological decline is just a side-effect of getting older. But a paper by...", 87 | "id": "http://davidbau.com/archives/2021/08/06/global_catastrophizing.html", 88 | "link": "http://davidbau.com/archives/2021/08/06/global_catastrophizing.html", 89 | "links": [], 90 | "published": "2021-08-06T13:10:07+00:00", 91 | "title": "Global Catastrophizing" 92 | }, 93 | { 94 | "author": "David", 95 | "description": "As part of modernizing U.S. infrastructure, America should eliminate passwords. Our use of passwords�to build security on the internet is akin to using flammable materials to build houses in densely-populated cities.� Every single website that collects, stores and transmits password...", 96 | "id": "http://davidbau.com/archives/2021/03/18/passwords_should_be_illegal.html", 97 | "link": "http://davidbau.com/archives/2021/03/18/passwords_should_be_illegal.html", 98 | "links": [], 99 | "published": "2021-03-18T17:28:08+00:00", 100 | "title": "Passwords should be illegal" 101 | }, 102 | { 103 | "author": "David", 104 | "description": "Today Twitter and Facebook decided to manually limit the spread of the NY Post's unverified story about a hack on the Biden family. Taking responsibility for some of the broad impacts of their systems is an excellent move. But the...", 105 | "id": "http://davidbau.com/archives/2020/10/16/deception_is_a_bug.html", 106 | "link": "http://davidbau.com/archives/2020/10/16/deception_is_a_bug.html", 107 | "links": [], 108 | "published": "2020-10-16T17:42:47+00:00", 109 | "title": "Deception is a Bug" 110 | }, 111 | { 112 | "author": "David", 113 | "description": "Can the rules in a deep network be directly rewritten? State-of-the-art deep nets are trained as black boxes, using huge piles of data and millions of rounds of optimization that can take weeks to complete. But what if we want...", 114 | "id": "http://davidbau.com/archives/2020/08/19/rewriting_a_deep_generative_model.html", 115 | "link": "http://davidbau.com/archives/2020/08/19/rewriting_a_deep_generative_model.html", 116 | "links": [], 117 | "published": "2020-08-19T16:11:04+00:00", 118 | "title": "Rewriting a Deep Generative Model" 119 | }, 120 | { 121 | "author": "David", 122 | "description": "Pytorch has a great design: easy and powerful. Easy enough that it is definitely possible to use pytorch without understanding what it is doing or why. But it also gets better the more you understand. As part of summer school...", 123 | "id": "http://davidbau.com/archives/2020/07/05/davids_tips_on_how_to_read_pytorch.html", 124 | "link": "http://davidbau.com/archives/2020/07/05/davids_tips_on_how_to_read_pytorch.html", 125 | "links": [], 126 | "published": "2020-07-05T19:58:54+00:00", 127 | "title": "David's Tips on How to Read Pytorch" 128 | }, 129 | { 130 | "author": "David", 131 | "description": "Whenever Heidi gets a headache after coming back from the hospital, I worry about losing her to COVID. But I am very aware that, with the virus already so widespread, the decisive battle is no longer being fought by doctors...", 132 | "id": "http://davidbau.com/archives/2020/04/25/a_covid_battle_map.html", 133 | "link": "http://davidbau.com/archives/2020/04/25/a_covid_battle_map.html", 134 | "links": [], 135 | "published": "2020-04-25T23:45:19+00:00", 136 | "title": "A COVID Battle Map" 137 | } 138 | ], 139 | "feed": { 140 | "id": null, 141 | "language": null, 142 | "link": "http://davidbau.com/", 143 | "links": [], 144 | "subtitle": "A Dabbler's Weblog", 145 | "subtitle_detail": { 146 | "base": null, 147 | "language": null, 148 | "type": "text/plain", 149 | "value": "A Dabbler's Weblog" 150 | }, 151 | "title": "davidbau.com", 152 | "title_detail": { 153 | "base": null, 154 | "language": null, 155 | "type": "text/plain", 156 | "value": "davidbau.com" 157 | }, 158 | "updated": "2024-03-28T06:08:34-05:00" 159 | } 160 | } -------------------------------------------------------------------------------- /benchmark.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import time 3 | 4 | import fastfeedparser 5 | import feedparser 6 | import httpx 7 | 8 | # Test feeds 9 | feeds = [ 10 | "https://feedpress.me/FIJ", 11 | "https://techtinkering.com/feed.xml", 12 | "https://glineq.blogspot.com/feeds/posts/default", 13 | "https://stml.tumblr.com/rss", 14 | "http://feeds.feedburner.com/mishadoff", 15 | "https://lisacharlottemuth.com/atom.xml", 16 | "https://emacsninja.com/feed.atom", 17 | "http://causality.cs.ucla.edu/blog/index.php/feed/", 18 | "https://blog.railsapps.org/rss", 19 | "https://www.bravelysheblogs.com/feed/", 20 | "https://realphysics.blogspot.com/feeds/posts/default", 21 | "https://staysaasy.com/feed.xml", 22 | "https://explog.in/rss.xml", 23 | "https://planet.clojure.in/atom.xml", 24 | "https://www.youtube.com/feeds/videos.xml?channel_id=UCsE74YJvPJpaquzTPMO8hAA", 25 | "https://www.petekeen.net/index.xml", 26 | "https://jelleraaijmakers.nl/feed", 27 | "https://fale.io/index.xml", 28 | "https://gessfred.xyz/rss.xml", 29 | "https://fanf.dreamwidth.org/data/rss", 30 | "https://bernsteinbear.com/feed.xml", 31 | "https://feeds.kottke.org/main", 32 | "https://alefesouza.com/feed/", 33 | "https://amitg.blog/feed.atom", 34 | "https://www.alwaystwisted.com/rss.php", 35 | "https://blog.kagi.com/rss.xml", 36 | "https://aaronfrancis.com/feed", 37 | "http://davidbau.com/index.rdf", 38 | "https://jesperbylund.com/rss", 39 | "https://aarvik.dk/rss/index.html", 40 | "http://dontcodetired.com/blog/syndication.axd", 41 | "https://aivarsk.com/atom.xml", 42 | "http://markcoddington.com/feed/", 43 | "https://andresb.net/blog/feed/", 44 | "http://feeds.d15.biz/Daniel15", 45 | "https://alwaystwisted.com/feed.xml", 46 | "https://aly.arriqaaq.com/rss/", 47 | "https://nithinbekal.com/feed.xml", 48 | "https://blog.emacsen.net/atom.xml", 49 | "https://therecouldhavebeensnakes.wordpress.com/feed/", 50 | "https://journal.jatan.space/rss/", 51 | "https://alexwlchan.net/atom.xml", 52 | "https://telescoper.blog/feed/", 53 | "https://blog.knatten.org/feed/", 54 | "https://timtech.blog/feed/feed.xml", 55 | "https://iampaulbrown.com/rss", 56 | "https://benlog.com/feed/", 57 | "https://raggywaltz.com/feed/", 58 | "https://herman.bearblog.dev/feed/", 59 | "https://dylanharris.org/feed-me.rss", 60 | "https://eliot-jones.com/rss", 61 | "https://www.byjp.me/index.xml", 62 | "https://jfg-mysql.blogspot.com/feeds/posts/default", 63 | "https://dzidas.com/atom.xml", 64 | "https://ariannasimpson.com/blog/feed/", 65 | "https://www.everydayislikewednesday.com/atom.xml", 66 | "https://www.bastibl.net/atom.xml", 67 | "https://yuxi.ml/feeds.xml", 68 | "https://bugramming.dev/index.xml", 69 | "https://blog.iangilman.com/rss.xml", 70 | "https://raahel.bearblog.dev/atom/", 71 | "https://mahdytech.com/rss.xml", 72 | "https://fogblog-hermansheephouse.blogspot.com/feeds/posts/default", 73 | "https://ctoomey.com/atom.xml", 74 | "https://blog.lasheen.dev/index.xml", 75 | "https://markheath.net/feed/rss", 76 | "https://stancarney.co/rss/", 77 | "https://bigmachine.io/feed.xml", 78 | "https://anteru.net/rss.xml", 79 | "https://blog.drewolson.org/index.xml", 80 | "https://blog.noredink.com/rss", 81 | "https://glasspetalsmoke.blogspot.com/feeds/posts/default", 82 | "https://feeds.washingtonpost.com/rss/world", 83 | "https://abcnews.go.com/abcnews/internationalheadlines", 84 | "https://aljazeera.com/xml/rss/all.xml", 85 | "https://allafrica.com/tools/headlines/rdf/latest/headlines.rdf", 86 | "https://api.axios.com/feed/world", 87 | "https://en.mercopress.com/rss/", 88 | "https://feeds.a.dj.com/rss/RSSWorldNews.xml", 89 | "https://feeds.bbci.co.uk/news/world/rss.xml", 90 | "https://feeds.elpais.com/mrss-s/pages/ep/site/english.elpais.com/portada", 91 | "https://feeds.feedburner.com/ndtvnews-world-news", 92 | "https://feeds.npr.org/1004/rss.xml", 93 | "https://foreignpolicy.com/feed/", 94 | "https://japantoday.com/category/world/feed", 95 | "https://restofworld.org/feed/latest", 96 | "https://rss.csmonitor.com/feeds/all", 97 | "https://rss.dw.com/rdf/rss-en-all", 98 | "https://rss.nytimes.com/services/xml/rss/nyt/World.xml", 99 | "https://theweek.com/feeds.xml", 100 | "https://time.com/world/feed", 101 | "https://www.abc.net.au/news/feed/45910/rss.xml", 102 | "https://www.al-monitor.com/rss", 103 | "https://www.boston.com/tag/world-news/feed/", 104 | "https://www.cbsnews.com/latest/rss/world", 105 | "https://www.dawn.com/feeds/world/", 106 | "https://www.economist.com/asia/rss.xml", 107 | "https://time.com/tech/feed/", 108 | "http://stratechery.com/feed/", 109 | "https://www.404media.co/rss/", 110 | ] 111 | 112 | 113 | headers = { 114 | "User-Agent": "Mozilla/5.0 fastfeedparser", 115 | "Accept": "*/*", 116 | "Connection": "close", 117 | } 118 | 119 | 120 | def process_feed(url, skip_feedparser=False, iterations=3): 121 | """Process a single feed and return timing results.""" 122 | result = { 123 | "url": url, 124 | "ffp_time": 0, 125 | "fp_time": 0, 126 | "ffp_entries": 0, 127 | "fp_entries": 0, 128 | "success": False, 129 | } 130 | 131 | try: 132 | # Create client per request for ProcessPoolExecutor compatibility 133 | with httpx.Client(verify=False) as client: 134 | resp = client.get(url, timeout=20.0, follow_redirects=True, headers=headers) 135 | content = resp.content 136 | 137 | # Test fastfeedparser 138 | try: 139 | start_time = time.perf_counter() 140 | for _ in range(iterations): 141 | feed = fastfeedparser.parse(content) 142 | result["ffp_time"] = (time.perf_counter() - start_time) / iterations 143 | result["ffp_entries"] = len(feed.entries) 144 | print( 145 | f"[{url}] FastFeedParser: {len(feed.entries)} entries in {result['ffp_time']:.3f}s (avg of {iterations} runs)" 146 | ) 147 | except Exception as e: 148 | result["ffp_time"] = (time.perf_counter() - start_time) / iterations 149 | print(f"[{url}] FastFeedParser failed: {e}") 150 | 151 | # Test feedparser 152 | if not skip_feedparser: 153 | try: 154 | start_time = time.perf_counter() 155 | for _ in range(iterations): 156 | feed = feedparser.parse(content) 157 | result["fp_time"] = (time.perf_counter() - start_time) / iterations 158 | result["fp_entries"] = len(feed.entries) 159 | print( 160 | f"[{url}] Feedparser: {len(feed.entries)} entries in {result['fp_time']:.3f}s (avg of {iterations} runs)" 161 | ) 162 | except Exception as e: 163 | result["fp_time"] = (time.perf_counter() - start_time) / iterations 164 | print(f"[{url}] Feedparser failed: {e}") 165 | 166 | if skip_feedparser: 167 | if result["ffp_time"] > 0: 168 | result["success"] = True 169 | else: 170 | if result["ffp_time"] > 0 and result["fp_time"] > 0: 171 | result["success"] = True 172 | print(f"[{url}] Speedup: {result['fp_time']/result['ffp_time']:.1f}x") 173 | 174 | except Exception as e: 175 | print(f"[{url}] Failed to fetch feed: {e}") 176 | 177 | return result 178 | 179 | 180 | def test_parsers(skip_feedparser=False, iterations=3): 181 | print("Testing feed parsers...") 182 | if skip_feedparser: 183 | print("Running in FastFeedParser-only mode (-s)") 184 | print(f"Processing feeds sequentially (no parallelization)...") 185 | print(f"Each feed will be parsed {iterations} times for accurate timing") 186 | print("-" * 50) 187 | 188 | results = [] 189 | overall_start_time = time.perf_counter() 190 | 191 | # Simple sequential loop - no parallelization 192 | for url in feeds: 193 | try: 194 | result = process_feed(url, skip_feedparser, iterations) 195 | results.append(result) 196 | except Exception as e: 197 | print(f"Exception processing {url}: {e}") 198 | 199 | overall_time = time.perf_counter() - overall_start_time 200 | 201 | # Calculate totals 202 | total_ffp_time = sum(r["ffp_time"] for r in results) 203 | total_fp_time = sum(r["fp_time"] for r in results) 204 | total_ffp_entries = sum(r["ffp_entries"] for r in results) 205 | total_fp_entries = sum(r["fp_entries"] for r in results) 206 | successful_feeds = sum(1 for r in results if r["success"]) 207 | 208 | # Find outliers 209 | entry_mismatches = [] 210 | slow_feeds = [] 211 | 212 | for r in results: 213 | if not r["success"]: 214 | continue 215 | 216 | # Check for entry count mismatches 217 | if not skip_feedparser and r["ffp_entries"] != r["fp_entries"]: 218 | entry_mismatches.append({ 219 | "url": r["url"], 220 | "ffp_entries": r["ffp_entries"], 221 | "fp_entries": r["fp_entries"], 222 | "diff": r["ffp_entries"] - r["fp_entries"] 223 | }) 224 | 225 | # Check for slow performance (less than 1.1x speedup) 226 | if not skip_feedparser and r["fp_time"] > 0 and r["ffp_time"] > 0: 227 | speedup = r["fp_time"] / r["ffp_time"] 228 | if speedup < 1.1: 229 | slow_feeds.append({ 230 | "url": r["url"], 231 | "speedup": speedup, 232 | "ffp_time": r["ffp_time"], 233 | "fp_time": r["fp_time"] 234 | }) 235 | 236 | print("\nSummary:") 237 | print("-" * 50) 238 | print(f"Total wall-clock time: {overall_time:.2f}s (with parallel execution)") 239 | print(f"Successfully tested {successful_feeds}/{len(feeds)} feeds") 240 | if successful_feeds > 0: 241 | print(f"\nFastFeedParser:") 242 | print(f" Total entries: {total_ffp_entries}") 243 | print(f" Total parsing time: {total_ffp_time:.2f}s") 244 | print(f" Average per feed: {total_ffp_time/successful_feeds:.3f}s") 245 | 246 | if not skip_feedparser: 247 | print(f"\nFeedparser:") 248 | print(f" Total entries: {total_fp_entries}") 249 | print(f" Total parsing time: {total_fp_time:.2f}s") 250 | print(f" Average per feed: {total_fp_time/successful_feeds:.3f}s") 251 | print( 252 | f"\nSpeedup: FastFeedParser is {(total_fp_time/total_ffp_time):.1f}x faster" 253 | ) 254 | 255 | # Report outliers 256 | if entry_mismatches: 257 | print(f"\n⚠️ OUTLIERS: Entry Count Mismatches ({len(entry_mismatches)} feeds)") 258 | print("-" * 50) 259 | for m in entry_mismatches: 260 | print(f" {m['url']}") 261 | print(f" FastFeedParser: {m['ffp_entries']} entries") 262 | print(f" Feedparser: {m['fp_entries']} entries") 263 | print(f" Difference: {m['diff']:+d}") 264 | 265 | if slow_feeds: 266 | print(f"\n⚠️ OUTLIERS: Slow Performance (<1.1x speedup, {len(slow_feeds)} feeds)") 267 | print("-" * 50) 268 | slow_feeds.sort(key=lambda x: x["speedup"]) 269 | for s in slow_feeds: 270 | print(f" {s['url']}") 271 | print(f" Speedup: {s['speedup']:.2f}x") 272 | print(f" FastFeedParser: {s['ffp_time']*1000:.2f}ms") 273 | print(f" Feedparser: {s['fp_time']*1000:.2f}ms") 274 | 275 | 276 | if __name__ == "__main__": 277 | parser = argparse.ArgumentParser(description="Benchmark feed parsers") 278 | parser.add_argument( 279 | "-s", 280 | "--skip-feedparser", 281 | action="store_true", 282 | help="Skip feedparser and run only fastfeedparser", 283 | ) 284 | parser.add_argument( 285 | "-i", 286 | "--iterations", 287 | type=int, 288 | default=3, 289 | help="Number of iterations to run for each feed (default: 3)", 290 | ) 291 | args = parser.parse_args() 292 | 293 | test_parsers( 294 | skip_feedparser=args.skip_feedparser, 295 | iterations=args.iterations, 296 | ) 297 | -------------------------------------------------------------------------------- /tests/integration/foolcontrol.xml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | FoolControl: Phear the penguin 15 | 16 | https://foolcontrol.org 17 | Adnan Hodzic on Linux, Open Source, DevOps, Cloud and much more :) 18 | Fri, 25 Oct 2024 10:14:37 +0000 19 | en-US 20 | 21 | hourly 22 | 23 | 1 24 | https://wordpress.org/?v=6.6.2 25 | 26 | 27 | https://storage.googleapis.com/foolcontrol-media/2024/09/ee9804c9-cropped-e4e3292a-foolcontrol-favicon-32x32.png 28 | FoolControl: Phear the penguin 29 | https://foolcontrol.org 30 | 32 31 | 32 32 | 33 | 131041528 34 | wp-cloud-run: Ultimate WordPress setup on (GCP) Cloud Run 35 | https://foolcontrol.org/?p=4802 36 | https://foolcontrol.org/?p=4802#respond 37 | 38 | 39 | Sun, 20 Oct 2024 16:07:49 +0000 40 | 41 | 42 | 43 | 44 | 45 | https://foolcontrol.org/?p=4802 46 | 47 | 48 | 49 | https://foolcontrol.org/?feed=rss2&p=4802 50 | 0 51 | 52 | 53 | 4802 54 | 55 | Effortless Linux backups: Power of OpenZFS Snapshots on Ubuntu 24.04 56 | https://foolcontrol.org/?p=4781 57 | https://foolcontrol.org/?p=4781#respond 58 | 59 | 60 | Sun, 22 Sep 2024 16:00:59 +0000 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | https://foolcontrol.org/?p=4781 78 | 79 | 80 | 81 | https://foolcontrol.org/?feed=rss2&p=4781 82 | 0 83 | 84 | 85 | 4781 86 | 87 | App architecture with reliability in mind: From Kubernetes to Serverless with GCP Cloud Build & Cloud Run 88 | https://foolcontrol.org/?p=4621 89 | https://foolcontrol.org/?p=4621#comments 90 | 91 | 92 | Mon, 26 Feb 2024 20:00:23 +0000 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4621 114 | 115 | 116 | 117 | https://foolcontrol.org/?feed=rss2&p=4621 118 | 1 119 | 120 | 121 | 4621 122 | 123 | auto-cpufreq v2.0 124 | https://foolcontrol.org/?p=4603 125 | https://foolcontrol.org/?p=4603#comments 126 | 127 | 128 | Sat, 30 Sep 2023 13:45:01 +0000 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4603 147 | 148 | 149 | 150 | https://foolcontrol.org/?feed=rss2&p=4603 151 | 3 152 | 153 | 154 | 4603 155 | 156 | rpi-microk8s-bootstrap: Automate RPI device conversion into Kubernetes cluster nodes with Terraform 157 | https://foolcontrol.org/?p=4555 158 | https://foolcontrol.org/?p=4555#respond 159 | 160 | 161 | Mon, 22 May 2023 10:44:46 +0000 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4555 174 | 175 | 176 | 177 | https://foolcontrol.org/?feed=rss2&p=4555 178 | 0 179 | 180 | 181 | 4555 182 | 183 | “Kubernetes, Resistance is Futile” – KubeCon & KCD 2023 talk 184 | https://foolcontrol.org/?p=4508 185 | https://foolcontrol.org/?p=4508#respond 186 | 187 | 188 | Mon, 03 Apr 2023 14:16:15 +0000 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4508 205 | 206 | 207 | 208 | https://foolcontrol.org/?feed=rss2&p=4508 209 | 0 210 | 211 | 212 | 4508 213 | 214 | atuf.app: Amsterdam Toilet & Urinal Finder 215 | https://foolcontrol.org/?p=4393 216 | https://foolcontrol.org/?p=4393#respond 217 | 218 | 219 | Mon, 08 Aug 2022 09:48:21 +0000 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4393 236 | 237 | 238 | 239 | https://foolcontrol.org/?feed=rss2&p=4393 240 | 0 241 | 242 | 243 | 4393 244 | 245 | wp-k8s: WordPress on privately hosted Kubernetes cluster (Raspberry Pi 4 + Synology) 246 | https://foolcontrol.org/?p=4004 247 | https://foolcontrol.org/?p=4004#respond 248 | 249 | 250 | Fri, 12 Nov 2021 11:09:31 +0000 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | https://wp-cloud-run-4xx42k3twa-ez.a.run.app/?p=4004 274 | 275 | 276 | 277 | https://foolcontrol.org/?feed=rss2&p=4004 278 | 0 279 | 280 | 281 | 4004 282 | 283 | wp-k8s: WordPress on Kubernetes project (GKE, cloud SQL, NFS, cluster autoscaling, HPA, VPA, Ingress, Let’s Encrypt) 284 | https://foolcontrol.org/?p=3754 285 | https://foolcontrol.org/?p=3754#respond 286 | 287 | 288 | Sun, 17 Oct 2021 07:40:54 +0000 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | https://k8s.hodzic.org/?p=3754 309 | 310 | 311 | 312 | https://foolcontrol.org/?feed=rss2&p=3754 313 | 0 314 | 315 | 316 | 3754 317 | 318 | Degiro trading tracker – Simplified tracking of your investments 319 | https://foolcontrol.org/?p=3614 320 | https://foolcontrol.org/?p=3614#respond 321 | 322 | 323 | Mon, 16 Nov 2020 07:21:34 +0000 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | https://k8s.hodzic.org/?p=3614 339 | 340 | 341 | 342 | https://foolcontrol.org/?feed=rss2&p=3614 343 | 0 344 | 345 | 346 | 3614 347 | 348 | 349 | -------------------------------------------------------------------------------- /tests/integration/osm-pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "author": "Włodzimierz Bartczak", 5 | "content": [ 6 | { 7 | "base": null, 8 | "language": null, 9 | "type": "text/html", 10 | "value": "\n

Mam zaszczyt poinformować, że Stowarzyszenie OpenStreetMap Polska pozyskało finansowanie na cyfryzacji Kanonu Krajoznawczego Polski. Po wykonaniu zadania oddamy do rąk użytkowników zbiór informacji na temat najciekawszych obiektów krajoznawczych na terenie Polski.

Dane będą dostępne w formie bazy danych przestrzennych udostępnionych na licencji ODbL oraz oczywiście w OpenStreetMap jako atrybut dodany przez edytorów do obiektów należących do Kanonu. Jednocześnie baza zostanie przekazana wszelkim instytucją zajmującym się promowaniem turystyki tak, by wspierać ich działania.

Stowarzyszenie OpenStreetMap Polska prowadzi również rozmowy z twórcami aplikacji mapowych, by dane tych obiektów były obecne zaraz po premierze Cyfrowego Kanonu Krajoznawczego Polski w ich aplikacjach.

Wszystkich zainteresowanych wykorzystaniem tych danych zapraszam do kontaktu. Na bieżąco będą publikowane informacje dotyczące postępów prac nad baza danych.

#mapping #OSMP #OpenStreetMap #MapWithPassion #ckkp #opendata #poland

\n\n\n\n
\"\"
\n

Artykuł Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP! pochodzi z serwisu OpenStreetMap Polska.

\n" 11 | } 12 | ], 13 | "description": "

Mam zaszczyt poinformować, że Stowarzyszenie OpenStreetMap Polska pozyskało finansowanie na cyfryzacji Kanonu Krajoznawczego Polski. Po wykonaniu zadania oddamy do rąk użytkowników zbiór informacji na temat najciekawszych obiektów krajoznawczych na terenie Polski. Dane będą dostępne w formie bazy danych przestrzennych udostępnionych ... Read More »

\n

Artykuł Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP! pochodzi z serwisu OpenStreetMap Polska.

", 14 | "id": "https://openstreetmap.org.pl/?p=2645", 15 | "link": "https://openstreetmap.org.pl/2024/cyfrowy-kanon-krajoznawczy-polski-bedzie-opracowywany-przez-osmp/", 16 | "links": [], 17 | "published": "2024-08-11T09:08:25+00:00", 18 | "tags": [ 19 | { 20 | "label": null, 21 | "scheme": null, 22 | "term": "Bez kategorii" 23 | } 24 | ], 25 | "title": "Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP!" 26 | }, 27 | { 28 | "author": "jendrusk", 29 | "content": [ 30 | { 31 | "base": null, 32 | "language": null, 33 | "type": "text/html", 34 | "value": "\n
\"\"
\n\n\n\n

[Polska wersja poniżej]

\n\n\n\n

Are you an active OSM Contributor?
So we want to thank you!
If you would like to participate in the conference and in the last year you edited at least 42 days (according to https://hdyc.neis-one.org/ statistics), send us a message via osm.org (https://www.openstreetmap.org/user/jendrusk) and in response you will receive a promotional code thanks to which you can buy a ticket for PLN 249!
The number of promotional tickets is limited – grab yours today!

\n\n\n\n

Full conference schedule: https://stateofthemap.eu/program.html
Tickets: https://tobilet.pl/state-of-the-map-europe-2024.html

\n\n\n\n

[POL]

\n\n\n\n

Jesteś aktywnym edytorem projektu?

\n\n\n\n

Więc chcemy Ci podziękować!

\n\n\n\n

Jeśli chciałbyś uczestniczyć w konferencji, a w ostatnim roku edytowałeś przynajmniej 42 dni (wg. statystyk https://hdyc.neis-one.org/) wyślij do nas wiadomość przez stronę osm.org (https://www.openstreetmap.org/user/jendrusk) a w odpowiedzi otrzymasz kod promocyjny dzięki któremu kupisz bilet już za 249 złotych!

\n\n\n\n

Pula promocyjnych biletów ograniczona – już dzisiaj łap swój! 

\n\n\n\n

Pełny harmonogram konferencji: https://stateofthemap.eu/program.html

\n\n\n\n

Bilety: https://tobilet.pl/state-of-the-map-europe-2024.html

\n\n\n\n

#stateofthemap #europe #tickets

\n

Artykuł SotM EU 2024 – Community tickets -70% pochodzi z serwisu OpenStreetMap Polska.

\n" 35 | } 36 | ], 37 | "description": "

[Polska wersja poniżej] Are you an active OSM Contributor?So we want to thank you!If you would like to participate in the conference and in the last year you edited at least 42 days (according to https://hdyc.neis-one.org/ statistics), send us a ... Read More »

\n

Artykuł SotM EU 2024 – Community tickets -70% pochodzi z serwisu OpenStreetMap Polska.

", 38 | "id": "https://openstreetmap.org.pl/?p=2639", 39 | "link": "https://openstreetmap.org.pl/2024/sotm-eu-2024-community-tickets-70/", 40 | "links": [], 41 | "published": "2024-07-05T09:57:07+00:00", 42 | "tags": [ 43 | { 44 | "label": null, 45 | "scheme": null, 46 | "term": "Bez kategorii" 47 | } 48 | ], 49 | "title": "SotM EU 2024 – Community tickets -70%" 50 | }, 51 | { 52 | "author": "Włodzimierz Bartczak", 53 | "content": [ 54 | { 55 | "base": null, 56 | "language": null, 57 | "type": "text/html", 58 | "value": "\n

\n\n\n\n
\"\"
\n\n\n\n

Copernicus Data Space Ecosystem (CDSE) is an initiative of the European Space Agency and the European Commission that is revolutionizing the processing and distribution of Copernicus Earth Observation (EO) data. The project is being implemented by industrial consortium partners: T-Systems, CloudFerro, Sinergise, VITO, DLR, ACRI-ST, and RHEA. The Copernicus Data Space includes one of the largest public EO data repository in the world, providing immediate access to 78 PB of open and free EO data from the Copernicus Sentinel satellites, including both new and historical Sentinel images, as well as Copernicus Contributing Missions. The new service provides a wide range of novel functionalities for service providers, and creates a long-term impact on European science, economy, and society. As the CDSE consortium, we are happy to be a Silver Plus Partner of the State of the Map Europe edition.

\n

Artykuł Introducing another sponsor of SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

\n" 59 | } 60 | ], 61 | "description": "

Copernicus Data Space Ecosystem (CDSE) is an initiative of the European Space Agency and the European Commission that is revolutionizing the processing and distribution of Copernicus Earth Observation (EO) data. The project is being implemented by industrial consortium partners: T-Systems, ... Read More »

\n

Artykuł Introducing another sponsor of SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

", 62 | "id": "https://openstreetmap.org.pl/?p=2635", 63 | "link": "https://openstreetmap.org.pl/2024/introducing-another-sponsor-of-sotm-eu-2024/", 64 | "links": [], 65 | "published": "2024-06-25T08:46:02+00:00", 66 | "tags": [ 67 | { 68 | "label": null, 69 | "scheme": null, 70 | "term": "Bez kategorii" 71 | } 72 | ], 73 | "title": "Introducing another sponsor of SotM Eu 2024" 74 | }, 75 | { 76 | "author": "Tomek", 77 | "content": [ 78 | { 79 | "base": null, 80 | "language": null, 81 | "type": "text/html", 82 | "value": "\n

Już można kupić bilety na konferencję State of the Map Europe 2024 organizowaną przez nasze stowarzyszenie. Konferencja odbędzie się 18-21 lipca 2024 w Łodzi.

\n\n\n\n

Link do zakupu: https://tobilet.pl/state-of-the-map-europe-2024.html

\n\n\n\n

Link do programu: https://cfp.openstreetmap.org.pl/state-of-the-map-europe-2024/schedule/

\n\n\n\n

Strona konferencji: https://stateofthemap.eu/index.html

\n

Artykuł Ruszyła sprzedaż biletów na konferencję SotM EU 2024 pochodzi z serwisu OpenStreetMap Polska.

\n" 83 | } 84 | ], 85 | "description": "

Już można kupić bilety na konferencję State of the Map Europe 2024 organizowaną przez nasze stowarzyszenie. Konferencja odbędzie się 18-21 lipca 2024 w Łodzi. Link do zakupu: https://tobilet.pl/state-of-the-map-europe-2024.html Link do programu: https://cfp.openstreetmap.org.pl/state-of-the-map-europe-2024/schedule/ Strona konferencji: https://stateofthemap.eu/index.html

\n

Artykuł Ruszyła sprzedaż biletów na konferencję SotM EU 2024 pochodzi z serwisu OpenStreetMap Polska.

", 86 | "id": "https://openstreetmap.org.pl/?p=2628", 87 | "link": "https://openstreetmap.org.pl/2024/bilety-sotm-eu-2024/", 88 | "links": [], 89 | "published": "2024-06-13T21:02:02+00:00", 90 | "tags": [ 91 | { 92 | "label": null, 93 | "scheme": null, 94 | "term": "Bez kategorii" 95 | } 96 | ], 97 | "title": "Ruszyła sprzedaż biletów na konferencję SotM EU 2024" 98 | }, 99 | { 100 | "author": "Tomek", 101 | "content": [ 102 | { 103 | "base": null, 104 | "language": null, 105 | "type": "text/html", 106 | "value": "\n

Stowarzyszenie OpenStreetMap Polska ogłasza zapytanie ofertowe na przygotowanie schematu bazy danych oraz digitalizację danych o obiektach turystycznych należących do Kanonu Krajoznawczego Polski.

\n\n\n\n

Oferty należy przesłać na adres zamowienia@openstreetmap.pl do 17 czerwca 2024 r. do godz. 12.00. Oferta musi być podpisana podpisem zaufanym lub kwalifikowanym podpisem elektronicznym.

\n\n\n\n

Załączniki:

\n\n\n\n\n

Artykuł Zapytanie ofertowe pochodzi z serwisu OpenStreetMap Polska.

\n" 107 | } 108 | ], 109 | "description": "

Stowarzyszenie OpenStreetMap Polska ogłasza zapytanie ofertowe na przygotowanie schematu bazy danych oraz digitalizację danych o obiektach turystycznych należących do Kanonu Krajoznawczego Polski. Oferty należy przesłać na adres zamowienia@openstreetmap.pl do 17 czerwca 2024 r. do godz. 12.00. Oferta musi być podpisana ... Read More »

\n

Artykuł Zapytanie ofertowe pochodzi z serwisu OpenStreetMap Polska.

", 110 | "id": "https://openstreetmap.org.pl/?p=2626", 111 | "link": "https://openstreetmap.org.pl/2024/zapytanie-ofertowe-kanon-krajoznawczy/", 112 | "links": [], 113 | "published": "2024-06-09T17:58:08+00:00", 114 | "tags": [ 115 | { 116 | "label": null, 117 | "scheme": null, 118 | "term": "Bez kategorii" 119 | } 120 | ], 121 | "title": "Zapytanie ofertowe" 122 | }, 123 | { 124 | "author": "Dominik Danelski", 125 | "content": [ 126 | { 127 | "base": null, 128 | "language": null, 129 | "type": "text/html", 130 | "value": "\n

Czy majówka wspiera kreatywność? Oby tak, bo właśnie przedłużyliśmy termin zgłaszania tematów na State of the Map Europe do końca maja. To cały miesiąc na stworzenie i dopracowanie Waszych pomysłów na prezentacje lub spotkania :)

\n\n\n\n

Link do zgłoszeń

\n\n\n\n

Do zobaczenia!

\n

Artykuł Przedłużony czas na zgłoszenia tematów SotM Eu pochodzi z serwisu OpenStreetMap Polska.

\n" 131 | } 132 | ], 133 | "description": "

Czy majówka wspiera kreatywność? Oby tak, bo właśnie przedłużyliśmy termin zgłaszania tematów na State of the Map Europe do końca maja. To cały miesiąc na stworzenie i dopracowanie Waszych pomysłów na prezentacje lub spotkania :) Link do zgłoszeń Do zobaczenia!

\n

Artykuł Przedłużony czas na zgłoszenia tematów SotM Eu pochodzi z serwisu OpenStreetMap Polska.

", 134 | "id": "https://openstreetmap.org.pl/?p=2600", 135 | "link": "https://openstreetmap.org.pl/2024/przedluzony-czas-na-zgloszenia-tematow-sotm-eu/", 136 | "links": [], 137 | "published": "2024-05-01T08:57:36+00:00", 138 | "tags": [ 139 | { 140 | "label": null, 141 | "scheme": null, 142 | "term": "Bez kategorii" 143 | } 144 | ], 145 | "title": "Przedłużony czas na zgłoszenia tematów SotM Eu" 146 | }, 147 | { 148 | "author": "Dominik Danelski", 149 | "content": [ 150 | { 151 | "base": null, 152 | "language": null, 153 | "type": "text/html", 154 | "value": "\n

Z przyjemnością ogłaszamy, że pierwszym sponsorem naszej konferencji został TomTom.
Począwszy od 2023, TomTom wspiera fundację OpenStreetMap na platynowym – najwyższym z możliwych – poziomie. Tym razem na poziomie srebrnym TomTom wspomoże organizację naszej konferencji. Dziękujemy!

\n

Artykuł TomTom pierwszym sponsorem SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

\n" 155 | } 156 | ], 157 | "description": "

Z przyjemnością ogłaszamy, że pierwszym sponsorem naszej konferencji został TomTom.Począwszy od 2023, TomTom wspiera fundację OpenStreetMap na platynowym – najwyższym z możliwych – poziomie. Tym razem na poziomie srebrnym TomTom wspomoże organizację naszej konferencji. Dziękujemy!

\n

Artykuł TomTom pierwszym sponsorem SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

", 158 | "id": "https://openstreetmap.org.pl/?p=2593", 159 | "link": "https://openstreetmap.org.pl/2024/tomtom-pierwszym-sponsorem-sotm-eu-2024/", 160 | "links": [], 161 | "published": "2024-04-29T18:55:51+00:00", 162 | "tags": [ 163 | { 164 | "label": null, 165 | "scheme": null, 166 | "term": "Bez kategorii" 167 | }, 168 | { 169 | "label": null, 170 | "scheme": null, 171 | "term": "State of the Map Europe" 172 | } 173 | ], 174 | "title": "TomTom pierwszym sponsorem SotM Eu 2024" 175 | }, 176 | { 177 | "author": "Asia", 178 | "content": [ 179 | { 180 | "base": null, 181 | "language": null, 182 | "type": "text/html", 183 | "value": "" 184 | } 185 | ], 186 | "description": "

Dobra informacja dla mapowiczów korzystających z edytora Rapid i nie tylko! Zbiór danych ArcGIS dostępnych w edytorze Rapid został wzbogacony o dane dla Polski. W chwili obecnej, korzystając z tego narzędzia możemy w prosty sposób wyszukać i dodać warstwę danych ... Read More »

\n

Artykuł Dane adresowe i budynki dla Polski dostępne w Rapid! pochodzi z serwisu OpenStreetMap Polska.

", 187 | "id": "https://openstreetmap.org.pl/?p=2574", 188 | "link": "https://openstreetmap.org.pl/2024/dane-adresowe-i-budynki-dla-polski-dostepne-w-rapid/", 189 | "links": [], 190 | "published": "2024-01-16T22:21:53+00:00", 191 | "tags": [ 192 | { 193 | "label": null, 194 | "scheme": null, 195 | "term": "Bez kategorii" 196 | } 197 | ], 198 | "title": "Dane adresowe i budynki dla Polski dostępne w Rapid!" 199 | } 200 | ], 201 | "feed": { 202 | "generator": "https://wordpress.org/?v=6.0.1", 203 | "id": null, 204 | "language": null, 205 | "link": "https://openstreetmap.org.pl/", 206 | "links": [], 207 | "subtitle": "Portal polskiej społeczności OpenStreetMap", 208 | "subtitle_detail": { 209 | "base": null, 210 | "language": null, 211 | "type": "text/plain", 212 | "value": "Portal polskiej społeczności OpenStreetMap" 213 | }, 214 | "title": "OpenStreetMap Polska", 215 | "title_detail": { 216 | "base": null, 217 | "language": null, 218 | "type": "text/plain", 219 | "value": "OpenStreetMap Polska" 220 | }, 221 | "updated": "Sun, 11 Aug 2024 09:08:25 +0000" 222 | } 223 | } -------------------------------------------------------------------------------- /tests/integration/osm-pl.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | OpenStreetMap Polska 12 | 13 | https://openstreetmap.org.pl/ 14 | Portal polskiej społeczności OpenStreetMap 15 | Sun, 11 Aug 2024 09:08:25 +0000 16 | pl-PL 17 | 18 | hourly 19 | 20 | 1 21 | https://wordpress.org/?v=6.0.1 22 | 23 | 24 | https://openstreetmap.org.pl/app/uploads/2021/05/cropped-OpenStreetMap_Poland_logo_512px_opt-32x32.png 25 | OpenStreetMap Polska 26 | https://openstreetmap.org.pl/ 27 | 32 28 | 32 29 | 30 | 31 | Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP! 32 | https://openstreetmap.org.pl/2024/cyfrowy-kanon-krajoznawczy-polski-bedzie-opracowywany-przez-osmp/ 33 | 34 | 35 | Sun, 11 Aug 2024 09:08:25 +0000 36 | 37 | https://openstreetmap.org.pl/?p=2645 38 | 39 | Mam zaszczyt poinformować, że Stowarzyszenie OpenStreetMap Polska pozyskało finansowanie na cyfryzacji Kanonu Krajoznawczego Polski. Po wykonaniu zadania oddamy do rąk użytkowników zbiór informacji na temat najciekawszych obiektów krajoznawczych na terenie Polski. Dane będą dostępne w formie bazy danych przestrzennych udostępnionych ... Read More »

40 |

Artykuł Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP! pochodzi z serwisu OpenStreetMap Polska.

41 | ]]>
42 | Mam zaszczyt poinformować, że Stowarzyszenie OpenStreetMap Polska pozyskało finansowanie na cyfryzacji Kanonu Krajoznawczego Polski. Po wykonaniu zadania oddamy do rąk użytkowników zbiór informacji na temat najciekawszych obiektów krajoznawczych na terenie Polski.

Dane będą dostępne w formie bazy danych przestrzennych udostępnionych na licencji ODbL oraz oczywiście w OpenStreetMap jako atrybut dodany przez edytorów do obiektów należących do Kanonu. Jednocześnie baza zostanie przekazana wszelkim instytucją zajmującym się promowaniem turystyki tak, by wspierać ich działania.

Stowarzyszenie OpenStreetMap Polska prowadzi również rozmowy z twórcami aplikacji mapowych, by dane tych obiektów były obecne zaraz po premierze Cyfrowego Kanonu Krajoznawczego Polski w ich aplikacjach.

Wszystkich zainteresowanych wykorzystaniem tych danych zapraszam do kontaktu. Na bieżąco będą publikowane informacje dotyczące postępów prac nad baza danych.

#mapping #OSMP #OpenStreetMap #MapWithPassion #ckkp #opendata #poland

44 | 45 | 46 | 47 |
48 |

Artykuł Cyfrowy Kanon Krajoznawczy Polski będzie opracowywany przez OSMP! pochodzi z serwisu OpenStreetMap Polska.

49 | ]]>
50 | 51 | 52 | 53 |
54 | 55 | SotM EU 2024 – Community tickets -70% 56 | https://openstreetmap.org.pl/2024/sotm-eu-2024-community-tickets-70/ 57 | 58 | 59 | Fri, 05 Jul 2024 09:57:07 +0000 60 | 61 | https://openstreetmap.org.pl/?p=2639 62 | 63 | [Polska wersja poniżej] Are you an active OSM Contributor?So we want to thank you!If you would like to participate in the conference and in the last year you edited at least 42 days (according to https://hdyc.neis-one.org/ statistics), send us a ... Read More »

64 |

Artykuł SotM EU 2024 – Community tickets -70% pochodzi z serwisu OpenStreetMap Polska.

65 | ]]>
66 | 68 | 69 | 70 | 71 |

[Polska wersja poniżej]

72 | 73 | 74 | 75 |

Are you an active OSM Contributor?
So we want to thank you!
If you would like to participate in the conference and in the last year you edited at least 42 days (according to https://hdyc.neis-one.org/ statistics), send us a message via osm.org (https://www.openstreetmap.org/user/jendrusk) and in response you will receive a promotional code thanks to which you can buy a ticket for PLN 249!
The number of promotional tickets is limited – grab yours today!

76 | 77 | 78 | 79 |

Full conference schedule: https://stateofthemap.eu/program.html
Tickets: https://tobilet.pl/state-of-the-map-europe-2024.html

80 | 81 | 82 | 83 |

[POL]

84 | 85 | 86 | 87 |

Jesteś aktywnym edytorem projektu?

88 | 89 | 90 | 91 |

Więc chcemy Ci podziękować!

92 | 93 | 94 | 95 |

Jeśli chciałbyś uczestniczyć w konferencji, a w ostatnim roku edytowałeś przynajmniej 42 dni (wg. statystyk https://hdyc.neis-one.org/) wyślij do nas wiadomość przez stronę osm.org (https://www.openstreetmap.org/user/jendrusk) a w odpowiedzi otrzymasz kod promocyjny dzięki któremu kupisz bilet już za 249 złotych!

96 | 97 | 98 | 99 |

Pula promocyjnych biletów ograniczona – już dzisiaj łap swój! 

100 | 101 | 102 | 103 |

Pełny harmonogram konferencji: https://stateofthemap.eu/program.html

104 | 105 | 106 | 107 |

Bilety: https://tobilet.pl/state-of-the-map-europe-2024.html

108 | 109 | 110 | 111 |

#stateofthemap #europe #tickets

112 |

Artykuł SotM EU 2024 – Community tickets -70% pochodzi z serwisu OpenStreetMap Polska.

113 | ]]>
114 | 115 | 116 | 117 |
118 | 119 | Introducing another sponsor of SotM Eu 2024 120 | https://openstreetmap.org.pl/2024/introducing-another-sponsor-of-sotm-eu-2024/ 121 | 122 | 123 | Tue, 25 Jun 2024 08:46:02 +0000 124 | 125 | https://openstreetmap.org.pl/?p=2635 126 | 127 | Copernicus Data Space Ecosystem (CDSE) is an initiative of the European Space Agency and the European Commission that is revolutionizing the processing and distribution of Copernicus Earth Observation (EO) data. The project is being implemented by industrial consortium partners: T-Systems, ... Read More »

128 |

Artykuł Introducing another sponsor of SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

129 | ]]>
130 |

132 | 133 | 134 | 135 |
136 | 137 | 138 | 139 |

Copernicus Data Space Ecosystem (CDSE) is an initiative of the European Space Agency and the European Commission that is revolutionizing the processing and distribution of Copernicus Earth Observation (EO) data. The project is being implemented by industrial consortium partners: T-Systems, CloudFerro, Sinergise, VITO, DLR, ACRI-ST, and RHEA. The Copernicus Data Space includes one of the largest public EO data repository in the world, providing immediate access to 78 PB of open and free EO data from the Copernicus Sentinel satellites, including both new and historical Sentinel images, as well as Copernicus Contributing Missions. The new service provides a wide range of novel functionalities for service providers, and creates a long-term impact on European science, economy, and society. As the CDSE consortium, we are happy to be a Silver Plus Partner of the State of the Map Europe edition.

140 |

Artykuł Introducing another sponsor of SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

141 | ]]>
142 | 143 | 144 | 145 |
146 | 147 | Ruszyła sprzedaż biletów na konferencję SotM EU 2024 148 | https://openstreetmap.org.pl/2024/bilety-sotm-eu-2024/ 149 | 150 | 151 | Thu, 13 Jun 2024 21:02:02 +0000 152 | 153 | https://openstreetmap.org.pl/?p=2628 154 | 155 | Już można kupić bilety na konferencję State of the Map Europe 2024 organizowaną przez nasze stowarzyszenie. Konferencja odbędzie się 18-21 lipca 2024 w Łodzi. Link do zakupu: https://tobilet.pl/state-of-the-map-europe-2024.html Link do programu: https://cfp.openstreetmap.org.pl/state-of-the-map-europe-2024/schedule/ Strona konferencji: https://stateofthemap.eu/index.html

156 |

Artykuł Ruszyła sprzedaż biletów na konferencję SotM EU 2024 pochodzi z serwisu OpenStreetMap Polska.

157 | ]]>
158 | Już można kupić bilety na konferencję State of the Map Europe 2024 organizowaną przez nasze stowarzyszenie. Konferencja odbędzie się 18-21 lipca 2024 w Łodzi.

160 | 161 | 162 | 163 |

Link do zakupu: https://tobilet.pl/state-of-the-map-europe-2024.html

164 | 165 | 166 | 167 |

Link do programu: https://cfp.openstreetmap.org.pl/state-of-the-map-europe-2024/schedule/

168 | 169 | 170 | 171 |

Strona konferencji: https://stateofthemap.eu/index.html

172 |

Artykuł Ruszyła sprzedaż biletów na konferencję SotM EU 2024 pochodzi z serwisu OpenStreetMap Polska.

173 | ]]>
174 | 175 | 176 | 177 |
178 | 179 | Zapytanie ofertowe 180 | https://openstreetmap.org.pl/2024/zapytanie-ofertowe-kanon-krajoznawczy/ 181 | 182 | 183 | Sun, 09 Jun 2024 17:58:08 +0000 184 | 185 | https://openstreetmap.org.pl/?p=2626 186 | 187 | Stowarzyszenie OpenStreetMap Polska ogłasza zapytanie ofertowe na przygotowanie schematu bazy danych oraz digitalizację danych o obiektach turystycznych należących do Kanonu Krajoznawczego Polski. Oferty należy przesłać na adres zamowienia@openstreetmap.pl do 17 czerwca 2024 r. do godz. 12.00. Oferta musi być podpisana ... Read More »

188 |

Artykuł Zapytanie ofertowe pochodzi z serwisu OpenStreetMap Polska.

189 | ]]>
190 | Stowarzyszenie OpenStreetMap Polska ogłasza zapytanie ofertowe na przygotowanie schematu bazy danych oraz digitalizację danych o obiektach turystycznych należących do Kanonu Krajoznawczego Polski.

192 | 193 | 194 | 195 |

Oferty należy przesłać na adres zamowienia@openstreetmap.pl do 17 czerwca 2024 r. do godz. 12.00. Oferta musi być podpisana podpisem zaufanym lub kwalifikowanym podpisem elektronicznym.

196 | 197 | 198 | 199 |

Załączniki:

200 | 201 | 202 | 203 | 204 |

Artykuł Zapytanie ofertowe pochodzi z serwisu OpenStreetMap Polska.

205 | ]]>
206 | 207 | 208 | 209 |
210 | 211 | Przedłużony czas na zgłoszenia tematów SotM Eu 212 | https://openstreetmap.org.pl/2024/przedluzony-czas-na-zgloszenia-tematow-sotm-eu/ 213 | 214 | 215 | Wed, 01 May 2024 08:57:36 +0000 216 | 217 | https://openstreetmap.org.pl/?p=2600 218 | 219 | Czy majówka wspiera kreatywność? Oby tak, bo właśnie przedłużyliśmy termin zgłaszania tematów na State of the Map Europe do końca maja. To cały miesiąc na stworzenie i dopracowanie Waszych pomysłów na prezentacje lub spotkania :) Link do zgłoszeń Do zobaczenia!

220 |

Artykuł Przedłużony czas na zgłoszenia tematów SotM Eu pochodzi z serwisu OpenStreetMap Polska.

221 | ]]>
222 | Czy majówka wspiera kreatywność? Oby tak, bo właśnie przedłużyliśmy termin zgłaszania tematów na State of the Map Europe do końca maja. To cały miesiąc na stworzenie i dopracowanie Waszych pomysłów na prezentacje lub spotkania :)

224 | 225 | 226 | 227 |

Link do zgłoszeń

228 | 229 | 230 | 231 |

Do zobaczenia!

232 |

Artykuł Przedłużony czas na zgłoszenia tematów SotM Eu pochodzi z serwisu OpenStreetMap Polska.

233 | ]]>
234 | 235 | 236 | 237 |
238 | 239 | TomTom pierwszym sponsorem SotM Eu 2024 240 | https://openstreetmap.org.pl/2024/tomtom-pierwszym-sponsorem-sotm-eu-2024/ 241 | 242 | 243 | Mon, 29 Apr 2024 18:55:51 +0000 244 | 245 | 246 | https://openstreetmap.org.pl/?p=2593 247 | 248 | Z przyjemnością ogłaszamy, że pierwszym sponsorem naszej konferencji został TomTom.Począwszy od 2023, TomTom wspiera fundację OpenStreetMap na platynowym – najwyższym z możliwych – poziomie. Tym razem na poziomie srebrnym TomTom wspomoże organizację naszej konferencji. Dziękujemy!

249 |

Artykuł TomTom pierwszym sponsorem SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

250 | ]]>
251 | Z przyjemnością ogłaszamy, że pierwszym sponsorem naszej konferencji został TomTom.
Począwszy od 2023, TomTom wspiera fundację OpenStreetMap na platynowym – najwyższym z możliwych – poziomie. Tym razem na poziomie srebrnym TomTom wspomoże organizację naszej konferencji. Dziękujemy!

253 |

Artykuł TomTom pierwszym sponsorem SotM Eu 2024 pochodzi z serwisu OpenStreetMap Polska.

254 | ]]>
255 | 256 | 257 | 258 |
259 | 260 | Dane adresowe i budynki dla Polski dostępne w Rapid! 261 | https://openstreetmap.org.pl/2024/dane-adresowe-i-budynki-dla-polski-dostepne-w-rapid/ 262 | 263 | 264 | Tue, 16 Jan 2024 22:21:53 +0000 265 | 266 | https://openstreetmap.org.pl/?p=2574 267 | 268 | Dobra informacja dla mapowiczów korzystających z edytora Rapid i nie tylko! Zbiór danych ArcGIS dostępnych w edytorze Rapid został wzbogacony o dane dla Polski. W chwili obecnej, korzystając z tego narzędzia możemy w prosty sposób wyszukać i dodać warstwę danych ... Read More »

269 |

Artykuł Dane adresowe i budynki dla Polski dostępne w Rapid! pochodzi z serwisu OpenStreetMap Polska.

270 | ]]>
271 | 273 | 274 | 275 | 276 |

Dobra informacja dla mapowiczów korzystających z edytora Rapid i nie tylko! Zbiór danych ArcGIS dostępnych w edytorze Rapid został wzbogacony o dane dla Polski. W chwili obecnej, korzystając z tego narzędzia możemy w prosty sposób wyszukać i dodać warstwę danych adresowych (Poland Addresses) i budynki (Poland Buildings).

277 | 278 | 279 | 280 |
3 | 4 | 5 | PostGIS 6 | https://postgis.net/news/ 7 | Recent content on PostGIS 8 | Hugo -- gohugo.io 9 | Thu, 26 Sep 2024 00:00:00 +0000 10 | 11 | PostGIS 3.5.0 12 | https://postgis.net/2024/09/PostGIS-3.5.0/ 13 | Thu, 26 Sep 2024 00:00:00 +0000 14 | Regina Obe 15 | https://postgis.net/2024/09/PostGIS-3.5.0/ 16 | <p>The PostGIS Team is pleased to release PostGIS 3.5.0! 17 | Best Served with <a 18 | class="gdoc-markdown__link" 19 | href="https://www.postgresql.org/about/news/postgresql-17-rc1-released-2926/" 20 | >PostgreSQL 17 RC1</a> 21 | and <a 22 | class="gdoc-markdown__link" 23 | href="https://github.com/libgeos/geos/releases/tag/3.13.0" 24 | >GEOS 3.13.0</a>.</p> 25 | <p>This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+. 26 | To take advantage of all features, GEOS 3.12+ is needed. 27 | SFCGAL 1.4+ is needed to enable postgis_sfcgal support. 28 | To take advantage of all SFCGAL features, SFCGAL 1.5 is needed.</p> 29 | <div class="gdoc-page__anchorwrap"> 30 | <h3 id="350" 31 | > 32 | 3.5.0 33 | <a data-clipboard-text="https://postgis.net/2024/09/PostGIS-3.5.0/#350" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.5.0" aria-label="Anchor to: 3.5.0" href="#350"> 34 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 35 | </a> 36 | </h3> 37 | </div> 38 | <ul> 39 | <li> 40 | <p><a 41 | class="gdoc-markdown__link" 42 | href="https://download.osgeo.org/postgis/source/postgis-3.5.0.tar.gz" 43 | >source download</a> <a 44 | class="gdoc-markdown__link" 45 | href="https://postgis.net/stuff/postgis-3.5.0.tar.gz.md5" 46 | >md5</a></p> 47 | </li> 48 | <li> 49 | <p><a 50 | class="gdoc-markdown__link" 51 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.5.0/NEWS" 52 | >NEWS</a></p> 53 | </li> 54 | <li> 55 | <p>PDF docs: <a 56 | class="gdoc-markdown__link" 57 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0-en.pdf" 58 | >en</a> <a 59 | class="gdoc-markdown__link" 60 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0-ja.pdf" 61 | >ja</a>, <a 62 | class="gdoc-markdown__link" 63 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0-fr.pdf" 64 | >fr</a>, <a 65 | class="gdoc-markdown__link" 66 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0-zh_Hans.pdf" 67 | >zh_Hans</a></p> 68 | </li> 69 | <li> 70 | <p>HTML Online <a 71 | class="gdoc-markdown__link" 72 | href="https://postgis.net/docs/manual-3.5/en/" 73 | >en</a> <a 74 | class="gdoc-markdown__link" 75 | href="https://postgis.net/docs/manual-3.5/ja/" 76 | >ja</a> <a 77 | class="gdoc-markdown__link" 78 | href="https://postgis.net/docs/manual-3.5/fr/" 79 | >fr</a> <a 80 | class="gdoc-markdown__link" 81 | href="https://postgis.net/docs/manual-3.5/zh_Hans/" 82 | >zh_Hans</a></p> 83 | </li> 84 | <li> 85 | <p>Cheat Sheets:</p> 86 | <ul> 87 | <li>postgis: <a 88 | class="gdoc-markdown__link" 89 | href="https://postgis.net/docs/manual-3.5/postgis_cheatsheet-en.html" 90 | >en</a> <a 91 | class="gdoc-markdown__link" 92 | href="https://postgis.net/docs/manual-3.5/postgis_cheatsheet-ja.html" 93 | >ja</a> <a 94 | class="gdoc-markdown__link" 95 | href="https://postgis.net/docs/manual-3.5/postgis_cheatsheet-fr.html" 96 | >fr</a> <a 97 | class="gdoc-markdown__link" 98 | href="https://postgis.net/docs/manual-3.5/postgis_cheatsheet-zh_Hans.html" 99 | >zh_Hans</a></li> 100 | <li>postgis_raster: <a 101 | class="gdoc-markdown__link" 102 | href="https://postgis.net/docs/manual-3.5/raster_cheatsheet-en.html" 103 | >en</a> <a 104 | class="gdoc-markdown__link" 105 | href="https://postgis.net/docs/manual-3.5/raster_cheatsheet-ja.html" 106 | >ja</a> <a 107 | class="gdoc-markdown__link" 108 | href="https://postgis.net/docs/manual-3.5/raster_cheatsheet-fr.html" 109 | >fr</a> <a 110 | class="gdoc-markdown__link" 111 | href="https://postgis.net/docs/manual-3.5/raster_cheatsheet-zh_Hans.html" 112 | >zh_Hans</a></li> 113 | <li>postgis_topology: <a 114 | class="gdoc-markdown__link" 115 | href="https://postgis.net/docs/manual-3.5/topology_cheatsheet-en.html" 116 | >en</a> <a 117 | class="gdoc-markdown__link" 118 | href="https://postgis.net/docs/manual-3.5/topology_cheatsheet-ja.html" 119 | >ja</a> <a 120 | class="gdoc-markdown__link" 121 | href="https://postgis.net/docs/manual-3.5/topology_cheatsheet-fr.html" 122 | >fr</a> <a 123 | class="gdoc-markdown__link" 124 | href="https://postgis.net/docs/manual-3.5/topology_cheatsheet-zh_Hans.html" 125 | >zh_Hans</a></li> 126 | <li>postgis_sfcgal: <a 127 | class="gdoc-markdown__link" 128 | href="https://postgis.net/docs/manual-3.5/sfcgal_cheatsheet-en.html" 129 | >en</a> <a 130 | class="gdoc-markdown__link" 131 | href="https://postgis.net/docs/manual-3.5/sfcgal_cheatsheet-ja.html" 132 | >ja</a> <a 133 | class="gdoc-markdown__link" 134 | href="https://postgis.net/docs/manual-3.5/sfcgal_cheatsheet-fr.html" 135 | >fr</a> <a 136 | class="gdoc-markdown__link" 137 | href="https://postgis.net/docs/manual-3.5/sfcgal_cheatsheet-zh_Hans.html" 138 | >zh_Hans</a></li> 139 | <li>address standardizer, postgis_tiger_geocoder: <a 140 | class="gdoc-markdown__link" 141 | href="https://postgis.net/docs/manual-3.5/tiger_geocoder_cheatsheet-en.html" 142 | >en</a> <a 143 | class="gdoc-markdown__link" 144 | href="https://postgis.net/docs/manual-3.5/tiger_geocoder_cheatsheet-ja.html" 145 | >ja</a> <a 146 | class="gdoc-markdown__link" 147 | href="https://postgis.net/docs/manual-3.5/tiger_geocoder_cheatsheet-fr.html" 148 | >fr</a> <a 149 | class="gdoc-markdown__link" 150 | href="https://postgis.net/docs/manual-3.5/tiger_geocoder_cheatsheet-zh_Hans.html" 151 | >zh_Hans</a></li> 152 | </ul> 153 | </li> 154 | </ul> 155 | <p>This release is a feature release that includes bug fixes since PostGIS 3.4.3, new features, and a few breaking changes.</p> 156 | 157 | 158 | 159 | PostGIS 3.5.0beta1 160 | https://postgis.net/2024/09/PostGIS-3.5.0beta1/ 161 | Mon, 16 Sep 2024 00:00:00 +0000 162 | Regina Obe 163 | https://postgis.net/2024/09/PostGIS-3.5.0beta1/ 164 | <p>The PostGIS Team is pleased to release PostGIS 3.5.0beta1! 165 | Best Served with <a 166 | class="gdoc-markdown__link" 167 | href="https://www.postgresql.org/about/news/postgresql-17-rc1-released-2926/" 168 | >PostgreSQL 17 RC1</a> 169 | and <a 170 | class="gdoc-markdown__link" 171 | href="https://github.com/libgeos/geos/releases/tag/3.13.0" 172 | >GEOS 3.13.0</a>.</p> 173 | <p>This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+. 174 | To take advantage of all features, GEOS 3.12+ is needed. 175 | SFCGAL 1.4+ is needed to enable postgis_sfcgal support. 176 | To take advantage of all SFCGAL features, SFCGAL 1.5 is needed.</p> 177 | <div class="gdoc-page__anchorwrap"> 178 | <h3 id="350beta1" 179 | > 180 | 3.5.0beta1 181 | <a data-clipboard-text="https://postgis.net/2024/09/PostGIS-3.5.0beta1/#350beta1" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.5.0beta1" aria-label="Anchor to: 3.5.0beta1" href="#350beta1"> 182 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 183 | </a> 184 | </h3> 185 | </div> 186 | <ul> 187 | <li><a 188 | class="gdoc-markdown__link" 189 | href="https://download.osgeo.org/postgis/source/postgis-3.5.0beta1.tar.gz" 190 | >source download</a> <a 191 | class="gdoc-markdown__link" 192 | href="https://postgis.net/stuff/postgis-3.5.0beta1.tar.gz.md5" 193 | >md5</a></li> 194 | <li><a 195 | class="gdoc-markdown__link" 196 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.5.0beta1/NEWS" 197 | >NEWS</a></li> 198 | <li>PDF docs: <a 199 | class="gdoc-markdown__link" 200 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0beta1-en.pdf" 201 | >en</a> <a 202 | class="gdoc-markdown__link" 203 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0beta1-ja.pdf" 204 | >ja</a>, <a 205 | class="gdoc-markdown__link" 206 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0beta1-zh_Hans.pdf" 207 | >zh_Hans</a>, <a 208 | class="gdoc-markdown__link" 209 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0beta1-fr.pdf" 210 | >fr</a></li> 211 | </ul> 212 | <p>This release is a beta of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.</p> 213 | 214 | 215 | 216 | PostGIS 3.5.0rc1 217 | https://postgis.net/2024/09/PostGIS-3.5.0rc1/ 218 | Mon, 16 Sep 2024 00:00:00 +0000 219 | Regina Obe 220 | https://postgis.net/2024/09/PostGIS-3.5.0rc1/ 221 | <p>The PostGIS Team is pleased to release PostGIS 3.5.0rc1! 222 | Best Served with <a 223 | class="gdoc-markdown__link" 224 | href="https://www.postgresql.org/about/news/postgresql-17-rc1-released-2926/" 225 | >PostgreSQL 17 RC1</a> 226 | and <a 227 | class="gdoc-markdown__link" 228 | href="https://github.com/libgeos/geos/releases/tag/3.13.0" 229 | >GEOS 3.13.0</a>.</p> 230 | <p>This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+. 231 | To take advantage of all features, GEOS 3.12+ is needed. 232 | SFCGAL 1.4+ is needed to enable postgis_sfcgal support. 233 | To take advantage of all SFCGAL features, SFCGAL 1.5 is needed.</p> 234 | <div class="gdoc-page__anchorwrap"> 235 | <h3 id="350rc1" 236 | > 237 | 3.5.0rc1 238 | <a data-clipboard-text="https://postgis.net/2024/09/PostGIS-3.5.0rc1/#350rc1" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.5.0rc1" aria-label="Anchor to: 3.5.0rc1" href="#350rc1"> 239 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 240 | </a> 241 | </h3> 242 | </div> 243 | <ul> 244 | <li><a 245 | class="gdoc-markdown__link" 246 | href="https://download.osgeo.org/postgis/source/postgis-3.5.0rc1.tar.gz" 247 | >source download</a> <a 248 | class="gdoc-markdown__link" 249 | href="https://postgis.net/stuff/postgis-3.5.0rc1.tar.gz.md5" 250 | >md5</a></li> 251 | <li><a 252 | class="gdoc-markdown__link" 253 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.5.0rc1/NEWS" 254 | >NEWS</a></li> 255 | <li>PDF docs: <a 256 | class="gdoc-markdown__link" 257 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0rc1-en.pdf" 258 | >en</a> <a 259 | class="gdoc-markdown__link" 260 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0rc1-ja.pdf" 261 | >ja</a>, <a 262 | class="gdoc-markdown__link" 263 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0rc1-zh_Hans.pdf" 264 | >zh_Hans</a>, <a 265 | class="gdoc-markdown__link" 266 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0rc1-fr.pdf" 267 | >fr</a></li> 268 | </ul> 269 | <p>This release is a release candidate of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.</p> 270 | <p>Changes since 3.5.0beta1 are as follows:</p> 271 | <ul> 272 | <li><a 273 | class="gdoc-markdown__link" 274 | href="https://trac.osgeo.org/postgis/ticket/5779" 275 | >#5779</a> Failures building in parallel mode (Sandro Santilli)</li> 276 | <li><a 277 | class="gdoc-markdown__link" 278 | href="https://trac.osgeo.org/postgis/ticket/5778" 279 | >#5778</a>, Sections missing in What&rsquo;s new (Regina Obe)</li> 280 | </ul> 281 | 282 | 283 | 284 | PostGIS 3.3.7 285 | https://postgis.net/2024/09/PostGIS-3.3.7/ 286 | Thu, 05 Sep 2024 00:00:00 +0000 287 | Paul Ramsey 288 | https://postgis.net/2024/09/PostGIS-3.3.7/ 289 | <p>The PostGIS Team is pleased to release PostGIS 3.4.7! This is a bug fix release.</p> 290 | <div class="gdoc-page__anchorwrap"> 291 | <h3 id="337" 292 | > 293 | 3.3.7 294 | <a data-clipboard-text="https://postgis.net/2024/09/PostGIS-3.3.7/#337" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.3.7" aria-label="Anchor to: 3.3.7" href="#337"> 295 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 296 | </a> 297 | </h3> 298 | </div> 299 | <ul> 300 | <li><a 301 | class="gdoc-markdown__link" 302 | href="https://download.osgeo.org/postgis/source/postgis-3.3.7.tar.gz" 303 | >source download</a> <a 304 | class="gdoc-markdown__link" 305 | href="https://postgis.net/stuff/postgis-3.3.7.tar.gz.md5" 306 | >md5</a></li> 307 | <li><a 308 | class="gdoc-markdown__link" 309 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.3.7/NEWS" 310 | >NEWS</a></li> 311 | <li>PDF docs: <a 312 | class="gdoc-markdown__link" 313 | href="https://download.osgeo.org/postgis/docs/postgis-3.3.7-en.pdf" 314 | >en</a></li> 315 | </ul> 316 | 317 | 318 | 319 | PostGIS 3.4.3 320 | https://postgis.net/2024/09/PostGIS-3.4.3/ 321 | Wed, 04 Sep 2024 00:00:00 +0000 322 | Paul Ramsey 323 | https://postgis.net/2024/09/PostGIS-3.4.3/ 324 | <p>The PostGIS Team is pleased to release PostGIS 3.4.3!</p> 325 | <p>This version requires PostgreSQL 12-17, GEOS 3.8+, and Proj 6.1+. 326 | To take advantage of all features, GEOS 3.12+ is needed. 327 | To take advantage of all SFCGAL features, SFCGAL 1.5+ is needed.</p> 328 | <div class="gdoc-page__anchorwrap"> 329 | <h3 id="343" 330 | > 331 | 3.4.3 332 | <a data-clipboard-text="https://postgis.net/2024/09/PostGIS-3.4.3/#343" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.4.3" aria-label="Anchor to: 3.4.3" href="#343"> 333 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 334 | </a> 335 | </h3> 336 | </div> 337 | <ul> 338 | <li><a 339 | class="gdoc-markdown__link" 340 | href="https://download.osgeo.org/postgis/source/postgis-3.4.3.tar.gz" 341 | >source download</a> <a 342 | class="gdoc-markdown__link" 343 | href="https://postgis.net/stuff/postgis-3.4.3.tar.gz.md5" 344 | >md5</a></li> 345 | <li><a 346 | class="gdoc-markdown__link" 347 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.4.3/NEWS" 348 | >NEWS</a></li> 349 | <li>PDF docs: <a 350 | class="gdoc-markdown__link" 351 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.3-en.pdf" 352 | >en</a>, <a 353 | class="gdoc-markdown__link" 354 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.3-ja.pdf" 355 | >ja</a>, <a 356 | class="gdoc-markdown__link" 357 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.3-fr.pdf" 358 | >fr</a></li> 359 | </ul> 360 | 361 | 362 | 363 | PostGIS 3.5.0alpha2 364 | https://postgis.net/2024/07/PostGIS-3.5.0alpha2/ 365 | Sat, 06 Jul 2024 00:00:00 +0000 366 | Regina Obe 367 | https://postgis.net/2024/07/PostGIS-3.5.0alpha2/ 368 | <p>The PostGIS Team is pleased to release PostGIS 3.5.0alpha2! 369 | Best Served with <a 370 | class="gdoc-markdown__link" 371 | href="https://www.postgresql.org/about/news/postgresql-17-beta-2-released-2885/" 372 | >PostgreSQL 17 Beta2</a> 373 | and <a 374 | class="gdoc-markdown__link" 375 | href="https://github.com/libgeos/geos/releases/tag/3.12.2" 376 | >GEOS 3.12.2</a>.</p> 377 | <p>This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+. 378 | To take advantage of all features, GEOS 3.12+ is needed. 379 | SFCGAL 1.4-1.5 is needed to enable postgis_sfcgal support. 380 | To take advantage of all SFCGAL features, SFCGAL 1.5 is needed.</p> 381 | <div class="gdoc-page__anchorwrap"> 382 | <h3 id="350alpha2" 383 | > 384 | 3.5.0alpha2 385 | <a data-clipboard-text="https://postgis.net/2024/07/PostGIS-3.5.0alpha2/#350alpha2" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.5.0alpha2" aria-label="Anchor to: 3.5.0alpha2" href="#350alpha2"> 386 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 387 | </a> 388 | </h3> 389 | </div> 390 | <ul> 391 | <li><a 392 | class="gdoc-markdown__link" 393 | href="https://download.osgeo.org/postgis/source/postgis-3.5.0alpha2.tar.gz" 394 | >source download</a> <a 395 | class="gdoc-markdown__link" 396 | href="https://postgis.net/stuff/postgis-3.5.0alpha2.tar.gz.md5" 397 | >md5</a></li> 398 | <li><a 399 | class="gdoc-markdown__link" 400 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.5.0alpha2/NEWS" 401 | >NEWS</a></li> 402 | <li>PDF docs: <a 403 | class="gdoc-markdown__link" 404 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha2-en.pdf" 405 | >en</a> <a 406 | class="gdoc-markdown__link" 407 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha2-ja.pdf" 408 | >ja</a>, <a 409 | class="gdoc-markdown__link" 410 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha2-zh_Hans.pdf" 411 | >zh_Hans</a>, <a 412 | class="gdoc-markdown__link" 413 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha2-fr.pdf" 414 | >fr</a></li> 415 | </ul> 416 | <p>This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.</p> 417 | 418 | 419 | 420 | PostGIS 3.5.0alpha1 421 | https://postgis.net/2024/07/PostGIS-3.5.0alpha1/ 422 | Thu, 04 Jul 2024 00:00:00 +0000 423 | Regina Obe 424 | https://postgis.net/2024/07/PostGIS-3.5.0alpha1/ 425 | <p>The PostGIS Team is pleased to release PostGIS 3.5.0alpha1! 426 | Best Served with <a 427 | class="gdoc-markdown__link" 428 | href="https://www.postgresql.org/about/news/postgresql-17-beta-2-released-2885/" 429 | >PostgreSQL 17 Beta2</a> 430 | and <a 431 | class="gdoc-markdown__link" 432 | href="https://github.com/libgeos/geos/releases/tag/3.12.2" 433 | >GEOS 3.12.2</a>.</p> 434 | <p>This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+. 435 | To take advantage of all features, GEOS 3.12+ is needed. 436 | To take advantage of all SFCGAL features, SFCGAL 1.5.0+ is needed.</p> 437 | <div class="gdoc-page__anchorwrap"> 438 | <h3 id="350alpha1" 439 | > 440 | 3.5.0alpha1 441 | <a data-clipboard-text="https://postgis.net/2024/07/PostGIS-3.5.0alpha1/#350alpha1" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.5.0alpha1" aria-label="Anchor to: 3.5.0alpha1" href="#350alpha1"> 442 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 443 | </a> 444 | </h3> 445 | </div> 446 | <ul> 447 | <li><a 448 | class="gdoc-markdown__link" 449 | href="https://download.osgeo.org/postgis/source/postgis-3.5.0alpha1.tar.gz" 450 | >source download</a> <a 451 | class="gdoc-markdown__link" 452 | href="https://postgis.net/stuff/postgis-3.5.0alpha1.tar.gz.md5" 453 | >md5</a></li> 454 | <li><a 455 | class="gdoc-markdown__link" 456 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.5.0alpha1/NEWS" 457 | >NEWS</a></li> 458 | <li>PDF docs: <a 459 | class="gdoc-markdown__link" 460 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha1-en.pdf" 461 | >en</a> <a 462 | class="gdoc-markdown__link" 463 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha1-ja.pdf" 464 | >ja</a>, <a 465 | class="gdoc-markdown__link" 466 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha1-zh_Hans.pdf" 467 | >zh_Hans</a>, <a 468 | class="gdoc-markdown__link" 469 | href="https://download.osgeo.org/postgis/docs/postgis-3.5.0alpha1-fr.pdf" 470 | >fr</a></li> 471 | </ul> 472 | <p>This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.</p> 473 | 474 | 475 | 476 | PostGIS Patch Releases 477 | https://postgis.net/2024/02/PostGIS-Patch-Releases/ 478 | Thu, 08 Feb 2024 00:00:00 +0000 479 | Paul Ramsey 480 | https://postgis.net/2024/02/PostGIS-Patch-Releases/ 481 | The PostGIS development team is pleased to provide bug fix releases for 3.4.2, 3.3.6, 3.2.7, 3.1.11, 3.0.11, and 2.5.11. 482 | Please refer to the links above for more information about the issues resolved by these releases. 483 | 484 | 485 | 486 | PostGIS Patch Releases 487 | https://postgis.net/2023/11/PostGIS-Patch-Releases/ 488 | Mon, 20 Nov 2023 00:00:00 +0000 489 | Regina Obe 490 | https://postgis.net/2023/11/PostGIS-Patch-Releases/ 491 | <p>The PostGIS development team is pleased to provide 492 | bug fix and performance enhancements 493 | 3.4.1, 3.3.5, 3.2.6, 3.1.10, 3.0.10 for the 3.4, 3.3, 3.2, 3.1, 3.0 stable branches.</p> 494 | 495 | 496 | 497 | PostGIS 3.4.0 498 | https://postgis.net/2023/08/PostGIS-3.4.0/ 499 | Tue, 15 Aug 2023 00:00:00 +0000 500 | Regina Obe 501 | https://postgis.net/2023/08/PostGIS-3.4.0/ 502 | <p>The PostGIS Team is pleased to release PostGIS 3.4.0! 503 | This version works with versions PostgreSQL 12-16, GEOS 3.6 or higher, and Proj 6.1+. 504 | To take advantage of all features, <a 505 | class="gdoc-markdown__link" 506 | href="https://libgeos.org/posts/2023-06-27-geos-3-12-released/" 507 | >GEOS 3.12+</a> is needed. 508 | To take advantage of all SFCGAL features, 509 | <a 510 | class="gdoc-markdown__link" 511 | href="https://sfcgal.org" 512 | >SFCGAL</a> 1.4.1+ is needed.</p> 513 | <div class="gdoc-page__anchorwrap"> 514 | <h3 id="340" 515 | > 516 | 3.4.0 517 | <a data-clipboard-text="https://postgis.net/2023/08/PostGIS-3.4.0/#340" class="gdoc-page__anchor clip flex align-center" title="Anchor to: 3.4.0" aria-label="Anchor to: 3.4.0" href="#340"> 518 | <svg class="gdoc-icon gdoc_link"><use xlink:href="#gdoc_link"></use></svg> 519 | </a> 520 | </h3> 521 | </div> 522 | <ul> 523 | <li><a 524 | class="gdoc-markdown__link" 525 | href="https://download.osgeo.org/postgis/source/postgis-3.4.0.tar.gz" 526 | >source download</a> <a 527 | class="gdoc-markdown__link" 528 | href="https://postgis.net/stuff/postgis-3.4.0.tar.gz.md5" 529 | >md5</a></li> 530 | <li><a 531 | class="gdoc-markdown__link" 532 | href="https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.4.0/NEWS" 533 | >NEWS</a></li> 534 | <li>PDF docs: <a 535 | class="gdoc-markdown__link" 536 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.0-en.pdf" 537 | >en</a> <a 538 | class="gdoc-markdown__link" 539 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.0-ja.pdf" 540 | >ja</a> <a 541 | class="gdoc-markdown__link" 542 | href="https://download.osgeo.org/postgis/docs/postgis-3.4.0-fr.pdf" 543 | >fr</a></li> 544 | <li>HTML Online <a 545 | class="gdoc-markdown__link" 546 | href="https://postgis.net/docs/manual-3.4/en/" 547 | >en</a> <a 548 | class="gdoc-markdown__link" 549 | href="https://postgis.net/docs/manual-3.4/ja/" 550 | >ja</a> <a 551 | class="gdoc-markdown__link" 552 | href="https://postgis.net/docs/manual-3.4/fr/" 553 | >fr</a> <a 554 | class="gdoc-markdown__link" 555 | href="https://postgis.net/docs/manual-3.4/de/" 556 | >de</a> <a 557 | class="gdoc-markdown__link" 558 | href="https://postgis.net/docs/manual-3.4/ko_KR/" 559 | >ko_KR</a></li> 560 | <li>Cheat Sheets: 561 | <ul> 562 | <li>postgis: <a 563 | class="gdoc-markdown__link" 564 | href="https://postgis.net/docs/manual-3.4/postgis_cheatsheet-en.html" 565 | >en</a> <a 566 | class="gdoc-markdown__link" 567 | href="https://postgis.net/docs/manual-3.4/postgis_cheatsheet-ja.html" 568 | >ja</a> <a 569 | class="gdoc-markdown__link" 570 | href="https://postgis.net/docs/manual-3.4/postgis_cheatsheet-fr.html" 571 | >fr</a></li> 572 | <li>postgis_raster: <a 573 | class="gdoc-markdown__link" 574 | href="https://postgis.net/docs/manual-3.4/raster_cheatsheet-en.html" 575 | >en</a> <a 576 | class="gdoc-markdown__link" 577 | href="https://postgis.net/docs/manual-3.4/raster_cheatsheet-ja.html" 578 | >ja</a> <a 579 | class="gdoc-markdown__link" 580 | href="https://postgis.net/docs/manual-3.4/raster_cheatsheet-fr.html" 581 | >fr</a></li> 582 | <li>postgis_topology: <a 583 | class="gdoc-markdown__link" 584 | href="https://postgis.net/docs/manual-3.4/topology_cheatsheet-en.html" 585 | >en</a> <a 586 | class="gdoc-markdown__link" 587 | href="https://postgis.net/docs/manual-3.4/topology_cheatsheet-ja.html" 588 | >ja</a> <a 589 | class="gdoc-markdown__link" 590 | href="https://postgis.net/docs/manual-3.4/topology_cheatsheet-fr.html" 591 | >fr</a></li> 592 | <li>postgis_sfcgal: <a 593 | class="gdoc-markdown__link" 594 | href="https://postgis.net/docs/manual-3.4/sfcgal_cheatsheet-en.html" 595 | >en</a> <a 596 | class="gdoc-markdown__link" 597 | href="https://postgis.net/docs/manual-3.4/sfcgal_cheatsheet-ja.html" 598 | >ja</a> <a 599 | class="gdoc-markdown__link" 600 | href="https://postgis.net/docs/manual-3.4/sfcgal_cheatsheet-fr.html" 601 | >fr</a></li> 602 | <li>address standardizer, postgis_tiger_geocoder: <a 603 | class="gdoc-markdown__link" 604 | href="https://postgis.net/docs/manual-3.4/tiger_geocoder_cheatsheet-en.html" 605 | >en</a> <a 606 | class="gdoc-markdown__link" 607 | href="https://postgis.net/docs/manual-3.4/tiger_geocoder_cheatsheet-ja.html" 608 | >ja</a> <a 609 | class="gdoc-markdown__link" 610 | href="https://postgis.net/docs/manual-3.4/tiger_geocoder_cheatsheet-fr.html" 611 | >fr</a></li> 612 | </ul> 613 | </li> 614 | </ul> 615 | <p>This release is a major release, it includes bug fixes since PostGIS 3.3.4 and new features.</p> 616 | 617 | 618 | 619 | 620 | -------------------------------------------------------------------------------- /tests/integration/postgis.json: -------------------------------------------------------------------------------- 1 | { 2 | "entries": [ 3 | { 4 | "content": [ 5 | { 6 | "base": null, 7 | "language": null, 8 | "type": "text/html", 9 | "value": "

The PostGIS Team is pleased to release PostGIS 3.5.0!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0\n \n \n \n

\n
\n
    \n
  • \n

    source download md5

    \n
  • \n
  • \n

    NEWS

    \n
  • \n
  • \n

    PDF docs: en ja, fr, zh_Hans

    \n
  • \n
  • \n

    HTML Online en ja fr zh_Hans

    \n
  • \n
  • \n

    Cheat Sheets:

    \n
      \n
    • postgis: en ja fr zh_Hans
    • \n
    • postgis_raster: en ja fr zh_Hans
    • \n
    • postgis_topology: en ja fr zh_Hans
    • \n
    • postgis_sfcgal: en ja fr zh_Hans
    • \n
    • address standardizer, postgis_tiger_geocoder: en ja fr zh_Hans
    • \n
    \n
  • \n
\n

This release is a feature release that includes bug fixes since PostGIS 3.4.3, new features, and a few breaking changes.

" 10 | } 11 | ], 12 | "description": "

The PostGIS Team is pleased to release PostGIS 3.5.0!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0\n \n \n \n

\n
\n
    \n
  • \n

    source download md5

    \n
  • \n
  • \n

    NEWS

    \n
  • \n
  • \n

    PDF docs: en ja, fr, zh_Hans

    \n
  • \n
  • \n

    HTML Online en ja fr zh_Hans

    \n
  • \n
  • \n

    Cheat Sheets:

    \n
      \n
    • postgis: en ja fr zh_Hans
    • \n
    • postgis_raster: en ja fr zh_Hans
    • \n
    • postgis_topology: en ja fr zh_Hans
    • \n
    • postgis_sfcgal: en ja fr zh_Hans
    • \n
    • address standardizer, postgis_tiger_geocoder: en ja fr zh_Hans
    • \n
    \n
  • \n
\n

This release is a feature release that includes bug fixes since PostGIS 3.4.3, new features, and a few breaking changes.

", 13 | "id": "https://postgis.net/2024/09/PostGIS-3.5.0/", 14 | "link": "https://postgis.net/2024/09/PostGIS-3.5.0/", 15 | "links": [], 16 | "published": "2024-09-26T00:00:00+00:00", 17 | "title": "PostGIS 3.5.0" 18 | }, 19 | { 20 | "content": [ 21 | { 22 | "base": null, 23 | "language": null, 24 | "type": "text/html", 25 | "value": "

The PostGIS Team is pleased to release PostGIS 3.5.0beta1!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0beta1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is a beta of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.

" 26 | } 27 | ], 28 | "description": "

The PostGIS Team is pleased to release PostGIS 3.5.0beta1!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0beta1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is a beta of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.

", 29 | "id": "https://postgis.net/2024/09/PostGIS-3.5.0beta1/", 30 | "link": "https://postgis.net/2024/09/PostGIS-3.5.0beta1/", 31 | "links": [], 32 | "published": "2024-09-16T00:00:00+00:00", 33 | "title": "PostGIS 3.5.0beta1" 34 | }, 35 | { 36 | "content": [ 37 | { 38 | "base": null, 39 | "language": null, 40 | "type": "text/html", 41 | "value": "

The PostGIS Team is pleased to release PostGIS 3.5.0rc1!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0rc1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is a release candidate of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.

\n

Changes since 3.5.0beta1 are as follows:

\n
    \n
  • #5779 Failures building in parallel mode (Sandro Santilli)
  • \n
  • #5778, Sections missing in What’s new (Regina Obe)
  • \n
" 42 | } 43 | ], 44 | "description": "

The PostGIS Team is pleased to release PostGIS 3.5.0rc1!\nBest Served with PostgreSQL 17 RC1\nand GEOS 3.13.0.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4+ is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0rc1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is a release candidate of a major release, it includes bug fixes since PostGIS 3.4.3 and new features.

\n

Changes since 3.5.0beta1 are as follows:

\n
    \n
  • #5779 Failures building in parallel mode (Sandro Santilli)
  • \n
  • #5778, Sections missing in What’s new (Regina Obe)
  • \n
", 45 | "id": "https://postgis.net/2024/09/PostGIS-3.5.0rc1/", 46 | "link": "https://postgis.net/2024/09/PostGIS-3.5.0rc1/", 47 | "links": [], 48 | "published": "2024-09-16T00:00:00+00:00", 49 | "title": "PostGIS 3.5.0rc1" 50 | }, 51 | { 52 | "content": [ 53 | { 54 | "base": null, 55 | "language": null, 56 | "type": "text/html", 57 | "value": "

The PostGIS Team is pleased to release PostGIS 3.4.7! This is a bug fix release.

\n
\n

\n 3.3.7\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en
  • \n
" 58 | } 59 | ], 60 | "description": "

The PostGIS Team is pleased to release PostGIS 3.4.7! This is a bug fix release.

\n
\n

\n 3.3.7\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en
  • \n
", 61 | "id": "https://postgis.net/2024/09/PostGIS-3.3.7/", 62 | "link": "https://postgis.net/2024/09/PostGIS-3.3.7/", 63 | "links": [], 64 | "published": "2024-09-05T00:00:00+00:00", 65 | "title": "PostGIS 3.3.7" 66 | }, 67 | { 68 | "content": [ 69 | { 70 | "base": null, 71 | "language": null, 72 | "type": "text/html", 73 | "value": "

The PostGIS Team is pleased to release PostGIS 3.4.3!

\n

This version requires PostgreSQL 12-17, GEOS 3.8+, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features, SFCGAL 1.5+ is needed.

\n
\n

\n 3.4.3\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en, ja, fr
  • \n
" 74 | } 75 | ], 76 | "description": "

The PostGIS Team is pleased to release PostGIS 3.4.3!

\n

This version requires PostgreSQL 12-17, GEOS 3.8+, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features, SFCGAL 1.5+ is needed.

\n
\n

\n 3.4.3\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en, ja, fr
  • \n
", 77 | "id": "https://postgis.net/2024/09/PostGIS-3.4.3/", 78 | "link": "https://postgis.net/2024/09/PostGIS-3.4.3/", 79 | "links": [], 80 | "published": "2024-09-04T00:00:00+00:00", 81 | "title": "PostGIS 3.4.3" 82 | }, 83 | { 84 | "content": [ 85 | { 86 | "base": null, 87 | "language": null, 88 | "type": "text/html", 89 | "value": "

The PostGIS Team is pleased to release PostGIS 3.5.0alpha2!\nBest Served with PostgreSQL 17 Beta2\nand GEOS 3.12.2.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4-1.5 is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0alpha2\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.

" 90 | } 91 | ], 92 | "description": "

The PostGIS Team is pleased to release PostGIS 3.5.0alpha2!\nBest Served with PostgreSQL 17 Beta2\nand GEOS 3.12.2.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nSFCGAL 1.4-1.5 is needed to enable postgis_sfcgal support.\nTo take advantage of all SFCGAL features, SFCGAL 1.5 is needed.

\n
\n

\n 3.5.0alpha2\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.

", 93 | "id": "https://postgis.net/2024/07/PostGIS-3.5.0alpha2/", 94 | "link": "https://postgis.net/2024/07/PostGIS-3.5.0alpha2/", 95 | "links": [], 96 | "published": "2024-07-06T00:00:00+00:00", 97 | "title": "PostGIS 3.5.0alpha2" 98 | }, 99 | { 100 | "content": [ 101 | { 102 | "base": null, 103 | "language": null, 104 | "type": "text/html", 105 | "value": "

The PostGIS Team is pleased to release PostGIS 3.5.0alpha1!\nBest Served with PostgreSQL 17 Beta2\nand GEOS 3.12.2.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features, SFCGAL 1.5.0+ is needed.

\n
\n

\n 3.5.0alpha1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.

" 106 | } 107 | ], 108 | "description": "

The PostGIS Team is pleased to release PostGIS 3.5.0alpha1!\nBest Served with PostgreSQL 17 Beta2\nand GEOS 3.12.2.

\n

This version requires PostgreSQL 12 - 17, GEOS 3.8 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features, SFCGAL 1.5.0+ is needed.

\n
\n

\n 3.5.0alpha1\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja, zh_Hans, fr
  • \n
\n

This release is an alpha of a major release, it includes bug fixes since PostGIS 3.4.2 and new features.

", 109 | "id": "https://postgis.net/2024/07/PostGIS-3.5.0alpha1/", 110 | "link": "https://postgis.net/2024/07/PostGIS-3.5.0alpha1/", 111 | "links": [], 112 | "published": "2024-07-04T00:00:00+00:00", 113 | "title": "PostGIS 3.5.0alpha1" 114 | }, 115 | { 116 | "content": [ 117 | { 118 | "base": null, 119 | "language": null, 120 | "type": "text/html", 121 | "value": "The PostGIS development team is pleased to provide bug fix releases for 3.4.2, 3.3.6, 3.2.7, 3.1.11, 3.0.11, and 2.5.11.\nPlease refer to the links above for more information about the issues resolved by these releases." 122 | } 123 | ], 124 | "description": "The PostGIS development team is pleased to provide bug fix releases for 3.4.2, 3.3.6, 3.2.7, 3.1.11, 3.0.11, and 2.5.11.\nPlease refer to the links above for more information about the issues resolved by these releases.", 125 | "id": "https://postgis.net/2024/02/PostGIS-Patch-Releases/", 126 | "link": "https://postgis.net/2024/02/PostGIS-Patch-Releases/", 127 | "links": [], 128 | "published": "2024-02-08T00:00:00+00:00", 129 | "title": "PostGIS Patch Releases" 130 | }, 131 | { 132 | "content": [ 133 | { 134 | "base": null, 135 | "language": null, 136 | "type": "text/html", 137 | "value": "

The PostGIS development team is pleased to provide\nbug fix and performance enhancements\n3.4.1, 3.3.5, 3.2.6, 3.1.10, 3.0.10 for the 3.4, 3.3, 3.2, 3.1, 3.0 stable branches.

" 138 | } 139 | ], 140 | "description": "

The PostGIS development team is pleased to provide\nbug fix and performance enhancements\n3.4.1, 3.3.5, 3.2.6, 3.1.10, 3.0.10 for the 3.4, 3.3, 3.2, 3.1, 3.0 stable branches.

", 141 | "id": "https://postgis.net/2023/11/PostGIS-Patch-Releases/", 142 | "link": "https://postgis.net/2023/11/PostGIS-Patch-Releases/", 143 | "links": [], 144 | "published": "2023-11-20T00:00:00+00:00", 145 | "title": "PostGIS Patch Releases" 146 | }, 147 | { 148 | "content": [ 149 | { 150 | "base": null, 151 | "language": null, 152 | "type": "text/html", 153 | "value": "

The PostGIS Team is pleased to release PostGIS 3.4.0!\nThis version works with versions PostgreSQL 12-16, GEOS 3.6 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features,\nSFCGAL 1.4.1+ is needed.

\n
\n

\n 3.4.0\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja fr
  • \n
  • HTML Online en ja fr de ko_KR
  • \n
  • Cheat Sheets:\n
      \n
    • postgis: en ja fr
    • \n
    • postgis_raster: en ja fr
    • \n
    • postgis_topology: en ja fr
    • \n
    • postgis_sfcgal: en ja fr
    • \n
    • address standardizer, postgis_tiger_geocoder: en ja fr
    • \n
    \n
  • \n
\n

This release is a major release, it includes bug fixes since PostGIS 3.3.4 and new features.

" 154 | } 155 | ], 156 | "description": "

The PostGIS Team is pleased to release PostGIS 3.4.0!\nThis version works with versions PostgreSQL 12-16, GEOS 3.6 or higher, and Proj 6.1+.\nTo take advantage of all features, GEOS 3.12+ is needed.\nTo take advantage of all SFCGAL features,\nSFCGAL 1.4.1+ is needed.

\n
\n

\n 3.4.0\n \n \n \n

\n
\n
    \n
  • source download md5
  • \n
  • NEWS
  • \n
  • PDF docs: en ja fr
  • \n
  • HTML Online en ja fr de ko_KR
  • \n
  • Cheat Sheets:\n
      \n
    • postgis: en ja fr
    • \n
    • postgis_raster: en ja fr
    • \n
    • postgis_topology: en ja fr
    • \n
    • postgis_sfcgal: en ja fr
    • \n
    • address standardizer, postgis_tiger_geocoder: en ja fr
    • \n
    \n
  • \n
\n

This release is a major release, it includes bug fixes since PostGIS 3.3.4 and new features.

", 157 | "id": "https://postgis.net/2023/08/PostGIS-3.4.0/", 158 | "link": "https://postgis.net/2023/08/PostGIS-3.4.0/", 159 | "links": [], 160 | "published": "2023-08-15T00:00:00+00:00", 161 | "title": "PostGIS 3.4.0" 162 | } 163 | ], 164 | "feed": { 165 | "generator": "Hugo -- gohugo.io", 166 | "id": null, 167 | "language": null, 168 | "link": "https://postgis.net/news/", 169 | "links": [], 170 | "subtitle": "Recent content on PostGIS", 171 | "subtitle_detail": { 172 | "base": null, 173 | "language": null, 174 | "type": "text/plain", 175 | "value": "Recent content on PostGIS" 176 | }, 177 | "title": "PostGIS", 178 | "title_detail": { 179 | "base": null, 180 | "language": null, 181 | "type": "text/plain", 182 | "value": "PostGIS" 183 | }, 184 | "updated": "Thu, 26 Sep 2024 00:00:00 +0000" 185 | } 186 | } --------------------------------------------------------------------------------