def diff(self): if len(self.args) > 2: changeset_id1 = unicode(self.args[1]) changeset_id2 = unicode(self.args[2]) elif len(self.args) > 1: working_changeset = self.get_working_changeset() if not working_changeset: print "There is no working changeset." sys.exit(1) print "Displaying changes from the working changeset (without any outstanding revisions)..." changeset_id1 = working_changeset.id changeset_id2 = unicode(self.args[1]) else: # Todo: Calc changes for outstanding revisions. print "Sorry, displaying changes of uncommitted revisions is not yet supported." print "" print "Providing one target changeset will display the changes from the working changeset. Providing two target changesets will display the sum of changes between the first and the second target." sys.exit(1) from ckan.model.changeset import NoIntersectionException from ckan.model.changeset import ChangesetRegister, Route, Reduce register = ChangesetRegister() changeset1 = register.get(changeset_id1, None) if not changeset1: print "Changeset '%s' not found." % changeset_id1 sys.exit(1) changeset2 = register.get(changeset_id2, None) if not changeset2: print "Changeset '%s' not found." % changeset_id2 sys.exit(1) route = Route(changeset1, changeset2) try: changes = route.calc_changes() # Todo: Calc and sum with changes for outstanding revisions. changes = Reduce(changes).calc_changes() except NoIntersectionException: print "The changesets '%s' and '%s' are not on intersecting lines." % ( changeset_id1, changeset_id2 ) else: print "diff %s %s" % (changeset_id1, changeset_id2) self.print_changes(changes)
def diff(self): if len(self.args) > 2: changeset_id1 = unicode(self.args[1]) changeset_id2 = unicode(self.args[2]) elif len(self.args) > 1: working_changeset = self.get_working_changeset() if not working_changeset: print "There is no working changeset." sys.exit(1) print "Displaying changes from the working changeset (without any outstanding revisions)..." changeset_id1 = working_changeset.id changeset_id2 = unicode(self.args[1]) else: # Todo: Calc changes for outstanding revisions. print "Sorry, displaying changes of uncommitted revisions is not yet supported." print "" print "Providing one target changeset will display the changes from the working changeset. Providing two target changesets will display the sum of changes between the first and the second target." sys.exit(1) from ckan.model.changeset import NoIntersectionException from ckan.model.changeset import ChangesetRegister, Route, Reduce register = ChangesetRegister() changeset1 = register.get(changeset_id1, None) if not changeset1: print "Changeset '%s' not found." % changeset_id1 sys.exit(1) changeset2 = register.get(changeset_id2, None) if not changeset2: print "Changeset '%s' not found." % changeset_id2 sys.exit(1) route = Route(changeset1, changeset2) try: changes = route.calc_changes() # Todo: Calc and sum with changes for outstanding revisions. changes = Reduce(changes).calc_changes() except NoIntersectionException: print "The changesets '%s' and '%s' are not on intersecting lines." % ( changeset_id1, changeset_id2 ) else: print "diff %s %s" % (changeset_id1, changeset_id2) self.print_changes(changes)
def heads(self): from ckan.model.changeset import Heads from ckan.model.changeset import ChangesetRegister print "Most recent changeset for each active line:" ids = Heads().ids() ids.reverse() # Ordered by timestamp. changeset_register = ChangesetRegister() for id in ids: head = changeset_register.get(id) print "" self.log_changeset(head)
def heads(self): from ckan.model.changeset import Heads from ckan.model.changeset import ChangesetRegister print "Most recent changeset for each active line:" ids = Heads().ids() ids.reverse() # Ordered by timestamp. changeset_register = ChangesetRegister() for id in ids: head = changeset_register.get(id) print "" self.log_changeset(head)
class TestChangesetRegister(TestCase): def setup(self): super(TestChangesetRegister, self).setup() self.changesets = ChangesetRegister() self.revisions = RevisionRegister() self.packages = PackageRegister() self.changes = ChangeRegister() def teardown(self): self.changesets = None for name in [u'annie', u'annie1', u'annie2']: annie = self.packages.get(name, None, attr='name') if annie: annie.purge() model.Session.commit() model.Session.remove() super(TestChangesetRegister, self).teardown() def test_commit(self): revision_id = self.build_creating_revision() revision = self.revisions[revision_id] changeset_ids = self.changesets.commit() working = self.changesets.get_working() self.assert_true(working) self.assert_equal(len(changeset_ids), 2) changeset0 = self.changesets.get(changeset_ids[0]) self.assert_false(changeset0.is_working) changeset1 = self.changesets.get(changeset_ids[1]) self.assert_true(changeset1.is_working) self.assert_equal(changeset0.id, changeset1.follows_id) def test_update(self): self.assert_false(self.changesets.get_working()) changeset_id = self.build_creating_changeset() self.assert_raises(UncommittedChangesException, self.changesets.update) new_changeset_ids = self.changesets.commit() self.assert_equal(len(new_changeset_ids), 1) self.assert_raises(WorkingAtHeadException, self.changesets.update) self.assert_true(self.changesets.get_working()) self.assert_equal(self.changesets.get_working().id, new_changeset_ids[0]) changeset_id = self.build_creating_changeset('1', follows_id=self.changesets.get_working().id) self.assert_equal(len(self.packages), 0) report = {} self.changesets.update(report=report) # Check changesets have been applied. self.assert_equal(len(report['created']), 1) self.assert_equal(len(self.packages), 1) self.assert_equal(self.changesets.get_working().id, changeset_id) self.assert_raises(WorkingAtHeadException, self.changesets.update) def test_construct_from_revision(self): revision_id = self.build_creating_revision() revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_creating_revision('1') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_updating_revision('', 'and also') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_updating_revision('1', 'and now') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) data = changeset.as_dict() self.assert_true(data['id']) self.assert_true(data['meta']) self.assert_true(data['changes']) meta = data['meta'] self.assert_true('log_message' in meta) self.assert_true('author' in meta) self.assert_true('timestamp' in meta) changes = data['changes'] self.assert_true(changes[0]['ref']) self.assert_true(changes[0]['diff']) diff = changes[0]['diff'] self.assert_true(diff['new']) self.assert_true(diff['old']) def test_conflict(self): self.assert_equal(len(self.packages), 0) changeset_id = self.build_creating_changeset() changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 1) changeset_id = self.build_creating_changeset("1") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 2) changeset_id = self.build_conflicting_changeset("", "orig", "corr") changeset = self.changesets[changeset_id] self.assert_true(changeset.is_conflicting()) self.assert_false(changeset.revision_id) self.assert_raises(ConflictException, changeset.apply) self.assert_false(changeset.revision_id) revision_id = changeset.apply(is_forced=True) revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "closed-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_conflicting_changeset("1", "orig", "corr") changeset = self.changesets[changeset_id] self.assert_true(changeset.is_conflicting()) self.assert_false(changeset.revision_id) self.assert_raises(ConflictException, changeset.apply) self.assert_false(changeset.revision_id) revision_id = changeset.apply(is_forced=True) revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "closed-corr") def test_apply(self): self.assert_equal(len(self.packages), 0) changeset_id = self.build_creating_changeset() changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 1) changeset_id = self.build_creating_changeset("1") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("", "orig", "corr") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "open-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("1", "orig", "corr") count_before = len(self.revisions) changeset = self.changesets[changeset_id] self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "open-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("", "corr", "draft") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (draft)") self.assert_equal(package.license_id, "open-draft") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("1", "corr", "draft") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (draft)") self.assert_equal(package.license_id, "open-draft") self.assert_equal(len(self.packages), 2) def build_creating_revision(self, mark=''): revision = self.revisions.create_entity(author=u'test', log_message=u'test') package = self.packages.create_entity(name=u'annie%s'%mark, title=u'Annie Get Your Coat (%s)'%mark) model.Session.add(package) model.Session.commit() model.Session.remove() setup_default_user_roles(package, []) self.assert_true(revision.id) self.assert_true(package.id) self.assert_true(revision.packages) return revision.id def build_updating_revision(self, mark='', vary_new=''): revision = self.revisions.create_entity(author=u'test', log_message=u'test') package = self.packages.get(u'annie%s'%mark, attr="name") package.title = u'Annie Get Your Coat (%s)' % vary_new model.Session.commit() model.Session.remove() self.assert_true(revision.id) self.assert_true(package.id) self.assert_true(revision.packages) return revision.id def build_creating_changeset(self, mark='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) vary = 'orig' diff = u"""{ "old": null, "new": { "name": "annie%s", "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" } }""" % (mark, vary, vary) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() assert changeset.id return changeset.id def build_updating_changeset(self, mark='', vary_old='', vary_new='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) diff = u"""{ "old": { "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" }, "new": { "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" } }""" % (vary_old, vary_old, vary_new, vary_new) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() return changeset.id def build_conflicting_changeset(self, mark='', vary_old='', vary_new='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) diff = u"""{ "old": { "title": "Annie Get Your Coat (%s)", "license_id": "closed-%s" }, "new": { "title": "Annie Get Your Coat (%s)", "license_id": "closed-%s" } }""" % (vary_old, vary_old, vary_new, vary_new) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() return changeset.id def test_add_unseen(self): changeset_data = { "id": "8772c628-435e-4896-ad04-514aab3d0d10", "meta": {}, "changes": [ { "ref": "/package/4662c628-435e-4896-ad04-514aab3d0e66", "diff": { "new": { "name": "coat", "title": "Annie Get Your Coat", "license_id": "abcd3" }, "old": {} }, } ] } changeset_id = self.changesets.add_unseen(changeset_data) changeset = ChangesetRegister()[changeset_id]
class TestChangesetRegister(TestCase): def setup(self): super(TestChangesetRegister, self).setup() self.changesets = ChangesetRegister() self.revisions = RevisionRegister() self.packages = PackageRegister() self.changes = ChangeRegister() def teardown(self): self.changesets = None for name in [u'annie', u'annie1', u'annie2']: annie = self.packages.get(name, None, attr='name') if annie: annie.purge() model.Session.commit() model.Session.remove() super(TestChangesetRegister, self).teardown() def test_commit(self): revision_id = self.build_creating_revision() revision = self.revisions[revision_id] changeset_ids = self.changesets.commit() working = self.changesets.get_working() self.assert_true(working) self.assert_equal(len(changeset_ids), 2) changeset0 = self.changesets.get(changeset_ids[0]) self.assert_false(changeset0.is_working) changeset1 = self.changesets.get(changeset_ids[1]) self.assert_true(changeset1.is_working) self.assert_equal(changeset0.id, changeset1.follows_id) def test_update(self): self.assert_false(self.changesets.get_working()) changeset_id = self.build_creating_changeset() self.assert_raises(UncommittedChangesException, self.changesets.update) new_changeset_ids = self.changesets.commit() self.assert_equal(len(new_changeset_ids), 1) self.assert_raises(WorkingAtHeadException, self.changesets.update) self.assert_true(self.changesets.get_working()) self.assert_equal(self.changesets.get_working().id, new_changeset_ids[0]) changeset_id = self.build_creating_changeset( '1', follows_id=self.changesets.get_working().id) self.assert_equal(len(self.packages), 0) report = {} self.changesets.update(report=report) # Check changesets have been applied. self.assert_equal(len(report['created']), 1) self.assert_equal(len(self.packages), 1) self.assert_equal(self.changesets.get_working().id, changeset_id) self.assert_raises(WorkingAtHeadException, self.changesets.update) def test_construct_from_revision(self): revision_id = self.build_creating_revision() revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_creating_revision('1') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_updating_revision('', 'and also') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) revision_id = self.build_updating_revision('1', 'and now') revision = self.revisions[revision_id] changeset_id = self.changesets.construct_from_revision(revision) changeset = self.changesets.get(changeset_id) self.assert_isinstance(changeset, Changeset) self.assert_true(changeset.revision_id) self.assert_true(changeset.changes) data = changeset.as_dict() self.assert_true(data['id']) self.assert_true(data['meta']) self.assert_true(data['changes']) meta = data['meta'] self.assert_true('log_message' in meta) self.assert_true('author' in meta) self.assert_true('timestamp' in meta) changes = data['changes'] self.assert_true(changes[0]['ref']) self.assert_true(changes[0]['diff']) diff = changes[0]['diff'] self.assert_true(diff['new']) self.assert_true(diff['old']) def test_conflict(self): self.assert_equal(len(self.packages), 0) changeset_id = self.build_creating_changeset() changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 1) changeset_id = self.build_creating_changeset("1") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 2) changeset_id = self.build_conflicting_changeset("", "orig", "corr") changeset = self.changesets[changeset_id] self.assert_true(changeset.is_conflicting()) self.assert_false(changeset.revision_id) self.assert_raises(ConflictException, changeset.apply) self.assert_false(changeset.revision_id) revision_id = changeset.apply(is_forced=True) revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "closed-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_conflicting_changeset("1", "orig", "corr") changeset = self.changesets[changeset_id] self.assert_true(changeset.is_conflicting()) self.assert_false(changeset.revision_id) self.assert_raises(ConflictException, changeset.apply) self.assert_false(changeset.revision_id) revision_id = changeset.apply(is_forced=True) revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "closed-corr") def test_apply(self): self.assert_equal(len(self.packages), 0) changeset_id = self.build_creating_changeset() changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 1) changeset_id = self.build_creating_changeset("1") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (orig)") self.assert_equal(package.license_id, "open-orig") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("", "orig", "corr") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "open-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("1", "orig", "corr") count_before = len(self.revisions) changeset = self.changesets[changeset_id] self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (corr)") self.assert_equal(package.license_id, "open-corr") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("", "corr", "draft") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d10") self.assert_equal(package.name, "annie") self.assert_equal(package.title, "Annie Get Your Coat (draft)") self.assert_equal(package.license_id, "open-draft") self.assert_equal(len(self.packages), 2) changeset_id = self.build_updating_changeset("1", "corr", "draft") changeset = self.changesets[changeset_id] count_before = len(self.revisions) self.assert_false(changeset.revision_id) revision_id = changeset.apply() revision = self.revisions[revision_id] self.assert_true(changeset.revision_id) count_after = len(self.revisions) self.assert_isinstance(revision, model.Revision) self.assert_equal(count_after - count_before, 1) self.assert_true(revision.packages) package = revision.packages[0] self.assert_equal(package.id, "5872c628-435e-4896-ad04-514aab3d0d11") self.assert_equal(package.name, "annie1") self.assert_equal(package.title, "Annie Get Your Coat (draft)") self.assert_equal(package.license_id, "open-draft") self.assert_equal(len(self.packages), 2) def build_creating_revision(self, mark=''): revision = self.revisions.create_entity(author=u'test', log_message=u'test') package = self.packages.create_entity( name=u'annie%s' % mark, title=u'Annie Get Your Coat (%s)' % mark) model.Session.add(package) model.Session.commit() model.Session.remove() setup_default_user_roles(package, []) self.assert_true(revision.id) self.assert_true(package.id) self.assert_true(revision.packages) return revision.id def build_updating_revision(self, mark='', vary_new=''): revision = self.revisions.create_entity(author=u'test', log_message=u'test') package = self.packages.get(u'annie%s' % mark, attr="name") package.title = u'Annie Get Your Coat (%s)' % vary_new model.Session.commit() model.Session.remove() self.assert_true(revision.id) self.assert_true(package.id) self.assert_true(revision.packages) return revision.id def build_creating_changeset(self, mark='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) vary = 'orig' diff = u"""{ "old": null, "new": { "name": "annie%s", "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" } }""" % (mark, vary, vary) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() assert changeset.id return changeset.id def build_updating_changeset(self, mark='', vary_old='', vary_new='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) diff = u"""{ "old": { "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" }, "new": { "title": "Annie Get Your Coat (%s)", "license_id": "open-%s" } }""" % (vary_old, vary_old, vary_new, vary_new) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() return changeset.id def build_conflicting_changeset(self, mark='', vary_old='', vary_new='', follows_id=None): id = u"5872c628-435e-4896-ad04-514aab3d0d10" if mark: assert len(mark) == 1 id = list(id) id[-1] = mark id = u"".join(id) diff = u"""{ "old": { "title": "Annie Get Your Coat (%s)", "license_id": "closed-%s" }, "new": { "title": "Annie Get Your Coat (%s)", "license_id": "closed-%s" } }""" % (vary_old, vary_old, vary_new, vary_new) ref = u"/package/%s" % id change = self.changes.create_entity(diff=diff, ref=ref) changeset = self.changesets.create_entity( follows_id=follows_id, changes=[change], ) model.Session.add(changeset) model.Session.commit() return changeset.id def test_add_unseen(self): changeset_data = { "id": "8772c628-435e-4896-ad04-514aab3d0d10", "meta": {}, "changes": [{ "ref": "/package/4662c628-435e-4896-ad04-514aab3d0e66", "diff": { "new": { "name": "coat", "title": "Annie Get Your Coat", "license_id": "abcd3" }, "old": {} }, }] } changeset_id = self.changesets.add_unseen(changeset_data) changeset = ChangesetRegister()[changeset_id]
def show(self, register, id, subregister=None, id2=None): log.debug('show %s/%s/%s/%s' % (register, id, subregister, id2)) if register == u'revision': # Todo: Implement access control for revisions. rev = model.Session.query(model.Revision).get(id) if rev is None: response.status_int = 404 return '' response_data = { 'id': rev.id, 'timestamp': model.strftimestamp(rev.timestamp), 'author': rev.author, 'message': rev.message, 'packages': self._list_package_refs(rev.packages), } return self._finish_ok(response_data) elif register == u'changeset': from ckan.model.changeset import ChangesetRegister changesets = ChangesetRegister() changeset = changesets.get(id, None) #if not self._check_access(changeset, model.Action.READ): # return '' if changeset is None: response.status_int = 404 return '' response_data = changeset.as_dict() return self._finish_ok(response_data) elif register == u'package' and not subregister: pkg = self._get_pkg(id) if pkg == None: response.status_int = 404 return '' if not self._check_access(pkg, model.Action.READ): return '' for item in PluginImplementations(IPackageController): item.read(pkg) response_data = self._represent_package(pkg) return self._finish_ok(response_data) elif register == u'package' and (subregister == 'relationships' or subregister in model.PackageRelationship.get_all_types()): pkg1 = self._get_pkg(id) pkg2 = self._get_pkg(id2) if not pkg1: response.status_int = 404 return 'First package named in address was not found.' if not pkg2: response.status_int = 404 return 'Second package named in address was not found.' if subregister == 'relationships': relationships = pkg1.get_relationships_with(pkg2) else: relationships = pkg1.get_relationships_with(pkg2, type=subregister) if not relationships: response.status_int = 404 return 'Relationship "%s %s %s" not found.' % \ (id, subregister, id2) response_data = [rel.as_dict(pkg1, ref_package_by=self.ref_package_by) for rel in relationships] return self._finish_ok(response_data) elif register == u'group': group = model.Group.by_name(id) if group is None: response.status_int = 404 return '' if not self._check_access(group, model.Action.READ): return '' for item in PluginImplementations(IGroupController): item.read(group) _dict = group.as_dict(ref_package_by=self.ref_package_by) #TODO check it's not none return self._finish_ok(_dict) elif register == u'tag': obj = model.Tag.by_name(id) #TODO tags if obj is None: response.status_int = 404 return '' response_data = [pkgtag.package.name for pkgtag in obj.package_tags] return self._finish_ok(response_data) elif register == u'harvestsource': obj = model.HarvestSource.get(id, default=None) if obj is None: response.status_int = 404 return '' response_data = obj.as_dict() return self._finish_ok(response_data) elif register == u'harvesteddocument': objs = model.Session.query(model.HarvestedDocument).filter(model.HarvestedDocument.guid==id) if not objs: response.status_int = 404 return '' obj = objs[0] if not subregister: response_data = obj.as_dict() return self._finish_ok(response_data) elif subregister == 'xml': response_data = obj.as_dict()['content'] response.headers['Content-Type'] = 'text/xml' response.status_int = 200 response.charset = 'utf-8' return response_data elif subregister == 'html': d = obj.as_dict() content = { 'html': d['content'].replace('&', '&').replace('<', '<').replace('>', '>\n'), 'title': d['id'], } response_data = ''' <html> <head> <title>Harvested Document %(title)s</title> </head> <body> <h1>Harvested Document %(title)s</h1> <pre style="background: #ffc">%(html)s</pre> </body> </html> ''' % content response.headers['Content-Type'] = 'text/html' response.status_int = 200 response.charset = 'utf-8' return response_data else: response.status_int = 404 return '' elif register == u'harvestingjob': obj = model.HarvestingJob.get(id, default=None) if obj is None: response.status_int = 404 return '' response_data = obj.as_dict() return self._finish_ok(response_data) else: response.status_int = 400 return gettext('Cannot read entity of this type: %s') % register