A simple object model for the Notion SDK.

Overview

notional

A simplified object model for the Notion SDK. This is loosely modeled after concepts found in SQLAlchemy.

⚠️ Work In Progress: The interfaces in this module are still in development and are likely to change frequently. Furthermore, documentation is pretty sparse so use at your own risk!

That being said, if you do use this library, please drop a message! I'd love to see your use case and how you are incorporating this into your project.

Installation

Install using PyPi:

pip install notional

Note: it is recommended to use a virtual environment (venv) for installing libraries to prevent conflicting dependency versions.

Usage

Connect to the API using an integration token or an OAuth access token:

import notional

notion = notional.connect(auth=AUTH_TOKEN)

# do some things

Iterators

The iterators provide convenient access to the Notion endpoints. Rather than looking for each page of data, the iterators take care of this and expose a standard Python iterator:

import notional

from notional.iterator import EndpointIterator

notion = notional.connect(auth=AUTH_TOKEN)

tasks = EndpointIterator(
    endpoint=notion.databases.query,
    database_id=task_db_id,
    sorts=[
        {
            'direction': 'ascending',
            'property': 'Last Update'
        }
    ]
)

for data in tasks:
    # do the things

Note that the parameters to the iterator follow the standard API parameters for the given endpoint.

Query Builder

Notional provides a query builder for interating with the Notion API. Query targets can be either a specific database ID or a custom ORM type (with a __database__ property).

notion = notional.connect(auth=auth_token)
sorts = [{"direction": "ascending", "property": "Last Update"}]
query = notion.query(dbid).sort(sorts)

for data in query.execute():
    # something magic happens

For more information about querying, read the official documentation.

ORM

This library has support for defining custom data types that wrap Notion pages. Typically, these pages are entries in a database (collection) with a consistent schema.

{task.Priority}") task.DueDate = date.today() task.commit() ">
from notional import types
from notional.records import Page, Property

class Task(Page):
    __database__ = NOTION_DATABASE_ID
    Title = Property('Title', types.Title)
    Priority = Property('Priority', types.SelectOne)
    DueDate = Property('Due Date', types.Date)

for task in notion.query(Task).execute():
    print(f"{task.Title} => {task.Priority}")
    task.DueDate = date.today()
    task.commit()

See the examples for more information.

Token Security

It is generally a best practice to read the auth token from an environment variable or a secrets file. To prevent accidental exposure, it is NOT recommended to save the token in source. For more information, read about Notion authorization here.

Contributing

I built this module so that I could interact with Notion in a way that made sense to me. Hopefully, others will find it useful. If someone is particularly passionate about this area, I would be happy to consider other maintainers or contributors.

Any pull requests or other submissions are welcome. As most open source projects go, this is a side project. Large submissions will take time to review for acceptance, so breaking them into smaller pieces is always preferred. Thanks in advance!

Formatted using black.

Known Issues

See Issues on github.

Feature Requests

See Issues on github.

Comments
  • page search

    page search

    First of all, thank you very much for making this library, its amazing. Its really cool how well it integrates with Pydantic!

    I was expecting there to be a method for searching for pages something like:

    import notional
    from notional.records import Page
    
    notion = notional.connect(auth=NOTION_TOKEN)
    notion.pages.query(Page).execute()
    

    Which would yield all the pages (no databases)

    or maybe something like notion.pages.list()

    that would also allow for fuzzy matching

    notion.pages.list(filter='')

    Maybe in the ORM it would be nice to do

    notion.pages.query(page.name= ' ' ).execute()

    idk what the API should be here since the notion API does not explicitly searches in the page name for as far as I know.

    anyway, now I do:

    from notion_client import Client
    from notional.records import Page
    
    def search_notion(NOTION_TOKEN, query=None):
      base_query = dict(
          filter={
        'property':'object',
        'value':'page'
        },
        sort = {
          "direction":"descending",
          "timestamp":"last_edited_time"
        })
      
    
      if query:
        full_query = {**base_query,**dict(query=query)}
      else:
        full_query = base_query
    
      notion = Client(auth=NOTION_TOKEN)
      pages_result = notion.search(**full_query).get("results")
    
      return [Page.parse_obj(page) for page in pages_result if page.title]
    

    (which btw, subclassing Page with pydantic BaseModel opens up a really nice set of validation, parsing and serialisation possibilities so cheers for that!).

    opened by hugocool 6
  • Minor refactoring in Endpoint (sub-)class

    Minor refactoring in Endpoint (sub-)class

    Refactoring inspired by current ConnectedPage.__init_subclass__ usage. Although unlikely, a drastic change in notion-sdk-py future releases could cause problems with the proposed approach (e.g., if they change the attribute-based endpoints hierarchy).

    Even smaller refactoring in ChildrenEndpoint.append.

    opened by falcaopetri 4
  • Easier MentionObject API

    Easier MentionObject API

    Description

    I was trying to create a page titled "@ Today". This requires a types.MentionObject(types.MentionDate())) object. The best snippets I could come up with were:

    1. types.MentionObject.parse_obj
    from datetime import datetime
    today = datetime.now().strftime('%Y-%m-%d')
    
    mention_data = {
        "type": "mention",
        "plain_text": f"{today} → ",
        "mention": {"type": "date", "date": {"start": today, "end": None}},
    }
    types.Title(title=[types.MentionObject.parse_obj(mention_data)])
    

    based on https://github.com/jheddings/notional/blob/391d16fbf53782599d7f4f13fe92a49fdafbaef0/tests/test_types.py#L657

    1. types.MentionObject(types.MentionDate(types.DateRange))
    from datetime import datetime
    today = datetime.now().strftime('%Y-%m-%d')
    
    types.Title(title=[types.MentionObject(plain_text=f"{today} → ", mention=types.MentionDate(date=types.DateRange(start=today)))]),
    

    based on

    page = notion.pages.retrieve(PAGE_ID) # a page with title inserted in Notion
    page["title"]
    

    Moreover, Title does not seem to allow composition with mentions since it assumes a TextObject: https://github.com/jheddings/notional/blob/d96cefbecfbe406b820fbec593e36ea3a886099a/notional/types.py#L266

    Questions

    • Is currently a better approach for creating a mention?
    • If not, could there be a better API for creating a MentionObject? For example, by automagically wrapping a MentionData inside a MentionObject, or having an easier way to build mention_data?
    enhancement 
    opened by falcaopetri 4
  • How to validate the auth token?

    How to validate the auth token?

    Is there a way to:

    1. validate whether the auth token provided is even valid? (via some properties like length, checksum?)
    2. Validate whether the auth token allows one to connect to notion? So basically to check whether this is a token which would allow the user to do stuff with notion the notion API?

    Now I request the user list as a check (I am building a little GUI in flask to manipulate notion, therefore it would be nice for the "login" procedure to be able to throw an error if the token is invalid)

    opened by hugocool 4
  • Bump emoji from 2.0.0 to 2.2.0

    Bump emoji from 2.0.0 to 2.2.0

    Bumps emoji from 2.0.0 to 2.2.0.

    Release notes

    Sourced from emoji's releases.

    v2.2.0

    • Add support for Unicode Version 15
    • Add more translations for existing languages: (similar to Turkish Language)
    • Add Readme on how to add a language
    • Fix 2.0.0: sphinx warnings reference target not found

    v.2.1.0

    • Added Farsi support
    • Added Trove classifiers for Python 3.10 and 3.11
    Changelog

    Sourced from emoji's changelog.

    2.2.0

    • Add support for Unicode Version 15
    • Add more translations for existing languages: (similar to Turkish Language)
    • Add Readme on how to add a language
    • Fix 2.0.0: sphinx warnings reference target not found

    2.1.0

    • Added Farsi support
    • Added Trove classifiers for Python 3.10 and 3.11
    Commits
    • f09583f changelog updated to v2.2.0
    • c1de2f1 Merge pull request #239
    • 96ec1d2 Merge pull request #237
    • 41853d7 Added missed "py.typed package_data
    • 1d0acd3 Add README.md - how to add a new language
    • 5e57840 Change docs of emojize()
    • 5c19561 Normalize emoji name to NFKC to find it in EMOJI_DATA
    • fff013b Update EMOJI_DATA with translations from emojiterra
    • ed5b967 Add missing translations from emojiterra
    • cdd6c51 New tests
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 3
  • if self.filter is not None, create a compound for both filters

    if self.filter is not None, create a compound for both filters

    Sorry, this issue was created with VSCode Github extension. Super convenient but didn't give me a chance to explain!

    Exactly as you guessed. I was running multiple filters and getting more results with each filter! Then found out in your code it was basically taking the last one.

    Great library by the way. It's just missing a number of features to make it the de facto Notion ORM.

    opened by SandNerd 3
  • Update dependency flake8 to v6

    Update dependency flake8 to v6

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | flake8 (changelog) | ^5.0.4 -> ^6.0.0 | age | adoption | passing | confidence |


    Release Notes

    pycqa/flake8

    v6.0.0

    Compare Source


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies python 
    opened by renovate[bot] 2
  • Bump pytest from 7.1.2 to 7.2.0

    Bump pytest from 7.1.2 to 7.2.0

    Bumps pytest from 7.1.2 to 7.2.0.

    Release notes

    Sourced from pytest's releases.

    7.2.0

    pytest 7.2.0 (2022-10-23)

    Deprecations

    • #10012: Update pytest.PytestUnhandledCoroutineWarning{.interpreted-text role="class"} to a deprecation; it will raise an error in pytest 8.

    • #10396: pytest no longer depends on the py library. pytest provides a vendored copy of py.error and py.path modules but will use the py library if it is installed. If you need other py.* modules, continue to install the deprecated py library separately, otherwise it can usually be removed as a dependency.

    • #4562: Deprecate configuring hook specs/impls using attributes/marks.

      Instead use :pypytest.hookimpl{.interpreted-text role="func"} and :pypytest.hookspec{.interpreted-text role="func"}. For more details, see the docs <legacy-path-hooks-deprecated>{.interpreted-text role="ref"}.

    • #9886: The functionality for running tests written for nose has been officially deprecated.

      This includes:

      • Plain setup and teardown functions and methods: this might catch users by surprise, as setup() and teardown() are not pytest idioms, but part of the nose support.
      • Setup/teardown using the @​with_setup decorator.

      For more details, consult the deprecation docs <nose-deprecation>{.interpreted-text role="ref"}.

    Features

    • #9897: Added shell-style wildcard support to testpaths.

    Improvements

    • #10218: @pytest.mark.parametrize() (and similar functions) now accepts any Sequence[str] for the argument names, instead of just list[str] and tuple[str, ...].

      (Note that str, which is itself a Sequence[str], is still treated as a comma-delimited name list, as before).

    • #10381: The --no-showlocals flag has been added. This can be passed directly to tests to override --showlocals declared through addopts.

    • #3426: Assertion failures with strings in NFC and NFD forms that normalize to the same string now have a dedicated error message detailing the issue, and their utf-8 representation is expresed instead.

    • #7337: A warning is now emitted if a test function returns something other than [None]{.title-ref}. This prevents a common mistake among beginners that expect that returning a [bool]{.title-ref} (for example [return foo(a, b) == result]{.title-ref}) would cause a test to pass or fail, instead of using [assert]{.title-ref}.

    • #8508: Introduce multiline display for warning matching via :pypytest.warns{.interpreted-text role="func"} and enhance match comparison for :py_pytest._code.ExceptionInfo.match{.interpreted-text role="func"} as returned by :pypytest.raises{.interpreted-text role="func"}.

    • #8646: Improve :pypytest.raises{.interpreted-text role="func"}. Previously passing an empty tuple would give a confusing error. We now raise immediately with a more helpful message.

    • #9741: On Python 3.11, use the standard library's tomllib{.interpreted-text role="mod"} to parse TOML.

      tomli{.interpreted-text role="mod"}` is no longer a dependency on Python 3.11.

    • #9742: Display assertion message without escaped newline characters with -vv.

    • #9823: Improved error message that is shown when no collector is found for a given file.

    ... (truncated)

    Commits
    • 3af3f56 Prepare release version 7.2.0
    • bc2c3b6 Merge pull request #10408 from NateMeyvis/patch-2
    • d84ed48 Merge pull request #10409 from pytest-dev/asottile-patch-1
    • ffe49ac Merge pull request #10396 from pytest-dev/pylib-hax
    • d352098 allow jobs to pass if codecov.io fails
    • c5c562b Fix typos in CONTRIBUTING.rst
    • d543a45 add deprecation changelog for py library vendoring
    • f341a5c Merge pull request #10407 from NateMeyvis/patch-1
    • 1027dc8 [pre-commit.ci] auto fixes from pre-commit.com hooks
    • 6b905ee Add note on tags to CONTRIBUTING.rst
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once it's up-to-date and CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump pydantic from 1.9.1 to 1.10.2

    Bump pydantic from 1.9.1 to 1.10.2

    Bumps pydantic from 1.9.1 to 1.10.2.

    Release notes

    Sourced from pydantic's releases.

    v1.10.2 (2022-09-05)

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.1...v1.10.2

    v1.10.1 (2022-08-31)

    • Add __hash__ method to pydancic.color.Color class, #4454 by @​czaki

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.0...v1.10.1

    v1.10.0 (2022-08-30)

    See #4419 for feedback and discussion, docs are live at pydantic-docs.helpmanual.io.

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @​PrettyWood BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @​tlambert03
    • Allow for custom parsing of environment variables via parse_env_var in Config, #4406 by @​acmiyaguchi
    • Rename master to main, #4405 by @​hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @​hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @​chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @​JeanArhancet
    • Add support for bare type, #4375 by @​hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @​samuelcolvin
    • Add support for re.Pattern, #4366 by @​hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @​hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @​aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @​DetachHead
    • moved repo to pydantic/pydantic, #4348 by @​yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @​detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @​Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @​MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @​Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @​sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @​JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @​multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @​synek

    ... (truncated)

    Changelog

    Sourced from pydantic's changelog.

    v1.10.2 (2022-09-05)

    v1.10.1 (2022-08-31)

    • Add __hash__ method to pydancic.color.Color class, #4454 by @​czaki

    v1.10.0 (2022-08-30)

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @​PrettyWood BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @​tlambert03
    • Allow for custom parsing of environment variables via parse_env_var in Config, #4406 by @​acmiyaguchi
    • Rename master to main, #4405 by @​hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @​hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @​chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @​JeanArhancet
    • Add support for bare type, #4375 by @​hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @​samuelcolvin
    • Add support for re.Pattern, #4366 by @​hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @​hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @​aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @​DetachHead
    • moved repo to pydantic/pydantic, #4348 by @​yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @​detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @​Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @​MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @​Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @​sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @​JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @​multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @​synek
    • Update BaseModel.construct to work with aliased Fields, #4192 by @​kylebamos

    ... (truncated)

    Commits
    • bc74342 prepare for v1.10.2
    • f1e9883 fix: dataclass wrapper was not always called (#4484)
    • 91bb8d4 Basic fix of GenericModel cache to detect order of args in Union models [#447...
    • eccd85e prevent long strings as int inputs (#4480)
    • a4367c1 Revert percent encoding in URLs. (#4470)
    • 02cf7f5 fix mypy with default_factory=list etc. (#4471)
    • 5a2ddec Use tomllib on Python 3.11 (#4476)
    • 317bef3 build(deps): bump black from 22.6.0 to 22.8.0 (#4465)
    • 2add8a9 build(deps): bump hypothesis from 6.54.3 to 6.54.4 (#4464)
    • f1fb4f2 build(deps): bump mkdocs-material from 8.4.0 to 8.4.2 (#4463)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump mkdocstrings-python from 0.7.1 to 0.8.2

    Bump mkdocstrings-python from 0.7.1 to 0.8.2

    Bumps mkdocstrings-python from 0.7.1 to 0.8.2.

    Changelog

    Sourced from mkdocstrings-python's changelog.

    0.8.2 - 2022-11-19

    Compare with 0.8.1

    Bug Fixes

    0.8.1 - 2022-11-19

    Compare with 0.8.0

    Bug Fixes

    0.8.0 - 2022-11-13

    Compare with 0.7.1

    Features

    Code Refactoring

    • Support Griffe 0.24 (3b9f701 by Timothée Mazzucotelli).
    Commits
    • 67206aa chore: Prepare release 0.8.2
    • 34cfa4b fix: Fix base directory used to expand globs
    • 10a7884 chore: Prepare release 0.8.1
    • df1493c ci: Allow CI to run on branches
    • de48df7 ci: Install docs dependencies for tests
    • 0dc45ae fix: Expand globs relative to configuration file path
    • c4d32e1 chore: Prepare release 0.8.0
    • 3b9f701 refactor: Support Griffe 0.24
    • 12cd342 ci: Fix type checking
    • 4de7024 chore: Template upgrade
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump mkdocs from 1.3.1 to 1.4.2

    Bump mkdocs from 1.3.1 to 1.4.2

    Bumps mkdocs from 1.3.1 to 1.4.2.

    Release notes

    Sourced from mkdocs's releases.

    1.4.2

    • Officially support Python 3.11 (#3020)

      Note: Simply upgrading to Python 3.11 can cut off 10-15% of your site's build time.

    • Support multiple instances of the same plugin (#3027)

      If a plugin is specified multiple times in the list under the plugins: config, that will create 2 (or more) instances of the plugin with their own config each.

      Previously this case was unforeseen and, as such, bugged.

      Now even though this works, by default a warning will appear from MkDocs anyway, unless the plugin adds a class variable supports_multiple_instances = True.

    • Bugfix (regression in 1.4.1): Don't error when a plugin puts a plain string into warnings (#3016)

    • Bugfix: Relative links will always render with a trailing slash (#3022)

      Previously under use_directory_urls, links from a sub-page to the main index page rendered as e.g. <a href="../.."> even though in all other cases the links look like <a href="../../">. This caused unwanted behavior on some combinations of Web browsers and servers. Now this special-case bug was removed.

    • Built-in "mkdocs" theme now also supports Norwegian language (#3024)

    • Plugin-related warnings look more readable (#3016)

    See commit log.

    1.4.1

    • Support theme-namespaced plugin loading (#2998)

      Plugins' entry points can be named as 'sometheme/someplugin'. That will have the following outcome:

      • If the current theme is 'sometheme', the plugin 'sometheme/someplugin' will always be preferred over 'someplugin'.
      • If the current theme isn't 'sometheme', the only way to use this plugin is by specifying plugins: [sometheme/someplugin].

      One can also specify plugins: ['/someplugin'] instead of plugins: ['someplugin'] to definitely avoid the theme-namespaced plugin.

    • Bugfix: mkdocs serve will work correctly with non-ASCII paths and redirects (#3001)

    • Windows: 'colorama' is now a dependency of MkDocs, to ensure colorful log output (#2987)

    • Plugin-related config options have more reliable validation and error reporting (#2997)

    • Translation sub-commands of setup.py were completely dropped. See documentation [1] [2] for their new replacements (#2990)

    • The 'mkdocs' package (wheel and source) is now produced by Hatch build system and pyproject.toml instead of setup.py (#2988)

    Other small improvements; see commit log.

    1.4.0

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Updating page properties doesn't work if a formula property is present

    Updating page properties doesn't work if a formula property is present

    To determine to current version, run python -m notional

    Notional Version: current main brunch, i.e. notional.__version__ shows 0.4.1-73c5bc5, it seems like this should have been increased to 0.4.2 in the last release?

    Description

    Updating a page doesn't work if the page contains a formula property.

    Steps To Reproduce

    notion_orm = notional.connect(auth=AUTH_TOKEN)
    query = notion_orm.databases.query(db['id']).sort(property="Name", direction=notional.query.SortDirection.ASCENDING)
    p = query.first()
    notion_orm.pages.update(p)
    

    Expected Behavior

    Since we are not changing anything, calling notion_orm.pages.update(p) should just work. Instead:

    ---------------------------------------------------------------------------
    HTTPStatusError                           Traceback (most recent call last)
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:116, in BaseClient._parse_response(self, response)
        115 try:
    --> 116     response.raise_for_status()
        117 except httpx.HTTPStatusError as error:
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/httpx/_models.py:736, in Response.raise_for_status(self)
        735 message = message.format(self, error_type=error_type)
    --> 736 raise HTTPStatusError(message, request=request, response=self)
    
    HTTPStatusError: Client error '400 Bad Request' for url 'https://api.notion.com/v1/pages/XXXXXXXXREMOVED'
    For more information check: https://httpstatuses.com/400
    
    During handling of the above exception, another exception occurred:
    
    APIResponseError                          Traceback (most recent call last)
    Input In [86], in <cell line: 1>()
    ----> 1 notion_orm.pages.update(p)
    
    File ~/Sources/notional/src/notional/session.py:345, in PagesEndpoint.update(self, page, **properties)
        338     properties = page.properties
        340 props = {
        341     name: value.to_api() if value is not None else None
        342     for name, value in properties.items()
        343 }
    --> 345 data = self().update(page.id.hex, properties=props)
        347 return page.refresh(**data)
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/api_endpoints.py:218, in PagesEndpoint.update(self, page_id, **kwargs)
        213 def update(self, page_id: str, **kwargs: Any) -> SyncAsync[Any]:
        214     """Update [page property values](https://developers.notion.com/reference/page#property-value-object) for the specified page.
        215 
        216     *[🔗 Endpoint documentation](https://developers.notion.com/reference/patch-page)*
        217     """  # noqa: E501
    --> 218     return self.parent.request(
        219         path=f"pages/{page_id}",
        220         method="PATCH",
        221         body=pick(kwargs, "archived", "properties", "icon", "cover"),
        222         auth=kwargs.get("auth"),
        223     )
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:192, in Client.request(self, path, method, query, body, auth)
        190 except httpx.TimeoutException:
        191     raise RequestTimeoutError()
    --> 192 return self._parse_response(response)
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:124, in BaseClient._parse_response(self, response)
        122         code = None
        123     if code and is_api_error_code(code):
    --> 124         raise APIResponseError(response, body["message"], code)
        125     raise HTTPResponseError(error.response)
        127 body = response.json()
    
    APIResponseError: body failed validation. Fix one:
    body.properties.MyFormula.title should be defined, instead was `undefined`.
    body.properties.MyFormula.rich_text should be defined, instead was `undefined`.
    body.properties.MyFormula.number should be defined, instead was `undefined`.
    body.properties.MyFormula.url should be defined, instead was `undefined`.
    body.properties.MyFormula.select should be defined, instead was `undefined`.
    body.properties.MyFormula.multi_select should be defined, instead was `undefined`.
    body.properties.MyFormula.people should be defined, instead was `undefined`.
    body.properties.MyFormula.email should be defined, instead was `undefined`.
    body.properties.MyFormula.phone_number should be defined, instead was `undefined`.
    body.properties.MyFormula.date should be defined, instead was `undefined`.
    body.properties.MyFormula.checkbox should be defined, instead was `undefined`.
    body.properties.MyFormula.relation should be defined, instead was `undefined`.
    body.properties.MyFormula.files should be defined, instead was `undefined`.
    body.properties.Level.type should be not present, instead was `"select"`.
    body.properties.Level.select should be not present, instead was `{"name":"Advanced","id":"]yHE","color":"blue"}`.
    body.properties.Level.name should be defined, instead was `undefined`.
    body.properties.Level.start should be defined, instead was `undefined`.
    

    Just removing the property MyFormula from the database fixes this problem. Interesting is that also the property Level seems to be affected when a Formula is present although it's of type select.

    Additional Context

    bug 
    opened by FlorianWilhelm 2
  • Methods on ORM properties should update on the server.

    Methods on ORM properties should update on the server.

    Description

    When methods are called on ORM properties, only the local objects update due to the get/set handler of a property.

    Proposed Solution

    Calling methods on properties from ORM classes should reflect changes on the server.

    Alternatives

    Alternatives are to use in-place modifiers, such as += for ORM properties. This only works for certain property types.

    Additional Context

    Related issues:

    • #30
    enhancement 
    opened by jheddings 0
  • Late binding of session to custom ORM pages is broken.

    Late binding of session to custom ORM pages is broken.

    Currently, sessions must be bound to a ConnectedPage prior to defining custom types.

    CustomPage = connected_page()
    
    def Animal(CustomPage):
        # ORM properties
    
    def main():
        notion = notional.connect(auth=auth_token)
        CustomPage.bind(notion)
    
        # at this point, the session in Animal is None
    
    bug 
    opened by jheddings 1
  • Page updates fail when page properties are read only.

    Page updates fail when page properties are read only.

    Submitting page changes breaks when the page contains properties that are read only, such as formula and created_by.

    Version: HEAD

    Traceback (most recent call last):
      File ".../notional/examples/props.py", line 40, in <module>
        notion.pages.update(page)
      File ".../notional/notional/session.py", line 249, in update
        data = self().update(page.id.hex, **diff)
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/api_endpoints.py", line 164, in update
        return self.parent.request(
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/client.py", line 155, in request
        return self._parse_response(response)
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/client.py", line 111, in _parse_response
        raise APIResponseError(response, body["message"], code)
    notion_client.errors.APIResponseError: body failed validation. Fix one: body.properties.Created By.title should be defined, instead was `undefined`. body.properties.Created By.rich_text should be defined, instead was `undefined`. body.properties.Created By.number should be defined, instead was `undefined`. body.properties.Created By.url should be defined, instead was `undefined`. body.properties.Created By.select should be defined, instead was `undefined`. body.properties.Created By.multi_select should be defined, instead was `undefined`. body.properties.Created By.people should be defined, instead was `undefined`. body.properties.Created By.email should be defined, instead was `undefined`. body.properties.Created By.phone_number should be defined, instead was `undefined`. body.properties.Created By.date should be defined, instead was `undefined`. body.properties.Created By.checkbox should be defined, instead was `undefined`. body.properties.Created By.relation should be defined, instead was `undefined`. body.properties.Created By.files should be defined, instead was `undefined`. 
    
    bug 
    opened by jheddings 1
Releases(v0.7.0)
  • v0.7.0(Jan 3, 2023)

    ⚠️ BREAKING CHANGES

    • EndpointIterator now requires an additional call when using in a loop
    • to_api() has been renamed dict() - which overrides default Pydantic behavior
    • Time filters have been refactored to use the "composable" object pattern

    Completed PR's

    • Add support for the properties endpoint. by @jheddings in https://github.com/jheddings/notional/pull/101
    • Add support for additional parent objects. by @jheddings in https://github.com/jheddings/notional/pull/105
    • Refactored iterators in support of top-level objects. by @jheddings in https://github.com/jheddings/notional/pull/106

    Full Changelog: https://github.com/jheddings/notional/compare/v0.5.2...v0.7.0

    Source code(tar.gz)
    Source code(zip)
  • v0.5.2(Dec 30, 2022)

  • v0.5.1(Dec 23, 2022)

    What's Changed

    • Improved object references in session endpoints. by @jheddings in https://github.com/jheddings/notional/pull/100

    Full Changelog: https://github.com/jheddings/notional/compare/v0.5.0...v0.5.1

    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Dec 20, 2022)

    ⚠️ BREAKING CHANGES

    • The records module has been removed; classes have been moved into the blocks module.
    • NestedObject has been removed; this was not adding any real value.
    • Relation objects no longer support the compose interface; callers must compose the appropriate subclass instead.
    • Object references have been moved into the types module with some minor modifications.

    What's Changed

    • Easier MentionObject API by @jheddings in https://github.com/jheddings/notional/pull/94
    • Update object model to match Notion API by @jheddings in https://github.com/jheddings/notional/pull/95
    • Other minor improvements and bug fixes
    • Switched from dependabot to Renovate

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.4...v0.5.0

    Source code(tar.gz)
    Source code(zip)
  • v0.4.4(Dec 2, 2022)

    What's Changed

    • Fix #69 (composing select blocks)
    • Add indexing for simple tables.
    • Using installed package metadata for version info.
    • Updated several dependencies.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.3...v0.4.4

    Source code(tar.gz)
    Source code(zip)
  • v0.4.3(Nov 8, 2022)

    What's Changed

    • Fixed #66
    • Added missing BooleanFormula by @FlorianWilhelm in https://github.com/jheddings/notional/pull/58
    • Allow setting ExternalFile as icon in ORM by @FlorianWilhelm in https://github.com/jheddings/notional/pull/61
    • Simplify and correct is_emoji, add unit test by @FlorianWilhelm in https://github.com/jheddings/notional/pull/62
    • Fixes issue #57 by @FlorianWilhelm in https://github.com/jheddings/notional/pull/63

    New Contributors

    • @FlorianWilhelm made their first contribution in https://github.com/jheddings/notional/pull/58

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.1...v0.4.3

    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Jun 7, 2022)

    Thanks to @falcaopetri for the PR's!

    What's Changed

    • Fixed a bug with changes in API field names - #51
    • Fixed typos by @falcaopetri in https://github.com/jheddings/notional/pull/43
    • Default NOTION_{AUTH_TOKEN,TEST_AREA} during preflight by @falcaopetri in https://github.com/jheddings/notional/pull/45
    • Several minor dependency updates.

    New Contributors

    • @falcaopetri made their first contribution in https://github.com/jheddings/notional/pull/43

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.0...v0.4.1

    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Apr 27, 2022)

    NOTE due to changes in the Notion API, this is a breaking release. Please verify your applications before updating!

    What's Changed

    • Corrected for API changes (#39, #40).
    • Improved ORM declarations using scheme types. by @jheddings in https://github.com/jheddings/notional/pull/33
    • Improved ORM support. by @jheddings in https://github.com/jheddings/notional/pull/38

    Full Changelog: https://github.com/jheddings/notional/compare/v0.3.2...v0.4.0

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Apr 19, 2022)

  • v0.3.1(Apr 14, 2022)

    BREAKING CHANGES

    This release adds a significant change to the way blocks (and other data objects) are created. In particular, objects will use metaclass indexers rather than the from_ factory (and related) methods. Please review the latest documentation and examples for detailed usage.

    I anticipate similar changes to other objects if it makes sense, which may result in additional interface changes.

    What's Changed

    • Add support for composable objects. by @jheddings in https://github.com/jheddings/notional/pull/31
    • Created several additional helper methods & properties.
    • Many documentation and unit test updates.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.2.1...v0.3.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Apr 9, 2022)

    What's Changed

    • Added helper methods for Relation and Rollup types.
    • Several critical lint fixes, including full docstrings.
    • Various other documentation updates.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.2.0...v0.2.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Apr 8, 2022)

    NOTE: there are many changes to method and constant names in this release. Most of these are internal, however some may affect users. Please verify these changes to make sure it does not break your project!

    What's Changed

    • New document parsers - HTML and CSV
    • Updates for the latest Notion API release
    • Multiple lint fixes
    • Several bug fixes and dependency updates

    Full Changelog: https://github.com/jheddings/notional/compare/v0.1.1...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Mar 11, 2022)

    What's Changed

    • Fixed an issue with data refresh when appending blocks.
    • Added helper methods for working with tables.
    • More helpers and new block types.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.1.0...v0.1.1

    Available on PyPi: https://pypi.org/project/notional/0.1.1/

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Mar 10, 2022)

    Note: this is a significant update with several changes to internal interfaces.

    What's Changed

    • Several features to support new API capabilities.
    • Fixed bugs in query builder that limited to a single filter.
    • Fixed bugs in API blocks with empty nested data.
    • Added basic markdown rendering of some blocks.
    • Added other helpers and data accessors.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.10...v0.1.0

    Available on PyPi: https://pypi.org/project/notional/0.1.0/

    Source code(tar.gz)
    Source code(zip)
  • v0.0.10(Nov 12, 2021)

    What's Changed

    • Added search endpoint. by @jheddings in https://github.com/jheddings/notional/pull/19

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.9...v0.0.10

    Source code(tar.gz)
    Source code(zip)
  • v0.0.9(Nov 11, 2021)

    • Lots of changes to data type handling.
    • Several new features from the Notion API.
    • Improved ORM handling of keywords.
    • Added structured filters to Query (instead of legacy keywords).

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.8...v0.0.9

    Source code(tar.gz)
    Source code(zip)
  • v0.0.8(Oct 25, 2021)

    This release breaks previous compatibility. See tests and examples for latest usage information.

    • Includes lates data types and features from the public Notion API
    • Multiple improvements in overall usage and readability

    View commit log for full details.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.7(Sep 2, 2021)

    Initial support for creating new content.

    There have been several breaking changes to the SDK interface in this release. Be sure to check the latest tests and examples for working code.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.3(Aug 3, 2021)

  • v0.0.2(Aug 3, 2021)

  • v0.0.1(Aug 3, 2021)

Owner
Jason Heddings
Jason Heddings
Python based league of legends orbwalker

League of Legends Orbwalker Usage Install python3 Create a python3 venv Install the requirements pip install -r requirements.txt Get in game and run m

Inusha 43 Dec 12, 2022
Python SDK for accessing the Hanko Authentication API

Hanko Authentication SDK for Python This package is maintained by Hanko. Contents Introduction Documentation Installation Usage Prerequisites Create a

Hanko.io 3 Mar 08, 2022
Telegram Bot for everyday raffles

SpinEverydayBot v2 Telegram bot for everyday raffles. HIGHLY EXPERIMENTAL! WORK IN PROGRESS! Setting up Requirements Python 3.9+ PostgreSQL 13+ Older

evgfilim1 18 Dec 20, 2022
A discord account nuker with lots of tools that will destroy a discord account

A discord account nuker with lots of tools that will destroy a discord account (token destroyer... and much more).

firexi 10 Apr 28, 2022
A minimalistic, modern Discord bot for roles and polls using dropdowns

DropBot A minimalistic, modern Discord bot for roles and polls using dropdowns Made by ThatOneCalculator Technologies used Instructions Type /, and na

ModernBots 1 Jun 27, 2022
A fork of discord.py

discord.py A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. The Future of discord.py Please read the gi

1 Dec 19, 2021
ВКонтакте бот для управления Sugar кошельком

Sugarchain VK ВКонтакте бот для управления Sugar кошельком Установка Установить зависимости можно командой: pip install -r requirements.txt Запуск (из

Vladimir 4 Jun 06, 2021
Total servers you're in!

Discord-Servercount With this script you can check the amount of servers you are in, along with statistics of how many servers you are owner in and in

Nickyux 1 Feb 12, 2022
The world's first public V2ray manager Telegram bot

📌 DarkV2ray-Manager-Bot 0.1 UPDATE 11/11/2021 Telegram bot v2ray Test user expired date data limit paylode && sni usage user on/off heroku bot hostin

@Dk_king_offcial 1 Nov 11, 2021
Terraform Cloud CLI for Managing Workspace Terraform Versions

Terraform Cloud Version Manager This tiny script makes it easy to update the Terraform Version on all of the Workspaces inside Terraform Cloud. It wil

Robert Hafner 1 Jan 07, 2022
A reddit bot that imitates the popular reddit bot "u/repostsleuthbot" to trick people into clicking on a rickroll

Reddit-Rickroll-Bot A reddit bot that imitates the popular reddit bot "u/repostsleuthbot" to trick people into clicking on a rickroll Made with The Py

0 Jul 16, 2022
Reverse engineering the dengue virus (under development construction)

Reverse engineering the dengue virus (under development 🚧 ) What is dengue? Dengue is a viral infection transmitted to humans through the bite of inf

kjain 4 Feb 09, 2022
Insane Weather Bot is here! Give suggestions, fork, and do much more to help us enhance the abilities of Insane Weather Bot.

Insane_Weather_Bot Insane Weather Bot is here! Give suggestions, fork, and do much more to help us enhance the abilities of Insane Weather Bot. Weathe

1 Jan 02, 2022
A Python API wrapper for the Twitter API!

PyTweet PyTweet is an api wrapper made for twitter using twitter's api version 2! Installation Windows py3 -m pip install PyTweet Linux python -m pip

TheFarGG 1 Nov 19, 2022
Cryptocurrency Prices Telegram Bot For Python

Cryptocurrency Prices Telegram Bot How to Run Set your telegram bot token as environment variable TELEGRAM_BOT_TOKEN: export TELEGRAM_BOT_TOKEN=your_

Sina Nazem 3 Oct 31, 2022
👨‍💼Linkedin API for Python

linkedin_api 👨‍💼 Linkedin API for Python No "official" API access required - just use a valid Linkedin account! Programmatically send messages, get

Tom Quirk 918 Dec 29, 2022
Wonderful Phoenix-Bot

Phoenix Bot Discord Phoenix Bot is inspired by Natewong1313's Bird Bot project yet due to lack of activity by their team. We have decided to revive th

Senior Developer 0 Aug 12, 2021
Moon-TikTok-Checker - A TikTok Username checking tool that probably 3/4 people use to get rare usernames

Moon Checker (educational Purposes Only) What Is Moon Checker? This is a TikTok

glide 4 Nov 30, 2022
❝𝐓𝐡𝐞 𝐌𝐨𝐬𝐭 𝐏𝐨𝐰𝐞𝐫𝐟𝐮𝐥𝐥 𝐆𝐫𝐨𝐮𝐩 𝐌𝐚𝐧𝐚𝐠𝐞𝐦𝐞𝐧𝐭 𝐁𝐨𝐭❞

❝𝐓𝐡𝐞 𝐌𝐨𝐬𝐭 𝐏𝐨𝐰𝐞𝐫𝐟𝐮𝐥𝐥 𝐆𝐫𝐨𝐮𝐩 𝐌𝐚𝐧𝐚𝐠𝐞𝐦𝐞𝐧𝐭 𝐁𝐨𝐭❞

Abdisamad Omar Mohamed 5 Jun 24, 2022
A Telegram Bot That Provides Permanent Download Links For Sent Files.

FileStreamBot A Telegram bot to all media and documents files to web link . Report a Bug | Request Feature Demo Bot: 🍁 About This Bot : This bot will

Flux Inc. 1 Nov 02, 2021