def test_process_fields(self): ticket = mock.Mock() issue = { 'title': 'title', 'state': 'New', 'created_at': 'created_at', 'updated_at': 'updated_at', 'assignee': {'login': '******'}, 'user': {'login': '******'}, 'body': 'hello', 'labels': [{'name': 'first'}, {'name': 'second'}], } importer = tracker.GitHubTrackerImporter() importer.github_markdown_converter = GitHubMarkdownConverter( 'user', 'project') extractor = mock.Mock() extractor.urlopen().read.return_value = 'data' with mock.patch.object(tracker, 'datetime') as dt: dt.strptime.side_effect = lambda s, f: s importer.process_fields(extractor, ticket, issue) self.assertEqual(ticket.summary, 'title') self.assertEqual(ticket.description, '*Originally created by:* [creator](https://github.com/creator)\n*Originally owned by:* [owner](https://github.com/owner)\n\nhello') self.assertEqual(ticket.status, 'New') self.assertEqual(ticket.created_date, 'created_at') self.assertEqual(ticket.mod_date, 'updated_at') self.assertEqual(dt.strptime.call_args_list, [ mock.call('created_at', '%Y-%m-%dT%H:%M:%SZ'), mock.call('updated_at', '%Y-%m-%dT%H:%M:%SZ'), ]) self.assertEqual(ticket.labels, ['first', 'second'])
def test_github_markdown_converted_in_comments(self): ticket = mock.Mock() extractor = mock.Mock() body = '''Hello ```python def hello(name): print "Hello, " + name ```''' body_converted = '''*Originally posted by:* [me](https://github.com/me) Hello :::python def hello(name): print "Hello, " + name''' issue = {'comments_url': '/comments'} extractor.iter_comments.return_value = [ { 'body': body, 'created_at': '2013-08-26T16:57:53Z', 'user': {'login': '******'}, } ] importer = tracker.GitHubTrackerImporter() importer.github_markdown_converter = GitHubMarkdownConverter( 'user', 'project') importer.process_comments(extractor, ticket, issue) self.assertEqual(ticket.discussion_thread.add_post.call_args_list[0], mock.call( text=body_converted, timestamp=datetime(2013, 8, 26, 16, 57, 53), ignore_security=True, ))
def import_tool(self, project, user, project_name, mount_point=None, mount_label=None, **kw): import_id_converter = ImportIdConverter.get() project_name = '%s/%s' % (kw['user_name'], project_name) extractor = GitHubProjectExtractor(project_name, user=user) if not extractor.has_tracker(): return app = project.install_app('tickets', mount_point, mount_label, EnableVoting=False, open_status_names='open', closed_status_names='closed', import_id={ 'source': self.source, 'project_name': project_name, }) self.github_markdown_converter = GitHubMarkdownConverter( kw['user_name'], project_name) ThreadLocalORMSession.flush_all() try: M.session.artifact_orm_session._get().skip_mod_date = True with h.push_config(c, user=M.User.anonymous(), app=app): for ticket_num, issue in extractor.iter_issues(): self.max_ticket_num = max(ticket_num, self.max_ticket_num) ticket = TM.Ticket(app_config_id=app.config._id, custom_fields=dict(), ticket_num=ticket_num, import_id=import_id_converter.expand( ticket_num, app)) self.process_fields(extractor, ticket, issue) self.process_comments(extractor, ticket, issue) self.process_events(extractor, ticket, issue) self.process_milestones(ticket, issue) session(ticket).flush(ticket) session(ticket).expunge(ticket) app.globals.custom_fields = self.postprocess_milestones() app.globals.last_ticket_num = self.max_ticket_num ThreadLocalORMSession.flush_all() M.AuditLog.log( 'import tool %s from %s on %s' % (app.config.options.mount_point, project_name, self.source), project=project, user=user, url=app.url) g.post_event('project_updated') app.globals.invalidate_bin_counts() return app finally: M.session.artifact_orm_session._get().skip_mod_date = False
def test_convert_markup(self): importer = GitHubWikiImporter() importer.github_wiki_url = 'https://github.com/a/b/wiki' importer.app = Mock() importer.app.url = '/p/test/wiki/' importer.github_markdown_converter = GitHubMarkdownConverter( 'user', 'proj') f = importer.convert_markup source = '''Look at [[this page|Some Page]] More info at: [[MoreInfo]] [[Even More Info]] Our website is [[http://domain.net]]. '[[Escaped Tag]] ```python codeblock ``` ticket #1 #1 header sha aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa''' result = '''Look at [this page](Some Page) More info at: [MoreInfo] [Even More Info] Our website is <http://domain.net>. [[Escaped Tag]] :::python codeblock ticket [#1] [#1] header sha [aaaaaa]''' assert_equal(f(source, 'test.md').strip(), result) assert_equal(f('h1. Hello', 't.textile').strip(), '# Hello')
def test_github_markdown_converted_in_description(self): ticket = mock.Mock() body = '''Hello ```python def hello(name): print "Hello, " + name ```''' body_converted = '''*Originally created by:* [creator](https://github.com/creator) *Originally owned by:* [owner](https://github.com/owner) Hello :::python def hello(name): print "Hello, " + name''' issue = { 'body': body, 'title': 'title', 'state': 'New', 'created_at': 'created_at', 'updated_at': 'updated_at', 'assignee': { 'login': '******' }, 'user': { 'login': '******' }, 'labels': [{ 'name': 'first' }, { 'name': 'second' }], } importer = tracker.GitHubTrackerImporter() importer.github_markdown_converter = GitHubMarkdownConverter( 'user', 'project') extractor = mock.Mock() extractor.urlopen().read.return_value = 'data' with mock.patch.object(tracker, 'datetime') as dt: dt.strptime.side_effect = lambda s, f: s importer.process_fields(extractor, ticket, issue) self.assertEqual(ticket.description.strip(), body_converted.strip())
def import_tool(self, project, user, project_name=None, mount_point=None, mount_label=None, user_name=None, tool_option=None, **kw): """ Import a GitHub wiki into a new Wiki Allura tool. """ project_name = "%s/%s" % (user_name, project_name) extractor = GitHubProjectExtractor(project_name, user=user) wiki_avail = extractor.has_wiki() # has_wiki only indicates that wiki is enabled, but it does not mean # that it has any pages, so we should check if wiki repo actually # exists wiki_url = extractor.get_page_url('wiki_url') if not wiki_avail or not self.has_wiki_repo(wiki_url): return self.github_wiki_url = extractor.get_page_url('wiki_url').replace( '.wiki', '/wiki') self.app = project.install_app("Wiki", mount_point=mount_point or 'wiki', mount_label=mount_label or 'Wiki', import_id={ 'source': self.source, 'project_name': project_name, }) with_history = tool_option == 'import_history' ThreadLocalORMSession.flush_all() self.github_markdown_converter = GitHubMarkdownConverter( user_name, project_name) try: M.session.artifact_orm_session._get().skip_mod_date = True with h.push_config(c, app=self.app): try: self.import_pages(wiki_url, history=with_history) except git.GitCommandError: log.error( 'Unable to clone GitHub wiki: ' 'wiki_url=%s; ' 'wiki_avail=%s; ' 'avail_url=%s', wiki_url, wiki_avail, extractor.get_page_url('project_info'), exc_info=True) raise ThreadLocalORMSession.flush_all() M.AuditLog.log('import tool %s from %s on %s' % (self.app.config.options.mount_point, project_name, self.source), project=project, user=user, url=self.app.url) g.post_event('project_updated') return self.app except Exception: h.make_app_admin_only(self.app) raise finally: M.session.artifact_orm_session._get().skip_mod_date = False
def setUp(self): self.conv = GitHubMarkdownConverter('user', 'project')