utils.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # utils.py -- Test utilities for Dulwich.
  2. # Copyright (C) 2010 Google, Inc.
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; version 2
  7. # of the License or (at your option) any later version of
  8. # the License.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18. # MA 02110-1301, USA.
  19. """Utility functions common to Dulwich tests."""
  20. import datetime
  21. import os
  22. import shutil
  23. import tempfile
  24. import time
  25. from dulwich.objects import Commit
  26. from dulwich.repo import Repo
  27. def open_repo(name):
  28. """Open a copy of a repo in a temporary directory.
  29. Use this function for accessing repos in dulwich/tests/data/repos to avoid
  30. accidentally or intentionally modifying those repos in place. Use
  31. tear_down_repo to delete any temp files created.
  32. :param name: The name of the repository, relative to
  33. dulwich/tests/data/repos
  34. :returns: An initialized Repo object that lives in a temporary directory.
  35. """
  36. temp_dir = tempfile.mkdtemp()
  37. repo_dir = os.path.join(os.path.dirname(__file__), 'data', 'repos', name)
  38. temp_repo_dir = os.path.join(temp_dir, name)
  39. shutil.copytree(repo_dir, temp_repo_dir, symlinks=True)
  40. return Repo(temp_repo_dir)
  41. def tear_down_repo(repo):
  42. """Tear down a test repository."""
  43. temp_dir = os.path.dirname(repo.path.rstrip(os.sep))
  44. shutil.rmtree(temp_dir)
  45. def make_object(cls, **attrs):
  46. """Make an object for testing and assign some members.
  47. This method creates a new subclass to allow arbitrary attribute
  48. reassignment, which is not otherwise possible with objects having __slots__.
  49. :param attrs: dict of attributes to set on the new object.
  50. :return: A newly initialized object of type cls.
  51. """
  52. class TestObject(cls):
  53. """Class that inherits from the given class, but without __slots__.
  54. Note that classes with __slots__ can't have arbitrary attributes monkey-
  55. patched in, so this is a class that is exactly the same only with a
  56. __dict__ instead of __slots__.
  57. """
  58. pass
  59. obj = TestObject()
  60. for name, value in attrs.iteritems():
  61. setattr(obj, name, value)
  62. return obj
  63. def make_commit(**attrs):
  64. """Make a Commit object with a default set of members.
  65. :param attrs: dict of attributes to overwrite from the default values.
  66. :return: A newly initialized Commit object.
  67. """
  68. default_time = int(time.mktime(datetime.datetime(2010, 1, 1).timetuple()))
  69. all_attrs = {'author': 'Test Author <test@nodomain.com>',
  70. 'author_time': default_time,
  71. 'author_timezone': 0,
  72. 'committer': 'Test Committer <test@nodomain.com>',
  73. 'commit_time': default_time,
  74. 'commit_timezone': 0,
  75. 'message': 'Test message.',
  76. 'parents': [],
  77. 'tree': '0' * 40}
  78. all_attrs.update(attrs)
  79. return make_object(Commit, **all_attrs)