Skip to content

Commit

Permalink
Support embedding binaries in bundle
Browse files Browse the repository at this point in the history
  • Loading branch information
Jc2k committed Mar 8, 2015
1 parent 7a3ccc2 commit a66c92d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
12 changes: 7 additions & 5 deletions fuselage/argument.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,16 @@ def _generate_valid(self):

class File(Argument):

""" Provided with a URL, this can get files by various means. Often used
with the package:// scheme """

def __set__(self, instance, value):
setattr(instance, self.arg_id, value)

def _generate_valid(self):
return '/tmp/foo'
def serialize(self, instance, builder=None):
assert builder
if not hasattr(instance, self.arg_id):
return self.default

with open(getattr(instance, self.arg_id), "rb") as fp:
return builder.add_resource_blob(fp.read())


class PolicyTrigger:
Expand Down
5 changes: 4 additions & 1 deletion fuselage/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import os
import pkgutil
import zipfile
import hashlib


MAIN_PY = """
Expand Down Expand Up @@ -52,8 +53,10 @@ def write_to(cls, fp):
def write_to_path(cls, path):
return cls.write_to(open(path, "wb"))

def add_resource(self, name, payload):
def add_resource_blob(self, payload):
name = hashlib.sha1(payload).hexdigest()
self.zipfile.writestr(os.path.join("assets", name), payload)
return "bundle://" + name

def embed_resource_bundle(self, bundle):
data = bundle.dumps(self)
Expand Down
14 changes: 13 additions & 1 deletion fuselage/providers/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,21 @@ def apply(self):

self.check_path(os.path.dirname(name))

contents = ""
if self.resource.contents:
contents = self.resource.contents
elif self.resource.source:
if self.resource.source.startswith("bundle://"):
import pkgutil
loader = pkgutil.get_loader("fuselage")
contents = loader.get_data("assets/" + self.resource.source[9:])
else:
with open(self.resource.source, "rb") as fp:
contents = fp.read()

fc = EnsureFile(
name,
self.resource.contents, # self.get_file(self.resource.source),
contents,
self.resource.owner,
self.resource.group,
self.resource.mode,
Expand Down

0 comments on commit a66c92d

Please sign in to comment.