def setUp(self):
     self.domain = AllowedRangeCollection(
         AllowedRange(None, -5.0, 'open'),
         AllowedRange(6.0, None, spacing=3.0),
         AllowedEnum(xrange(-4, 0)),
         AllowedEnum(range(0, 6, 2)),
     )
     self.accepted = ['-inf', -100., -3, 2, 6, 300]
     self.rejected = ['nan', '+inf', 7, 3, -0.5, -5]
示例#2
0
 def setUp(self):
     try:
         # Python 2
         xrange
     except NameError:
         # Python 3, xrange is now named range
         xrange = range
     self.domain = AllowedRangeCollection(
         AllowedRange(None, -5.0, 'open'),
         AllowedRange(6.0, None, spacing=3.0),
         AllowedEnum(xrange(-4, 0)),
         AllowedEnum(range(0, 6, 2)),
     )
     self.accepted = ['-inf', -100., -3, 2, 6, 300]
     self.rejected = ['nan', '+inf', 7, 3, -0.5, -5]
示例#3
0
 def setUp(self):
     self.domain = AllowedRange(time(9, 30, 0, 0),
                                '16:30',
                                'closed',
                                spacing='PT1H',
                                dtype=time)
     self.accepted = ['09:30', '10:30', '15:30', '16:30']
     self.rejected = ['09:00', '10:00', '16:25', '16:35']
示例#4
0
 def setUp(self):
     self.domain = AllowedRange(date(2014, 1, 1),
                                '2014-01-21',
                                'closed',
                                spacing='P5D',
                                dtype=date)
     self.accepted = [
         '2014-01-01', '2014-01-06', '2014-01-16', '2014-01-21'
     ]
     self.rejected = ['2013-12-31', '2014-01-10', '2014-01-31']
示例#5
0
 def setUp(self):
     self.domain = AllowedRange('-P1DT1H', 'P1M0DT30M', dtype=Duration)
     self.accepted = [
         Duration.parse('-P1DT1H'),
         'P0D',
         'P1M0DT30M',
     ]
     self.rejected = [
         Duration.parse('-P2DT18H'),
         'P1Y',
     ]
示例#6
0
 def setUp(self):
     self.domain = AllowedRange('2014-02-01',
                                '2014-03-01',
                                'open',
                                dtype=Date)
     self.accepted = [
         '2014-02-15',
     ]
     self.rejected = [
         '2014-02-01',
         Date.parse('2014-03-01'),
         Date.parse('2014-01-02'),
     ]
示例#7
0
 def setUp(self):
     self.domain = AllowedRange('2014-02-01T09:30:21Z',
                                '2014-03-01T18:20:15Z',
                                dtype=DateTime)
     self.accepted = [
         '2014-02-01T09:30:21Z',
         '2014-02-15T00:00:00Z',
         '2014-03-01T18:20:15Z',
     ]
     self.rejected = [
         '2014-01-01T00:00:00Z',
         DateTime.parse('2014-04-01T00:00:00Z'),
     ]
示例#8
0
 def setUp(self):
     self.domain = AllowedRange(timedelta(0, 3600, 0),
                                'PT5H',
                                'open-closed',
                                spacing='PT1H',
                                dtype=timedelta)
     self.accepted = [
         Duration.parse('PT2H'),
         timedelta(0, 3 * 3600, 0),
         'PT4H',
         'PT5H',
         'PT2H0.000001S',
     ]
     self.rejected = [
         'PT30M',
         'PT1H',
         'PT2H30M',
     ]
示例#9
0
 def setUp(self):
     self.domain = AllowedRange(datetime(2014, 1, 1, 10, 30, 0, 0,
                                         DateTime.UTC),
                                '2014-01-10T10:30Z',
                                'closed',
                                spacing='P1D',
                                dtype=datetime)
     self.accepted = [
         '2014-01-01T10:30Z',
         '2014-01-02T10:30Z',
         '2014-01-05T10:30Z',
         '2014-01-07T10:30Z',
         '2014-01-09T10:30Z',
         '2014-01-10T10:30Z',
     ]
     self.rejected = [
         '2013-12-31T10:30Z',
         '2014-01-01T11:00Z',
         '2014-01-05T00:00Z',
         '2014-01-11T10:30Z',
     ]
示例#10
0
 def setUp(self):
     self.domain = AllowedRange(0, 10, spacing='2', dtype=int)
     self.accepted = [4, 0, 10]
     self.rejected = [5, -1, 12]
示例#11
0
 def setUp(self):
     self.domain = AllowedRange(0.0, 1.0, spacing='0.1')
     self.accepted = [0.5, 0.0, 1.0]
     self.rejected = [0.55, -1.0, 2.0]
示例#12
0
 def setUp(self):
     self.domain = AllowedRange(0.0, 1.0, dtype=float)
     self.accepted = [0.5, 0.0, 1.0]
     self.rejected = [-1.0, 2.0]
示例#13
0
class TestProcess00(Component):
    """ Test identity process (the outputs are copies of the inputs)
    demonstrating various features of the literal data inputs and outputs.
    """
    implements(ProcessInterface)

    identifier = "TC00:identity:literal"
    title = "Test Case 00: Literal data identity."
    metadata = {"test-metadata": "http://www.metadata.com/test-metadata"}
    profiles = ["test_profile"]

    inputs = [
        ("input00", str),  # mandatory minimal string input
        ("input01",
         LiteralData(
             'TC00:input01',
             String,
             optional=True,
             abstract="Optional simple string input.",
         )),
        ("input02",
         LiteralData(
             'TC00:input02',
             str,
             optional=True,
             abstract="Optional enumerated string input with default value.",
             allowed_values=('low', 'medium', 'high'),
             default='medium',
         )),
        ("input03",
         LiteralData(
             'TC00:input03',
             float,
             optional=True,
             title="Distance",
             abstract=
             ("Optional restricted float input with default value and simple "
              "UOM conversion."),
             allowed_values=AllowedRange(0, 2, dtype=float),
             default=0,
             uoms=[
                 ('m', 1.0),
                 ('mm', 1e-3),
                 ('cm', 1e-2),
                 ('dm', 1e-1),
                 ('yd', 0.9144),
                 ('ft', 0.3048),
                 ('in', 0.0254),
                 ('km', 1000.0),
                 ('mi', 1609.344),
                 ('NM', 1852.0),
             ],
         )),
        ("input04",
         LiteralData(
             'TC00:input04',
             float,
             optional=True,
             title="Temperature",
             abstract=(
                 "Optional restricted float input with default value and "
                 "advanced UOM conversion."),
             allowed_values=AllowedRange(0, None, dtype=float),
             default=298.15,
             uoms=(('K', 1.0), UnitLinear('C', 1.0, 273.15),
                   UnitLinear('F', 5.0 / 9.0, 459.67 * 5.0 / 9.0)),
         )),
    ]

    outputs = [
        ("output00", str),  # minimal string output
        (
            "output01",
            LiteralData(
                # NOTE: Outputs can be optional and have default value too.
                'TC00:output01',
                String,
                optional=True,
                default='n/a',
                abstract="Simple string output.",
            )),
        ("output02",
         LiteralData(
             'TC00:output02',
             str,
             abstract="Enumerated string output.",
             allowed_values=('low', 'medium', 'high'),
             default='medium',
         )),
        ("output03",
         LiteralData(
             'TC00:output03',
             float,
             title="Distance",
             abstract="Restricted float output with UOM conversion.",
             allowed_values=AllowedRange(0, 1, dtype=float),
             uoms=[
                 ('m', 1.0),
                 ('mm', 1e-3),
                 ('cm', 1e-2),
                 ('dm', 1e-1),
                 ('yd', 0.9144),
                 ('ft', 0.3048),
                 ('in', 0.0254),
                 ('km', 1000.0),
                 ('mi', 1609.344),
                 ('NM', 1852.0),
             ],
         )),
        ("output04",
         LiteralData(
             'TC00:output04',
             float,
             title="Temperature",
             abstract="Restricted float output advanced UOM conversion.",
             allowed_values=AllowedRange(0, None, dtype=float),
             uoms=(
                 ('K', 1.0),
                 UnitLinear('C', 1.0, 273.15),
                 UnitLinear('F', 5.0 / 9.0, 459.67 * 5.0 / 9.0),
             ),
         )),
    ]

    def execute(self, **inputs):
        """ WPS Process execute handler. """
        return {
            'output00': inputs['input00'],
            'output01': inputs.get('input01'),
            'output02': inputs['input02'],
            'output03': inputs['input03'],
            'output04': inputs['input04'],
        }
示例#14
0
 def setUp(self):
     self.domain = AllowedRange(0, 10, 'open', dtype=Integer)
     self.accepted = [5]
     self.rejected = [0, 10, -1, 12]
示例#15
0
 def setUp(self):
     self.domain = AllowedRange(0, 10, dtype=Integer)
     self.accepted = [0, 5, 10]
     self.rejected = [-1, 12]
示例#16
0
 def setUp(self):
     self.domain = AllowedRange(0.0, 1.0, 'closed-open')
     self.accepted = [0.5, 0.0]
     self.rejected = [1.0, -1.0, 2.0]
示例#17
0
 def setUp(self):
     self.domain = AllowedRange(0.0, None)
     self.accepted = ['+inf', 0.5, 0.0, 1.0, 2.0]
     self.rejected = [-1.0]
示例#18
0
 def setUp(self):
     self.domain = AllowedRange(None, 1.0)
     self.accepted = ['-inf', -1.0, 0.5, 0.0, 1.0]
     self.rejected = [2.0]
示例#19
0
 def setUp(self):
     self.domain = AllowedRange('10:00', '15:30', 'open-closed', dtype=Time)
     self.accepted = ['12:15', '15:30']
     self.rejected = [Time.parse('09:00'), '10:00', '18:12']
示例#20
0
class TestProcess03(Component):
    """ Test process generating binary complex data output. """
    implements(ProcessInterface)

    identifier = "TC03:image_generator:complex"
    title = "Test Case 03: Complex data binary output with format selection."
    description = (
        "Test process generating binary complex data output (an image)."
    )
    metadata = {"test-metadata": "http://www.metadata.com/test-metadata"}
    profiles = ["test_profile"]

    inputs = [
        ("method", LiteralData(
            'TC03:method', str, optional=True,
            title="Complex data output passing method.",
            abstract=(
                "This option controls the method how the complex data output "
                "payload is passed from process code."
            ),
            allowed_values=('in-memory-buffer', 'file'), default='file',
        )),
        ("seed", LiteralData(
            'TC03:seed', int, optional=True, title="Random generator seed.",
            abstract=(
                "Optional random generator seed that can be used to obtain "
                "reproducible random-generated result."
            ),
            allowed_values=AllowedRange(0, None, dtype=int),
        )),
    ]

    outputs = [
        ("output", ComplexData(
            'TC03:output00', title="Test case #02: Complex output #00",
            abstract="Binary complex data output (random-generated image).",
            formats=(
                FormatBinaryRaw('image/png'),
                FormatBinaryBase64('image/png'),
                FormatBinaryRaw('image/jpeg'),
                FormatBinaryBase64('image/jpeg'),
                FormatBinaryRaw('image/tiff'),
                FormatBinaryBase64('image/tiff'),
            )
        )),
    ]

    # NOTE:
    #   The output complex data format has to be handled by the processes
    #   itself and the format selection has to be passed to the 'execute'
    #   subroutine.  The output complex data format selection is passed
    #   to the process as an additional input argument - a simple dictionary
    #   with the 'mime_type', 'encoding', 'schema', and 'as_reference' keywords.
    #   In case no format being selected by the user this format selection
    #   is set to the default format.  The name of the input argument holding
    #   the is controlled by the process output definition.

    @staticmethod
    def execute(method, seed, output):
        # size of the output image
        size_x, size_y = (768, 512)

        # output format selection
        if output['mime_type'] == "image/png":
            extension = ".png"
            driver = gdal.GetDriverByName("PNG")
            options = []
        elif output['mime_type'] == "image/jpeg":
            extension = ".jpg"
            driver = gdal.GetDriverByName("JPEG")
            options = []
        elif output['mime_type'] == "image/tiff":
            extension = ".tif"
            driver = gdal.GetDriverByName("GTiff")
            options = ["TILED=YES", "COMPRESS=DEFLATE", "PHOTOMETRIC=RGB"]
        else:
            ExecuteError("Unexpected output format received! %r" % output)

        # generate a random in-memory GDAL dataset
        mem_driver = gdal.GetDriverByName("MEM")
        mem_ds = mem_driver.Create("", size_x, size_y, 3, gdal.GDT_Byte)
        random_state = RandomState(seed)
        for i in xrange(3):
            mem_ds.GetRasterBand(i+1).WriteArray(
                (256.0 * random_state.rand(size_y, size_x)).astype('uint8')
            )

        # convert in-memory dataset to the desired output
        tmp_filename = os.path.join("/tmp", str(uuid.uuid4()) + extension)
        output_filename = "test03_binary_complex" + extension

        try:
            driver.CreateCopy(tmp_filename, mem_ds, 0, options)
            del mem_ds

            if method == 'file':
                # Return object as a temporary Complex Data File.
                # None that the object holds the format attributes!
                # The 'filename' parameter sets the raw output
                # 'Content-Disposition: filename=' HTTP header.
                return CDFile(tmp_filename, filename=output_filename, **output)

            elif method == 'in-memory-buffer':
                # Return object as an in-memory Complex Data Buffer.
                # None that the object holds the format attributes!
                # The 'filename' parameter sets the raw output
                # 'Content-Disposition: filename=' HTTP header.
                with open(tmp_filename, 'rb') as fid:
                    _output = CDByteBuffer(
                        fid.read(), filename=output_filename, **output
                    )
                os.remove(tmp_filename)
                return _output
        except:
            # make sure no temporary file is left in case of an exception
            if os.path.isfile(tmp_filename):
                os.remove(tmp_filename)
            raise