docs: def generate(self, src=None, identifier=None):
          """Generate static files for one source image."""
          self.src = src
          self.identifier = identifier
          # Get image details and calculate tiles
          im = self.manipulator_klass()
          im.srcfile = self.src
          im.set_max_image_pixels(self.max_image_pixels)
          im.do_first()
          width = im.width
          height = im.height
          scale_factors = im.scale_factors(self.tilesize)
          # Setup destination and IIIF identifier
          self.setup_destination()
          # Write out images
          for (region, size) in static_partial_tile_sizes(width, height, self.tilesize, scale_factors):
              self.generate_tile(region, size)
          sizes = []
          for size in static_full_sizes(width, height, self.tilesize):
              # See https://github.com/zimeon/iiif/issues/9
              sizes.append({'width': size[0], 'height': size[1]})
              self.generate_tile('full', size)
          for request in self.extras:
              request.identifier = self.identifier
              if (request.is_scaled_full_image()):
                  sizes.append({'width': request.size_wh[0],
                                'height': request.size_wh[1]})
              self.generate_file(request)
          # Write info.json
          qualities = ['default'] if (self.api_version > '1.1') else ['native']
          info = IIIFInfo(level=0, server_and_prefix=self.prefix, identifier=self.identifier,
                          width=width, height=height, scale_factors=scale_factors,
                          tile_width=self.tilesize, tile_height=self.tilesize,
                          formats=['jpg'], qualities=qualities, sizes=sizes,
                          api_version=self.api_version)
          json_file = os.path.join(self.dst, self.identifier, 'info.json')
          if (self.dryrun):
              self.logger.warning(
                  "dryrun mode, would write the following files:")
              self.logger.warning("%s / %s/%s" %
                                  (self.dst, self.identifier, 'info.json'))
          else:
              with open(json_file, 'w') as f:
                  f.write(info.as_json())
                  f.close()
              self.logger.info("%s / %s/%s" %
                               (self.dst, self.identifier, 'info.json'))
              self.logger.debug("Written %s" % (json_file))