summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ricky/dataset/__init__.py0
-rw-r--r--ricky/params/__init__.py107
-rw-r--r--ricky/params/pbbreaker.py59
-rw-r--r--ricky/params/pbgradient.py167
-rw-r--r--ricky/params/pbgrid.py132
-rw-r--r--ricky/params/pbpattern.py25
6 files changed, 490 insertions, 0 deletions
diff --git a/ricky/dataset/__init__.py b/ricky/dataset/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ricky/dataset/__init__.py
diff --git a/ricky/params/__init__.py b/ricky/params/__init__.py
new file mode 100644
index 0000000..5ba90c0
--- /dev/null
+++ b/ricky/params/__init__.py
@@ -0,0 +1,107 @@
+"""base class for all params"""
+import pprint
+import simplejson as json
+import sys
+import os
+from ricky.config import PROBABILITIES_DIR, OFFLINE
+import ricky.utils as utils
+
+
+class Params(object):
+ def __init__(self, *args):
+ self._api = None
+ self._url = None
+ self._params = tuple(args)
+
+ def __getitem__(self, name):
+ """getter for the param by name"""
+ for param in self._params:
+ if param.name == name:
+ return param
+ raise ValueError("No param with name %s\n" % name)
+
+ def __str__(self):
+ """string representation"""
+ return pprint.pformat(self.as_dict())
+
+ def _load_probabilities_json(self, probabilities_file=None):
+ if probabilities_file:
+ filepath = probabilities_file
+ else:
+ filepath = os.path.join(
+ PROBABILITIES_DIR,
+ "%s.json" % (self.api.__class__.__name__)
+ )
+ try:
+ f = open(filepath, 'r')
+ data = f.read()
+ f.close()
+ return json.loads(data)
+ except json.scanner.JSONDecodeError as e:
+ sys.stderr.write("Invalid Json - Problem decoding %s\n" % filepath)
+ sys.stderr.write("%s\n" % e)
+ sys.exit(1)
+ except IOError:
+ sys.stderr.write(
+ "Could not find probabilities file %s\n" % filepath)
+ sys.exit(1)
+
+ def randomize(
+ self,
+ probabilities=None,
+ probabilities_local=False
+ ):
+ """assign random values to all params
+ if using a probabilities.json file, weight is taken
+ into account"""
+ if probabilities:
+ probabilities_dict = self._load_probabilities_json(probabilities)
+ elif probabilities_local:
+ probabilities_dict = self._load_probabilities_json()
+ else:
+ probabilities_dict = {}
+ for param in self._params:
+ param.randomize(probabilities=probabilities_dict.get(param.name))
+
+ @property
+ def api(self):
+ """property setter for im api"""
+ return self._api
+
+ @api.setter
+ def api(self, cls):
+ """property getter for im api"""
+ self._api = cls
+
+ def execute(self):
+ """calls the associated api"""
+ if OFFLINE:
+ sys.path.append("./photoblaster")
+ from photoblaster.modules import Pb as _Pb
+ from photoblaster.config import LOCAL as PBLOCAL
+ for pbcls in _Pb.__subclasses__():
+ if pbcls.__name__ == self.__class__.__name__:
+ params_dict = self.as_dict()
+ instance = pbcls(**params_dict)
+ instance.create()
+ if not PBLOCAL:
+ instance.file_s3move()
+ return instance.file_dict()
+ return json.loads(
+ utils.http_request(self._url, params=self.as_dict())
+ )
+
+ def as_dict(self):
+ """displays the params names and values in dictionary form
+ used by the api call
+ """
+ result = {}
+ for param in self._params:
+ result[param.name] = param.value
+ return result
+
+ def from_dict(self, params_dict):
+ """set param values manually from a dictionary"""
+ for param in self._params:
+ if param.name in params_dict.keys():
+ param.value = params_dict[param.name]
diff --git a/ricky/params/pbbreaker.py b/ricky/params/pbbreaker.py
new file mode 100644
index 0000000..9428b2c
--- /dev/null
+++ b/ricky/params/pbbreaker.py
@@ -0,0 +1,59 @@
+from ricky.params import Params
+from ricky.param.username import Username
+from ricky.param.imageurl import PbageUrl
+from ricky.param.enum import Enum
+from ricky.param.constrainednumber import ConstrainedNumber
+from ricky.param.bool import Bool
+from ricky.config import PBBREAKER_URL
+
+_BREAKTYPE_OPTIONS = [
+ "CLASSIC",
+ "REDUX",
+ "BLURRY_BREAK",
+ "BLURRY_BREAK_2",
+ "SWIPE",
+ "RGB_WASH",
+ "RGB_WASH_2",
+ "NOISY_BREAK",
+ "BROKEN_VIGNETTE",
+ "FAX_MACHINE",
+ "STRIPES",
+ "PHOTOCOPY"
+]
+_BREAKMODE_OPTIONS = [
+ "extreme",
+ "subtle",
+]
+_FINALFORMAT_OPTIONS = [
+ "png",
+ "jpg",
+ "gif",
+]
+
+
+class PbBreaker(Params):
+ def __init__(self):
+ super(Params, self).__init__(
+ Username(name="username", required=False),
+ PbageUrl(name="url", required=True),
+ Enum(
+ name="finalformat",
+ required=False,
+ options=_FINALFORMAT_OPTIONS),
+ Enum(
+ name="breaktype",
+ required=True,
+ options=_BREAKTYPE_OPTIONS),
+ ConstrainedNumber(
+ name="breakangle",
+ required=False,
+ enforce_int=True,
+ min=-180,
+ max=180),
+ Enum(
+ name="breakmode",
+ required=True,
+ options=_BREAKMODE_OPTIONS),
+ Bool(name="expanded", required=False)
+ )
+ self._url = PBBREAKER_URL
diff --git a/ricky/params/pbgradient.py b/ricky/params/pbgradient.py
new file mode 100644
index 0000000..34a960e
--- /dev/null
+++ b/ricky/params/pbgradient.py
@@ -0,0 +1,167 @@
+from ricky.params import Params
+from ricky.param.username import Username
+from ricky.param.enum import Enum
+from ricky.param.constrainednumber import ConstrainedNumber
+from ricky.param.bool import Bool
+from ricky.param.color import Color
+from ricky.config import PBGRADIENT_URL
+
+_HALFTONE_OPTIONS = [
+ "",
+ "checkeredfade",
+ "etchedtransition",
+ "bendaydots",
+ "smallerdots1",
+ "smallerdots2",
+ "flatstripes",
+]
+
+_BEVEL_OPTIONS = [
+ "",
+ "flatout",
+ "flatinner",
+ "evenlyframed",
+ "biginner",
+ "bigouter",
+ "dramaticflatout",
+ "dramaticflatinner",
+]
+
+_FILETYPE_OPTIONS = [
+ "png",
+ "jpg",
+ "gif",
+]
+
+_GRADIENTTYPE_OPTIONS = [
+ "canvas",
+ "gradient",
+ "radial",
+ "colorspace",
+ "plasmawash",
+ "gradientwash",
+ "mirrored",
+ "noise",
+]
+
+
+class PbGradient(Params):
+ def __init__(self):
+ super(PbGradient, self).__init__(
+ Username(name="username", required=False),
+ ConstrainedNumber(
+ name="width",
+ required=True,
+ enforce_int=True,
+ min=10,
+ max=800
+ ),
+ ConstrainedNumber(
+ name="height",
+ required=True,
+ enforce_int=True,
+ min=10,
+ max=800
+ ),
+ Color(name="color1", required=True),
+ Color(name="color2", required=True),
+ Enum(
+ name="filetype",
+ required=False,
+ options=_FILETYPE_OPTIONS
+ ),
+ Enum(
+ name="gradienttype",
+ required=True,
+ options=_GRADIENTTYPE_OPTIONS
+ ),
+ Enum(
+ name="halftone",
+ required=False,
+ options=_HALFTONE_OPTIONS
+ ),
+ Enum(
+ name="bevel",
+ required=False,
+ options=_BEVEL_OPTIONS
+ ),
+ ConstrainedNumber(
+ name="stripenumber",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=400
+ ),
+ ConstrainedNumber(
+ name="stripeintensity",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=5000
+ ),
+ ConstrainedNumber(
+ name="blurriness",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=200
+ ),
+ ConstrainedNumber(
+ name="contrast",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=200
+ ),
+ ConstrainedNumber(
+ name="brightness",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=200
+ ),
+ ConstrainedNumber(
+ name="saturation",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=200
+ ),
+ ConstrainedNumber(
+ name="hue",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=200
+ ),
+ ConstrainedNumber(
+ name="percentbeveled",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=100
+ ),
+ ConstrainedNumber(
+ name="rotate",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=360
+ ),
+ ConstrainedNumber(
+ name="tilt",
+ required=False,
+ enforce_int=True,
+ min=0,
+ max=360
+ ),
+ Bool(
+ name="flop",
+ required=False,
+ ),
+ Bool(
+ name="flip",
+ required=False
+ )
+ )
+ self._url = PBGRADIENT_URL
diff --git a/ricky/params/pbgrid.py b/ricky/params/pbgrid.py
new file mode 100644
index 0000000..6f0702d
--- /dev/null
+++ b/ricky/params/pbgrid.py
@@ -0,0 +1,132 @@
+from ricky.params import Params
+from ricky.param.username import Username
+from ricky.param.imageurl import PbageUrl
+from ricky.param.enum import Enum
+from ricky.param.constrainednumber import ConstrainedNumber
+from ricky.param.color import Color
+from ricky.param.bool import Bool
+from ricky.config import PBGRID_URL
+
+_TRANSITION_OPTIONS = [
+ "background",
+ "dither",
+ "random",
+ "tile",
+ "edge"
+]
+
+_FILETYPE_OPTIONS = [
+ "png",
+ "jpg",
+ "gif",
+]
+
+
+class PbGrid(Params):
+ def __init__(self):
+ super(Params, self).__init__(
+ Username(name="username", required=False),
+ PbageUrl(name="bgimage", required=False),
+ PbageUrl(name="imageinstead", required=False),
+ PbageUrl(name="planebgimage", required=False),
+ Enum(
+ name="format",
+ required=False,
+ options=_FILETYPE_OPTIONS
+ ),
+ Enum(
+ name="transition",
+ required=True,
+ options=_TRANSITION_OPTIONS
+ ),
+ Color(name="skycolor", required=False),
+ Color(name="planebgcolor", required=False),
+ Color(name="bgcolor", required=False),
+ Color(name="linecolor", required=False),
+ ConstrainedNumber(
+ name="swing",
+ required=False,
+ enforce_int=True,
+ min=-170,
+ max=170),
+ ConstrainedNumber(
+ name="tilt",
+ required=False,
+ enforce_int=True,
+ min=-170,
+ max=170),
+ ConstrainedNumber(
+ name="roll",
+ required=False,
+ enforce_int=True,
+ min=-170,
+ max=170),
+ ConstrainedNumber(
+ name="width",
+ required=False,
+ enforce_int=True,
+ min=100,
+ max=800),
+ ConstrainedNumber(
+ name="height",
+ required=False,
+ enforce_int=True,
+ min=100,
+ max=800),
+ ConstrainedNumber(
+ name="linethickness",
+ required=False,
+ enforce_int=True,
+ min=1,
+ max=30
+ ),
+ ConstrainedNumber(
+ name="opacity", required=False, min=0, max=1, prec=2),
+ ConstrainedNumber(
+ name="spacing",
+ enforce_int=True,
+ required=False,
+ min=2,
+ max=100),
+ Bool(name="vlines", required=False),
+ Bool(name="hlines", required=False),
+ Bool(name="trim", required=False),
+ Bool(name="shadow", required=False),
+ ConstrainedNumber(
+ name="zoom",
+ required=False,
+ min=-12,
+ max=12,
+ forbidden_range_min=-1.1,
+ forbidden_range_max=1.1,
+ prec=1
+ )
+ )
+ self._url = PBGRID_URL
+
+ def _test_values(self):
+ return not any([
+ (self.__getitem__('spacing').value >
+ self.__getitem__('width').value),
+ (self.__getitem__('spacing').value >
+ self.__getitem__('height').value),
+ (self.__getitem__('linethickness').value >
+ self.__getitem__('width').value),
+ (self.__getitem__('linethickness').value >
+ self.__getitem__('height').value),
+ ])
+
+ def randomize(self):
+ p = self._params
+ for el in p:
+ if el in ['spacing', 'linethickness']:
+ continue
+ el.randomize()
+ for name in ['spacing', 'linethickness']:
+ max_tries = 10000
+ while(max_tries):
+ self.__getitem__(name).randomize()
+ if self._test_values():
+ return
+ max_tries -= 1
+ raise ValueError
diff --git a/ricky/params/pbpattern.py b/ricky/params/pbpattern.py
new file mode 100644
index 0000000..2b467ef
--- /dev/null
+++ b/ricky/params/pbpattern.py
@@ -0,0 +1,25 @@
+from ricky.params import Params
+from ricky.param.username import Username
+from ricky.param.imageurl import PbageUrl
+from ricky.param.enum import Enum
+from ricky.config import PATTERN_URL_BASE, PBPATTERN_URL
+
+
+class PbPattern(Params):
+ def __init__(self):
+ super(Params, self).__init__(
+ Username(name="username", required=False),
+ PbageUrl(name="image_url", required=True),
+ Enum(
+ name="pattern_url",
+ required=True,
+ options=self._get_pattern_urls()
+ )
+ )
+ self._url = PBPATTERN_URL
+
+ def _get_pattern_urls(self):
+ return set(
+ ["%s/img/%s.png" % (PATTERN_URL_BASE, i) for i in xrange(0, 97)] +
+ ["%s/img/a%s.png" % (PATTERN_URL_BASE, i) for i in xrange(1, 42)]
+ )