def get_pull_requests( start_date: datetime.datetime, end_date: datetime.datetime, max_pull_requests: int = sys.maxsize, repo_name: str = 'PennyDreadfulMTG/Penny-Dreadful-Tools' ) -> List[PullRequest.PullRequest]: gh_user = configuration.get_optional_str('github_user') gh_pass = configuration.get_optional_str('github_password') if gh_user is None or gh_pass is None: return [] g = Github(gh_user, gh_pass) git_repo = g.get_repo(repo_name) pulls: List[PullRequest] = [] try: for pull in git_repo.get_pulls(state='closed', sort='updated', direction='desc'): if not pull.merged_at: continue pull.merged_dt = dtutil.UTC_TZ.localize(pull.merged_at) pull.updated_dt = dtutil.UTC_TZ.localize(pull.updated_at) if pull.merged_dt > end_date: continue if pull.updated_dt < start_date: return pulls pulls.append(pull) if len(pulls) >= max_pull_requests: return pulls except RequestException as e: print('Github pulls error', e) return pulls
def __init__(self, import_name: str) -> None: shared_web_path = os.path.abspath(os.path.dirname(__file__)) static_folder = os.path.join(shared_web_path, 'static') super().__init__(import_name, static_folder=static_folder) super().register_error_handler(DoesNotExistException, self.not_found) super().register_error_handler(exceptions.NotFound, self.not_found) super().register_error_handler(exceptions.InternalServerError, self.internal_server_error) super().route('/unauthorized/')(self.unauthorized) super().route('/logout/')(self.logout) super().route('/authenticate/')(self.authenticate) super().route('/authenticate/callback/')(self.authenticate_callback) super().route('/api/gitpull', methods=['POST'])(api.process_github_webhook) super().route('/api/commit')(api.commit_id) super().route('/robots.txt')(self.robots_txt) super().route('/favicon<rest>')(self.favicon) self.url_build_error_handlers.append(self.external_url_handler) self.config['menu'] = [] self.config['js_url'] = '' self.config['css_url'] = '' self.config['commit-id'] = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip().decode() self.config['branch'] = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip().decode() self.config['SESSION_COOKIE_DOMAIN'] = configuration.get_optional_str('flask_cookie_domain') translations = os.path.abspath(os.path.join(shared_web_path, 'translations')) self.config['BABEL_TRANSLATION_DIRECTORIES'] = translations self.babel = Babel(self) localization.init(self.babel)
def __init__(self, import_name: str) -> None: shared_web_path = os.path.abspath(os.path.dirname(__file__)) static_folder = os.path.join(shared_web_path, 'static') super().__init__(import_name, static_folder=static_folder) super().register_error_handler(DoesNotExistException, self.not_found) super().register_error_handler(exceptions.NotFound, self.not_found) super().register_error_handler(exceptions.InternalServerError, self.internal_server_error) super().route('/unauthorized/')(self.unauthorized) super().route('/logout/')(self.logout) super().route('/authenticate/')(self.authenticate) super().route('/authenticate/callback/')(self.authenticate_callback) super().route('/api/gitpull', methods=['POST'])(api.process_github_webhook) super().route('/api/commit')(api.commit_id) super().route('/robots.txt')(self.robots_txt) super().route('/favicon<rest>')(self.favicon) self.url_build_error_handlers.append(self.external_url_handler) if self.config.get('SERVER_NAME') is None: self.config['SERVER_NAME'] = configuration.get_optional_str('flask_server_name') self.config['menu'] = [] self.config['js_url'] = '' self.config['css_url'] = '' self.config['commit-id'] = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip().decode() self.config['branch'] = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip().decode() self.config['SESSION_COOKIE_DOMAIN'] = configuration.get_optional_str('flask_cookie_domain') # Set some sensible cookie options. See https://flask.palletsprojects.com/en/master/security/ self.config['SESSION_COOKIE_SECURE'] = True self.config['SESSION_COOKIE_HTTPONLY'] = False # We want to be able to set the page_size cookie in an API response. self.config['SESSION_COOKIE_SAMESITE'] = 'Lax' translations = os.path.abspath(os.path.join(shared_web_path, 'translations')) self.config['BABEL_TRANSLATION_DIRECTORIES'] = translations self.babel = Babel(self) localization.init(self.babel) self.api_root = Blueprint('api', import_name, url_prefix='/api/') self.api = Api(self.api_root, title=f'{import_name} API', default=import_name) self.register_blueprint(self.api_root)
def parse_build_notes(h: Tag) -> None: entries = [] for n in h.next_elements: if isinstance(n, Tag) and n.name == 'p': if 'posted-in' in n.attrs.get('class', []): break if n.text: entries.append(n.text) embed = { 'title': 'MTGO Build Notes', 'type': 'rich', 'description': '\n'.join(entries), 'url': fetcher.find_announcements()[0], } if configuration.get_optional_str('bugs_webhook_id') is not None: fetch_tools.post_discord_webhook( configuration.get_str('bugs_webhook_id'), configuration.get_str('bugs_webhook_token'), embeds=[embed], username='******', avatar_url='https://magic.wizards.com/sites/mtg/files/styles/auth_small/public/images/person/wizards_authorpic_larger.jpg', )
from shared.pd_exception import DoesNotExistException from . import api, localization, oauth from .api import generate_error, return_json from .views import InternalServerError, NotFound, Unauthorized def sentry_filter(event, hint): # type: ignore if 'exc_info' in hint: exc_type, exc_value, tb = hint['exc_info'] if isinstance(exc_value, OSError): return None return event sentry_token = configuration.get_optional_str('sentry_token') if sentry_token: try: sentry_sdk.init( dsn=sentry_token, integrations=[FlaskIntegration()], traces_sample_rate=0.001, before_send=sentry_filter, ) except Exception as c: # pylint: disable=broad-except print(c) # pylint: disable=no-self-use, too-many-public-methods class PDFlask(Flask): def __init__(self, import_name: str) -> None: