Example #1
0
class TestCase(unittest.TestCase):
    def create_rev(self):
        p = Socrata(auth)
        (ok, r) = self.view.revisions.create_update_revision()
        assert ok
        self.rev = r
        return r

    def create_input_schema(self, rev=None, filename='simple.csv'):
        if not rev:
            rev = self.create_rev()
        (ok, source) = rev.create_upload('foo.csv')
        assert ok
        with open('test/fixtures/%s' % filename, 'rb') as f:
            (ok, source) = source.csv(f)
            assert ok, source
            return source.get_latest_input_schema()

    def create_output_schema(self, input_schema=None):
        if not input_schema:
            input_schema = self.create_input_schema()

        (ok, output_schema) = input_schema.transform({
            'output_columns': [{
                "field_name": "b",
                "display_name": "b, but as a number",
                "position": 0,
                "description": "b but with a bunch of errors",
                "transform": {
                    "transform_expr": "to_number(b)"
                }
            }]
        })
        assert ok
        return output_schema

    def setUp(self):
        self.pub = Socrata(auth)
        (ok, rev) = self.pub.new({'name': 'test-view'})
        assert ok, rev
        self.rev = rev
        (ok, view) = self.pub.views.lookup(rev.attributes['fourfour'])
        assert ok, view
        self.view = view

    def tearDown(self):
        if getattr(self, 'rev', False):
            self.rev.discard()
        self.view.delete()
class SocrataDataset(object):
    def __init__(self, uuid=None, mq_fp=None, auth_param=auth_param):
        self.existing_dataset = bool(uuid)
        self.uuid = uuid
        self.mq_fp = mq_fp
        self.auth_param = auth_param
        self.socrata = Socrata(Authorization(*auth_param))
        self.mq = None
        self.metadata = None

        if mq_fp:
            self.mq = ITSMetadataQuestionnaire(mq_fp)
        self.retrieve_metadata()

    def generate_dataset_url(self):
        return 'https://{}/d/{}'.format(self.auth_param[0], self.uuid)

    def retrieve_metadata(self):
        if self.uuid:
            url = 'https://{}/api/views/metadata/v1/{}'.format(
                self.auth_param[0], self.uuid)
            r = requests.get(url, auth=self.auth_param[1:])
            self.metadata = r.json()
        return

    def create_dataset(self):
        if self.uuid is None:

            # NOTE: publishing this way seems to default to creating integrated data set only
            # TODO: modify so that we can publish external datasets
            # TODO: fix permission - right now it's published as public data set

            revision_json = self.mq.generate_dtg_metadata()
            revision_json.update(
                {'action': {
                    'type': 'update',
                    'permission': 'private'
                }})

            (ok, revision) = self.socrata.new(revision_json)
            (ok, job) = revision.apply()
            (ok, job) = job.wait_for_finish(progress=lambda job: print(
                'Job progress:', job.attributes['status']))
            self.uuid = revision.view_id()
            print('Dataset has been created at {}'.format(
                self.generate_dataset_url()))
        else:
            print('Dataset already exists at {}'.format(
                self.generate_dataset_url()))
        return

    def update_metadata(self):
        if self.uuid:
            url = 'https://{}/api/views/metadata/v1/{}'.format(
                self.auth_param[0], self.uuid)
            response = requests.patch(url,
                                      auth=self.auth_param[1:],
                                      data=json.dumps(
                                          self.mq.generate_dtg_metadata()))
            if response.status_code != 200:
                print(response)
            else:
                print('Metadata updated for {}'.format(
                    self.generate_dataset_url()))