teemup


Nameteemup JSON
Version 1.2.1 PyPI version JSON
download
home_pageNone
SummaryIf Meetup didn't become a walled garden, the world wouldn't need Teemup
upload_time2024-10-25 20:19:07
maintainerNone
docs_urlNone
authorHonza Javorek
requires_python<4.0,>=3.11
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # teemup

_If Meetup didn't become a walled garden, the world wouldn't need Teemup_

## Purpose and scope

This library takes HTML source of a meetup group page on Meetup and returns a list of their upcoming events.

## Usage

```python
>>> import urllib.request
>>> from teemup import parse
>>> with urllib.request.urlopen('https://www.meetup.com/dresdenjs-io-javascript-user-group/') as f:
...     html = f.read()
...
>>> events = parse(html)
>>> event = next(event for event in events if event['venue'] is not None)
>>> sorted(event.keys())
['description', 'ends_at', 'group_name', 'starts_at', 'title', 'url', 'venue']
>>> sorted(event['venue'])
['address', 'city', 'country', 'name', 'state']

```

The example above is [tested](https://docs.pytest.org/doctest.html) and thus doesn't contain any variable data, but should be enough to give you an idea.

## If something breaks

If the website changes, update the fixture:

```
curl https://www.meetup.com/reactgirls/ > test_fixtures/response_content.html
```

Then run `poetry run pytest`.
Change `teemup.py` and add unit tests to `test_teemup.py` as needed.
Then cut a new release:

-   Make sure the tests really pass: `poetry run pytest`
-   Format the code: `poetry run black .`
-   Raise the version number in `pyproject.toml`
-   Commit the changes: `git commit -am "release vX.Y.Z"`
-   Create a version tag: `git tag vX.Y.Z`
-   Push the tag: `git push --follow-tags`

**Note:** If there are no upcoming events, choose a different group page for testing.
Do not remove live testing from the repository!
The whole purpose of the library is to be up-to-date with the current website.
It must be monitored every day and fixed as soon as it breaks.

## Why

Meetup used to be a nice and friendly platform where to host your events.
It used to have an iCalendar export, RSS export, Atom export.

Such exports are useful if one wants to follow certain meetup in their own calendar software, or if one wants to read the event feed by a program and automatically link to upcoming events from a website – effectively sending more people to the events and more potential users to Meetup.

In March 2023 they've put these exports behind login, basically rendering them useless.
You can download the files manually, but automatic fetching for future events is impossible.
They do have an API (with horrendous auth flow), but that API is reserved to paying users only.

After a long conversation with their support (June 2023), they confirmed the login is intentional, but they couldn't explain why they did such product decision and how it benefits their users.
From that point on, I consider Meetup to be a hostile walled garden, which contributes to harming the free and open internet.

All my integrations broke down, and [not only mine](https://wordpress.org/support/topic/trouble-with-meetup-calendars-please-read/).

I figured out they left [JSON-DL](https://schema.org/) meta data on the page.
Such meta data is good for search engines and other tooling and can be read by [extruct](https://github.com/scrapinghub/extruct/).
This allowed me to fix everything for a while, but in August 2023, the JSON-DL has also disappeared from the website.

All out war then!
I moved the code to this separate library so it's easier to develop, re-use, contribute to, and monitor.

## License

[MIT](LICENSE)


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "teemup",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.11",
    "maintainer_email": null,
    "keywords": null,
    "author": "Honza Javorek",
    "author_email": "mail@honzajavorek.cz",
    "download_url": "https://files.pythonhosted.org/packages/2a/8e/98e49b47704db82d185fadf18d13a37ec7ad2523bfaf608dba4f6b4c62e3/teemup-1.2.1.tar.gz",
    "platform": null,
    "description": "# teemup\n\n_If Meetup didn't become a walled garden, the world wouldn't need Teemup_\n\n## Purpose and scope\n\nThis library takes HTML source of a meetup group page on Meetup and returns a list of their upcoming events.\n\n## Usage\n\n```python\n>>> import urllib.request\n>>> from teemup import parse\n>>> with urllib.request.urlopen('https://www.meetup.com/dresdenjs-io-javascript-user-group/') as f:\n...     html = f.read()\n...\n>>> events = parse(html)\n>>> event = next(event for event in events if event['venue'] is not None)\n>>> sorted(event.keys())\n['description', 'ends_at', 'group_name', 'starts_at', 'title', 'url', 'venue']\n>>> sorted(event['venue'])\n['address', 'city', 'country', 'name', 'state']\n\n```\n\nThe example above is [tested](https://docs.pytest.org/doctest.html) and thus doesn't contain any variable data, but should be enough to give you an idea.\n\n## If something breaks\n\nIf the website changes, update the fixture:\n\n```\ncurl https://www.meetup.com/reactgirls/ > test_fixtures/response_content.html\n```\n\nThen run `poetry run pytest`.\nChange `teemup.py` and add unit tests to `test_teemup.py` as needed.\nThen cut a new release:\n\n-   Make sure the tests really pass: `poetry run pytest`\n-   Format the code: `poetry run black .`\n-   Raise the version number in `pyproject.toml`\n-   Commit the changes: `git commit -am \"release vX.Y.Z\"`\n-   Create a version tag: `git tag vX.Y.Z`\n-   Push the tag: `git push --follow-tags`\n\n**Note:** If there are no upcoming events, choose a different group page for testing.\nDo not remove live testing from the repository!\nThe whole purpose of the library is to be up-to-date with the current website.\nIt must be monitored every day and fixed as soon as it breaks.\n\n## Why\n\nMeetup used to be a nice and friendly platform where to host your events.\nIt used to have an iCalendar export, RSS export, Atom export.\n\nSuch exports are useful if one wants to follow certain meetup in their own calendar software, or if one wants to read the event feed by a program and automatically link to upcoming events from a website \u2013 effectively sending more people to the events and more potential users to Meetup.\n\nIn March 2023 they've put these exports behind login, basically rendering them useless.\nYou can download the files manually, but automatic fetching for future events is impossible.\nThey do have an API (with horrendous auth flow), but that API is reserved to paying users only.\n\nAfter a long conversation with their support (June 2023), they confirmed the login is intentional, but they couldn't explain why they did such product decision and how it benefits their users.\nFrom that point on, I consider Meetup to be a hostile walled garden, which contributes to harming the free and open internet.\n\nAll my integrations broke down, and [not only mine](https://wordpress.org/support/topic/trouble-with-meetup-calendars-please-read/).\n\nI figured out they left [JSON-DL](https://schema.org/) meta data on the page.\nSuch meta data is good for search engines and other tooling and can be read by [extruct](https://github.com/scrapinghub/extruct/).\nThis allowed me to fix everything for a while, but in August 2023, the JSON-DL has also disappeared from the website.\n\nAll out war then!\nI moved the code to this separate library so it's easier to develop, re-use, contribute to, and monitor.\n\n## License\n\n[MIT](LICENSE)\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "If Meetup didn't become a walled garden, the world wouldn't need Teemup",
    "version": "1.2.1",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6bebdcbbf28e56f9178334cd630fe54f12e7932b139caf37801f3987fafd45df",
                "md5": "2d806fa51d174f4dd982c5fa0bdd6d5e",
                "sha256": "4b5bc2e8921a12435c8a2a96953fefa840a33a40661c1efc68252727f188af41"
            },
            "downloads": -1,
            "filename": "teemup-1.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "2d806fa51d174f4dd982c5fa0bdd6d5e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.11",
            "size": 4312,
            "upload_time": "2024-10-25T20:19:06",
            "upload_time_iso_8601": "2024-10-25T20:19:06.487271Z",
            "url": "https://files.pythonhosted.org/packages/6b/eb/dcbbf28e56f9178334cd630fe54f12e7932b139caf37801f3987fafd45df/teemup-1.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2a8e98e49b47704db82d185fadf18d13a37ec7ad2523bfaf608dba4f6b4c62e3",
                "md5": "20878c07f5bfd408477e75398d2cb888",
                "sha256": "1e6164738d16d21d92a43faded7c10b72fb64a26bc6b6f19197c5d7e9832412c"
            },
            "downloads": -1,
            "filename": "teemup-1.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "20878c07f5bfd408477e75398d2cb888",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.11",
            "size": 3912,
            "upload_time": "2024-10-25T20:19:07",
            "upload_time_iso_8601": "2024-10-25T20:19:07.338273Z",
            "url": "https://files.pythonhosted.org/packages/2a/8e/98e49b47704db82d185fadf18d13a37ec7ad2523bfaf608dba4f6b4c62e3/teemup-1.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-25 20:19:07",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "teemup"
}
        
Elapsed time: 0.41667s