Created
November 21, 2016 07:54
-
-
Save nkanaev/ac9ca45853083c3ae48b77b0a7d99d57 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
from collections import OrderedDict | |
class Pipfile(object): | |
def __init__(self, filename='Pipfile'): | |
self.filename = filename | |
self.sources = [] | |
self.groups = OrderedDict({ | |
'default': [] | |
}) | |
self.group_stack = ['default'] | |
def parse(self): | |
with open(self.filename) as f: | |
content = f.read() | |
exec(content, {'__builtins__': None}, self._locals) | |
data = OrderedDict({ | |
'_meta': { | |
'sources': self.sources, | |
}, | |
}) | |
data.update(self.groups) | |
return data | |
@property | |
def _locals(self): | |
return { | |
'source': self.add_source, | |
'package': self.add_package, | |
'group': self.set_group, | |
'True': True, | |
'False': False, | |
} | |
def add_source(self, url, **kwargs): | |
source = OrderedDict({'url': url}) | |
source.update(kwargs) | |
self.sources.append(source) | |
@property | |
def current_group(self): | |
return self.group_stack[-1] | |
def add_package(self, name, version=None, **kwargs): | |
package = OrderedDict() | |
package['name'] = name | |
if version: | |
package['version'] = version | |
package.update(kwargs) | |
self.groups[self.current_group].append(package) | |
def set_group(self, name): | |
self.group_stack.append(name) | |
self.groups[name] = [] | |
return self | |
def __enter__(self): | |
pass | |
def __exit__(self, type, value, traceback): | |
self.group_stack.pop() | |
pipfile = Pipfile() | |
data = pipfile.parse() | |
print json.dumps(data, indent=4) |
this looks great! can you submit it to the repo as a PR (for licensing reasons) so we can start playing with it?
sure
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
it works for the example file (though I'm not 100% sure how it will behave in production-ready environments). Environment for the Pipfile is very strict (no builtins) right now