예제 #1
0
파일: cli.py 프로젝트: kindly/ckantest
  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)
예제 #2
0
  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)
예제 #3
0
파일: cli.py 프로젝트: kindly/ckantest
 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)
예제 #4
0
 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)
예제 #5
0
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]
예제 #6
0
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]
예제 #7
0
파일: rest.py 프로젝트: okfn/ckan-old
    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('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;\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