diff --git a/Dockerfile b/Dockerfile index 9289deb..550df7d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ From python:2.7.9-onbuild Maintainer J. Fernando Sánchez @balkian # RUN pip --cert cacert.pem install -r -v requirements.txt +ADD . /usr/src/app/ -RUN pip install --editable .; +RUN pip install -e "/usr/src/app/[server]" ENTRYPOINT ["bitter"] diff --git a/MANIFEST.in b/MANIFEST.in index dfaf48a..67a93b5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,6 @@ include requirements.txt include test-requirements.txt include README.md +graft bitter/templates +graft bitter/static +graft test diff --git a/README.md b/README.md index 50a0903..c92201a 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,14 @@ To add more users to the credentials file, you may run the builtin server, with python -m bitter server ``` +If you get an error about missing dependencies, install the extra dependencies for the server. e.g.: + +``` +pip install bitter[web] +``` + +Make sure the callback url of your app is set to http://127.0.0.1:5000/callback_url/ + # Notice Please, use according to Twitter's Terms of Service diff --git a/bitter/__init__.py b/bitter/__init__.py new file mode 100644 index 0000000..3ac18db --- /dev/null +++ b/bitter/__init__.py @@ -0,0 +1,7 @@ +""" +Bitter module. A library and cli for Twitter using python-twitter. +http://github.com/balkian/bitter +""" + +__version__ = '0.4.1' +__all__ = ['cli', 'config', 'crawlers', 'models', 'utils' ] diff --git a/bitter/cli.py b/bitter/cli.py index 6d7c130..ad3733d 100644 --- a/bitter/cli.py +++ b/bitter/cli.py @@ -12,7 +12,14 @@ from sqlalchemy import exists from bitter import utils, models, crawlers from bitter.models import make_session, User, ExtractorEntry, Following -from contextlib import ExitStack + +import sys +if sys.version_info <= (3, 0): + from contextlib2 import ExitStack +else: + from contextlib import ExitStack + + logger = logging.getLogger(__name__) diff --git a/bitter/utils.py b/bitter/utils.py index 805764b..a865e3e 100644 --- a/bitter/utils.py +++ b/bitter/utils.py @@ -46,7 +46,10 @@ def iter_credentials(credfile=None): def get_credentials(credfile=None, inverse=False, **kwargs): creds = [] for i in iter_credentials(credfile): - if all(map(lambda x: i[x[0]] == x[1], kwargs.items())): + matches = all(map(lambda x: i[x[0]] == x[1], kwargs.items())) + if matches and not inverse: + creds.append(i) + elif inverse and not matches: creds.append(i) return creds diff --git a/requirements-py2.txt b/requirements-py2.txt new file mode 100644 index 0000000..03fdf8e --- /dev/null +++ b/requirements-py2.txt @@ -0,0 +1 @@ +contextlib2 diff --git a/setup.py b/setup.py index 2e9bf94..d295ac3 100644 --- a/setup.py +++ b/setup.py @@ -6,16 +6,25 @@ from pip.req import parse_requirements # pip 6 introduces the *required* session argument try: install_reqs = parse_requirements("requirements.txt", session=pip.download.PipSession()) + py2_reqs = parse_requirements("requirements-py2.txt", session=pip.download.PipSession()) test_reqs = parse_requirements("test-requirements.txt", session=pip.download.PipSession()) except AttributeError: install_reqs = parse_requirements("requirements.txt") + py2_reqs = parse_requirements("requirements-py2.txt") test_reqs = parse_requirements("test-requirements.txt") +import sys +import itertools +if sys.version_info <= (3, 0): + install_reqs = itertools.chain(install_reqs, py2_reqs) + # reqs is a list of requirement # e.g. ['django==1.5.1', 'mezzanine==1.4.6'] install_reqs = [str(ir.req) for ir in install_reqs] test_reqs = [str(ir.req) for ir in test_reqs] +with open('bitter/__init__.py') as f: + exec(f.read()) setup( name="bitter", @@ -27,9 +36,13 @@ setup( author='J. Fernando Sanchez', author_email='balkian@gmail.com', url="http://balkian.com", - version="0.4", + version=__version__, install_requires=install_reqs, tests_require=test_reqs, + extras_require = { + 'server': ['flask', 'flask-oauthlib'] + }, + test_suite="tests", include_package_data=True, entry_points=""" [console_scripts] diff --git a/test-requirements.txt b/test-requirements.txt index e69de29..e079f8a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -0,0 +1 @@ +pytest diff --git a/tests/test_crawlers.py b/tests/test_crawlers.py deleted file mode 100644 index 6029591..0000000 --- a/tests/test_crawlers.py +++ /dev/null @@ -1,9 +0,0 @@ -from unittest import TestCase - -from bitter.crawlers import TwitterWorker, TwitterQueue - -class TestWorker(TestCase): - - - def test_worker(self): - w = TwitterWorker() diff --git a/tests/test_models.py b/tests/test_models.py deleted file mode 100644 index c87a1de..0000000 --- a/tests/test_models.py +++ /dev/null @@ -1,6 +0,0 @@ -from unittest import TestCase - -class TestModels(TestCase): - - def test_worker(self): - assert True diff --git a/tests/test_utils.py b/tests/test_utils.py index cc95675..c4c0f85 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,7 +1,50 @@ from unittest import TestCase +import os + +from bitter import utils +from bitter import config as c + class TestUtils(TestCase): - def test_get_user(self): - assert True + def setUp(self): + self.credfile = '/tmp/credentials.txt' + c.CREDENTIALS = self.credfile + if os.path.exists(self.credfile): + os.remove(self.credfile) + utils.create_credentials(self.credfile) + + + def test_create_credentials(self): + assert os.path.exists(self.credfile) + os.remove(self.credfile) + utils.create_credentials() # From config + assert os.path.exists(self.credfile) + + def test_add_credentials(self): + utils.add_credentials(self.credfile, user="test") + assert utils.get_credentials(self.credfile) + assert utils.get_credentials(user="test") + assert list(utils.get_credentials(user="test"))[0]["user"] == "test" + + def test_get_credentials(self): + utils.add_credentials(self.credfile, user="test") + assert utils.get_credentials(user="test") + assert not utils.get_credentials(user="test", inverse=True) + + def test_add_two_credentials(self): + utils.add_credentials(self.credfile, user="test") + utils.add_credentials(self.credfile, user="test2") + assert utils.get_credentials(user="test") + assert utils.get_credentials(user="test2") + + def test_delete_credentials(self): + utils.add_credentials(self.credfile, user="test") + assert utils.get_credentials(user="test") + utils.delete_credentials(user="test") + print(utils.get_credentials()) + assert not utils.get_credentials(user="test") + + +