Skip to content

Commit

Permalink
Version 0.4.0
Browse files Browse the repository at this point in the history
- Simplify Architecture
- Configurable Manager Case (for Collection Names)
- Add Dynamic Requirement Builder
- Streamline Requirements

Signed-off-by: alexgurrola <[email protected]>
  • Loading branch information
alexgurrola committed Mar 17, 2018
1 parent 5d8c9cb commit 7a360f5
Show file tree
Hide file tree
Showing 14 changed files with 84 additions and 94 deletions.
16 changes: 13 additions & 3 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ Registration only requires exposing the object to the Manager.

.. code-block:: python
from snakelet.storage.document import Document
from snakelet.storage.manager import Manager
from snakelet.storage import Document, Manager
class Cat(Document):
pass
Expand All @@ -32,7 +31,7 @@ Connecting to a database is fairly straightforward.

.. code-block:: python
from snakelet.storage.manager import Manager
from snakelet.storage import Manager
manager = Manager(
database='felines',
Expand All @@ -42,6 +41,17 @@ Connecting to a database is fairly straightforward.
password='pass'
)
By default, Managers build and fetch collections in snake case, but this
can be switched to camel case during instantiation.

.. code-block:: python
from snakelet.storage import Manager
manager = Manager(
case='camel'
)
Finding, Saving, and Removal are also pretty straightforward.

.. code-block:: python
Expand Down
24 changes: 20 additions & 4 deletions requirements.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
import subprocess


def main():
# generate requirements
process = subprocess.Popen(
['pipreqs', './', '--force'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
out, err = process.communicate()
if process.returncode != 0:
print(str(err, 'utf-8'))
return

# settings
requirements_file = 'requirements.txt'

Expand All @@ -10,13 +25,14 @@ def main():
content = list(set(content))
content.sort(key=lambda y: y.lower())
content = '\n'.join(content)
print(content)

# save
with open(requirements_file, 'w') as requirements:
requirements.write(f'{content}\n')

if __name__ == '__main__':
import plac

if __name__ == '__main__':
try:
plac.call(main)
main()
except KeyboardInterrupt:
print('\nGoodbye!')
4 changes: 1 addition & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
plac==0.9.6
pymongo==3.6.0
setuptools==38.5.1
pymongo==3.6.1
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
# Versions should comply with PEP440. For a discussion on single-sourcing
# the version across setup.py and the project code, see
# https://packaging.python.org/en/latest/single_source_version.html
version='0.3.0',
version='0.4.0',

description='Mongo ORM',
long_description=long_description,
Expand Down
2 changes: 1 addition & 1 deletion snakelet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
Snakelet is a Mongo ORM using Native Drivers without Schemas
"""

__version__ = '0.3.0'
__version__ = '0.4.0'
__author__ = 'Alex Gurrola'
__email__ = '[email protected]'
__url__ = 'https://github.com/alexgurrola/snakelet'
13 changes: 7 additions & 6 deletions snakelet/__main__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
def main(version: ("display version", 'flag', 'a')):
def main():
import argparse
import snakelet
if version:
print(snakelet.__version__)

parser = argparse.ArgumentParser(description='Schema-less Micro-ORM')
parser.add_argument('-v', '--version', dest='version', action='version', version=snakelet.__version__)
parser.parse_args()

if __name__ == '__main__':
import plac

if __name__ == '__main__':
try:
plac.call(main)
main()
except KeyboardInterrupt:
print('\nGoodbye!')
8 changes: 7 additions & 1 deletion snakelet/storage/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
from .collection import Collection
from .document import Document
from .manager import Manager
from .paginator import Paginator

__all__ = (
'Document'
'Collection',
'Document',
'Manager',
'Paginator',
)
18 changes: 2 additions & 16 deletions snakelet/storage/collection.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from .paginator import Paginator
from ..utilities.conversion import snake


class Collection:
def __init__(self, manager, document):
def __init__(self, manager=None, document=None):
self.manager = manager
self.document = document
self.collection_name = snake(self.document.__name__)
self.collection_name = manager.collection_name.encode(self.document.__name__)
self.collection = self.manager.db[self.collection_name]

def find(self, search):
Expand Down Expand Up @@ -35,16 +34,3 @@ def paginate(self, **kwargs):

def objectify(self, document):
return self.manager.objectify(self.collection_name, document)


def main():
pass


if __name__ == '__main__':
import plac

try:
plac.call(main)
except KeyboardInterrupt:
print('\nGoodbye!')
13 changes: 0 additions & 13 deletions snakelet/storage/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,3 @@ def __add_meta__(self, key, type):
self.__meta__[key] = type
return
"""


def main():
pass


if __name__ == '__main__':
import plac

try:
plac.call(main)
except KeyboardInterrupt:
print('\nGoodbye!')
25 changes: 9 additions & 16 deletions snakelet/storage/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,17 @@

from .collection import Collection
from .document import Document
from ..utilities.conversion import camel
from ..utilities.conversion import Conversion


class Manager(object):
def __init__(self, database, host=None, port=None, username=None, password=None):

def __init__(self, database, host=None, port=None, username=None, password=None, case=None):

# Configuration
self.collection_name = Conversion(case)
self.document_name = Conversion('camel')

# Driver
self.client = MongoClient(host=host, port=port)
self.client[database].authenticate(name=username, password=password)
Expand Down Expand Up @@ -46,7 +52,7 @@ def register(self, document):
self.__setattr__(identifier, Collection(self, document))

def objectify(self, collection, document):
name = camel(collection)
name = self.document_name.encode(collection)
if name in self.documents:
prototype = self.documents[name]()
if document:
Expand Down Expand Up @@ -94,16 +100,3 @@ def remove(self, document):

def shutdown(self):
pass


def main():
pass


if __name__ == '__main__':
import plac

try:
plac.call(main)
except KeyboardInterrupt:
print('\nGoodbye!')
12 changes: 0 additions & 12 deletions snakelet/storage/paginator.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,3 @@ def __next__(self):
self.current += 1
return documents


def main():
pass


if __name__ == '__main__':
import plac

try:
plac.call(main)
except KeyboardInterrupt:
print('\nGoodbye!')
16 changes: 3 additions & 13 deletions snakelet/storage/proxy.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
class Proxy:
# TODO: Build a proxy that can load hydrate itself when accessed
# TODO: Register models for relations to exist without needing to have separate instances
# TODO: Use register to hydrate all models of the same type simultaneously
pass


def main():
pass


if __name__ == '__main__':
import plac

try:
plac.call(main)
except KeyboardInterrupt:
print('\nGoodbye!')
13 changes: 13 additions & 0 deletions snakelet/utilities/conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,16 @@ def snake(string): return re.sub("([A-Z])", "_\\1", string).lower().lstrip("_")


def camel(string): return "".join(map(str.capitalize, string.split("_")))


class Conversion:
cases = {
'snake': snake,
'camel': camel
}

def __init__(self, case):
self.case = self.cases['snake' if not case or case not in self.cases else case]

def encode(self, data: str):
return self.case(data)
12 changes: 7 additions & 5 deletions tests/test_connect.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import configparser

from snakelet.storage.document import Document
from snakelet.storage.manager import Manager
from snakelet.storage import Document, Manager


class Test(Document):
Expand All @@ -16,6 +15,7 @@ def test_find():

# Connect to Database
manager = Manager(
case='camel',
database=config['db'],
host=config['host'],
port=config.getint('port'),
Expand All @@ -35,16 +35,18 @@ def test_find():
print('save:', created)
manager.save(created)
print('persistent:', created)
elif 'updated' not in fetched or not fetched['updated']:
print('updating:', fetched)
fetched['updated'] = True
manager.save(fetched)
else:
print('fetched:', fetched)
print('removing document...')
manager.remove(fetched)


if __name__ == '__main__':
import plac

try:
plac.call(test_find)
test_find()
except KeyboardInterrupt:
print('\nGoodbye!')

0 comments on commit 7a360f5

Please sign in to comment.