Skip to content

Instantly share code, notes, and snippets.

@ondrejsika
Created January 1, 2019 17:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ondrejsika/744eb802f36c78dd1e1c4ac505fe6932 to your computer and use it in GitHub Desktop.
Save ondrejsika/744eb802f36c78dd1e1c4ac505fe6932 to your computer and use it in GitHub Desktop.
from git import Repo
from git.util import Actor
import yaml
import os
class GitYamlDb(object):
def __init__(self, data_dir):
self._data_dir = data_dir
self._yamls = {} # {file, yaml}
self._observers = [] # call observers on save
self._repo = None
self._init_repo()
def _init_repo(self):
if os.path.exists(self._data_dir):
self._repo = Repo(self._data_dir)
else:
self._repo = Repo.init(self._data_dir)
def _get_filename(self, filename):
return os.path.join(self._data_dir, '%s.yml' % filename)
def _commit(self, message, name, email):
actor = Actor(name, email)
self._repo.git.add(A=True)
self._repo.index.commit(message,
author=actor,
committer=actor)
def open(self, filename):
if os.path.exists(self._get_filename(filename)):
with open(self._get_filename(filename)) as f:
self._yamls[filename] = yaml.load(f)
else:
self._yamls[filename] = {}
return self._yamls[filename]
def save(self, message, name, email):
for filename, data in self._yamls.items():
if not os.path.exists(os.path.dirname(self._get_filename(filename))):
os.makedirs(os.path.dirname(self._get_filename(filename)))
with open(self._get_filename(filename), 'w') as f:
yaml.dump(data, f, default_flow_style=False)
self._commit(message, name, email)
# Call observers
for observer in self._observers:
observer(self)
db = GitYamlDb('data')
x = db.open('a')
# x['x'].append(len(x['x']))
a = db.open('people/ondrejsika')
a.update({
'name': 'Ondrej Sika',
'email': 'ondrej@sgy.cz',
'headerline': 'Founder & CEO of SGY',
'twitter': 'https://twitter.com/ondrejsika',
'github': 'https://github.com/ondrejsika'
})
a = db.open('people/zuzanajeschkeova')
a.update({
'name': 'Zuzana Jeschkeova',
'email': 'zuzana@sgy.cz',
'headerline': 'Development Teacher',
'twitter': 'https://twitter.com/zuzjes',
'github': 'https://github.com/zuzjes'
})
db.save('[auto] Save', 'Ondrej Sikaa', 'ondrej@sgy.cz')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment