Skip to content

Instantly share code, notes, and snippets.

@zqqf16
Created December 11, 2014 02:46
Show Gist options
  • Save zqqf16/137ad13e5b23c58abcae to your computer and use it in GitHub Desktop.
Save zqqf16/137ad13e5b23c58abcae to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os
from datetime import datetime
FILE_NAME = 'messages.json'
class DataBase(object):
def __init__(self, name):
self.name = name
if not os.path.isfile(self.name):
with open(self.name, 'w'):
pass
def get(self):
with open(self.name, 'r') as f:
data = f.read()
if data:
return json.load(data)
else:
return []
def save(self, data):
with open(self.name, 'w') as f:
json.dump(data, f)
class FieldDescriptor(object):
def __init__(self, field):
self.field = field
def __get__(self, instance, owner):
if instance is None:
return self.field
return instance._data.get(self.field.name)
def __set__(self, instance, value):
instance._data[self.field.name] = value
class Field(object):
name = ''
def to_json(self, value):
return value
class StringField(Field):
pass
class DateField(Field):
def __init__(self, format='%Y-%m-%d'):
self.format = format
def to_json(self, value):
if not isinstance(value, datetime):
raise TypeError('expect {}, got {}'.format('datetime', type(value)))
return value.strftime(self.format)
class Meta(type):
def __new__(self, name, bases, attrs):
_fields = dict((k, v) for k, v in attrs.items() if isinstance(v, Field))
for k, v in _fields.items():
v.name = k
attrs[k] = FieldDescriptor(v)
attrs['_fields'] = _fields
attrs['_data'] = {}
return super(Meta, self).__new__(self, name, bases, attrs)
class Model(object):
__metaclass__ = Meta
db = None
def __init__(self, *args, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
@classmethod
def all(cls):
if not cls.db:
return []
return cls.db.get()
@classmethod
def append(cls, instance):
if not cls.db:
return
a = cls.db.get()
a.append(instance._data)
cls.db.save(a)
class Message(Model):
content = StringField()
date = DateField()
db = DataBase('message.json')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment