Skip to content
This repository has been archived by the owner on Feb 8, 2018. It is now read-only.

Take out configure_payments hack #2232

Merged
merged 7 commits into from
Apr 2, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions configure-aspen.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@

import gittip
import gittip.wireup
from gittip import canonize, configure_payments
from gittip import canonize
from gittip.security import authentication, csrf, x_frame_options
from gittip.utils import cache_static, timer


from aspen import log_dammit


# Wireup Algorithm
# ================

version_file = os.path.join(website.www_root, 'version.txt')
__version__ = open(version_file).read().strip()
website.version = os.environ['__VERSION__'] = __version__
website.version = open(version_file).read().strip()


website.renderer_default = "jinja2"
Expand All @@ -36,18 +36,20 @@
}


gittip.wireup.canonical()
website.db = gittip.wireup.db()
env = website.env = gittip.wireup.env()
gittip.wireup.canonical(env)
website.db = gittip.wireup.db(env)
gittip.wireup.billing()
gittip.wireup.username_restrictions(website)
gittip.wireup.nanswers()
gittip.wireup.envvars(website)
gittip.wireup.nanswers(env)
gittip.wireup.accounts_elsewhere(website, env)
gittip.wireup.other_stuff(website, env)
tell_sentry = gittip.wireup.make_sentry_teller(website)

# The homepage wants expensive queries. Let's periodically select into an
# intermediate table.

UPDATE_HOMEPAGE_EVERY = int(os.environ['UPDATE_HOMEPAGE_EVERY'])
UPDATE_HOMEPAGE_EVERY = env.update_homepage_every
def update_homepage_queries():
from gittip import utils
while 1:
Expand Down Expand Up @@ -143,7 +145,6 @@ def scab_body_onto_response(response):
, algorithm['raise_200_for_OPTIONS']

, canonize
, configure_payments
, authentication.inbound
, csrf.inbound
, add_stuff_to_context
Expand Down
7 changes: 0 additions & 7 deletions gittip/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"""
import datetime
import locale
import os
from decimal import Decimal

import aspen
Expand Down Expand Up @@ -93,12 +92,6 @@ def canonize(request):
request.redirect(url)


def configure_payments(request):
# Work-around for https://github.com/balanced/balanced-python/issues/5
import balanced
balanced.configure(os.environ['BALANCED_API_SECRET'])


def outbound(request, response, website):
version = website.version

Expand Down
6 changes: 3 additions & 3 deletions gittip/cli.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"""This is installed as `payday`.
"""
import os
from gittip import wireup


Expand All @@ -13,8 +12,9 @@ def payday():
# connection it's easier to trust changes to statement_timeout. The point
# here is that we want to turn off statement_timeout for payday.

os.environ['DATABASE_MAXCONN'] = '1'
db = wireup.db()
env = wireup.env()
env.database_maxconn = 1
db = wireup.db(env)
db.run("SET statement_timeout = 0")

wireup.billing()
Expand Down
182 changes: 100 additions & 82 deletions gittip/wireup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import sys

import aspen
import balanced
import gittip
import raven
import stripe
from environment import Environment, is_yesish
from gittip.elsewhere import PlatformRegistry
from gittip.elsewhere.bitbucket import Bitbucket
from gittip.elsewhere.bountysource import Bountysource
Expand All @@ -22,14 +22,14 @@
from gittip.models import GittipDB


def canonical():
gittip.canonical_scheme = os.environ['CANONICAL_SCHEME']
gittip.canonical_host = os.environ['CANONICAL_HOST']
def canonical(env):
gittip.canonical_scheme = env.canonical_scheme
gittip.canonical_host = env.canonical_host


def db():
dburl = os.environ['DATABASE_URL']
maxconn = int(os.environ['DATABASE_MAXCONN'])
def db(env):
dburl = env.database_url
maxconn = env.database_maxconn
db = GittipDB(dburl, maxconn=maxconn)

db.register_model(Community)
Expand Down Expand Up @@ -137,80 +137,56 @@ def tell_sentry(exception, request=None):
return tell_sentry


def nanswers():
def nanswers(env):
from gittip.models import participant
participant.NANSWERS_THRESHOLD = int(os.environ['NANSWERS_THRESHOLD'])
participant.NANSWERS_THRESHOLD = env.nanswers_threshold


class BadEnvironment(SystemExit):
pass


def envvars(website):

missing_keys = []
malformed_values = []

def envvar(key, cast=None):
if key not in os.environ:
missing_keys.append(key)
return ""
value = os.environ[key].decode('ASCII')
if cast is not None:
try:
value = cast(value)
except:
err = str(sys.exc_info()[1])
malformed_values.append((key, err))
return ""
return value

def is_yesish(val):
return val.lower() in ('1', 'true', 'yes')


# Accounts Elsewhere
# ==================
def accounts_elsewhere(website, env):

twitter = Twitter(
website.db,
envvar('TWITTER_CONSUMER_KEY'),
envvar('TWITTER_CONSUMER_SECRET'),
envvar('TWITTER_CALLBACK'),
env.twitter_consumer_key,
env.twitter_consumer_secret,
env.twitter_callback,
)
github = GitHub(
website.db,
envvar('GITHUB_CLIENT_ID'),
envvar('GITHUB_CLIENT_SECRET'),
envvar('GITHUB_CALLBACK'),
env.github_client_id,
env.github_client_secret,
env.github_callback,
)
bitbucket = Bitbucket(
website.db,
envvar('BITBUCKET_CONSUMER_KEY'),
envvar('BITBUCKET_CONSUMER_SECRET'),
envvar('BITBUCKET_CALLBACK'),
env.bitbucket_consumer_key,
env.bitbucket_consumer_secret,
env.bitbucket_callback,
)
openstreetmap = OpenStreetMap(
website.db,
envvar('OPENSTREETMAP_CONSUMER_KEY'),
envvar('OPENSTREETMAP_CONSUMER_SECRET'),
envvar('OPENSTREETMAP_CALLBACK'),
envvar('OPENSTREETMAP_API_URL'),
envvar('OPENSTREETMAP_AUTH_URL'),
env.openstreetmap_consumer_key,
env.openstreetmap_consumer_secret,
env.openstreetmap_callback,
env.openstreetmap_api_url,
env.openstreetmap_auth_url,
)
bountysource = Bountysource(
website.db,
None,
envvar('BOUNTYSOURCE_API_SECRET'),
envvar('BOUNTYSOURCE_CALLBACK'),
envvar('BOUNTYSOURCE_API_HOST'),
envvar('BOUNTYSOURCE_WWW_HOST'),
env.bountysource_api_secret,
env.bountysource_callback,
env.bountysource_api_host,
env.bountysource_www_host,
)
venmo = Venmo(
website.db,
envvar('VENMO_CLIENT_ID'),
envvar('VENMO_CLIENT_SECRET'),
envvar('VENMO_CALLBACK'),
env.venmo_client_id,
env.venmo_client_secret,
env.venmo_callback,
)

signin_platforms = [twitter, github, bitbucket, openstreetmap]
Expand All @@ -224,54 +200,94 @@ def is_yesish(val):
website.platforms = AccountElsewhere.platforms = PlatformRegistry(all_platforms)


# Other Stuff
# ===========

website.asset_version_url = envvar('GITTIP_ASSET_VERSION_URL') \
.replace('%version', website.version)
website.asset_url = envvar('GITTIP_ASSET_URL')
website.cache_static = is_yesish(envvar('GITTIP_CACHE_STATIC'))
website.compress_assets = is_yesish(envvar('GITTIP_COMPRESS_ASSETS'))

website.google_analytics_id = envvar('GOOGLE_ANALYTICS_ID')
website.sentry_dsn = envvar('SENTRY_DSN')

website.min_threads = envvar('MIN_THREADS', int)
website.log_busy_threads_every = envvar('LOG_BUSY_THREADS_EVERY', int)
website.log_metrics = is_yesish(envvar('LOG_METRICS'))
def other_stuff(website, env):
website.asset_version_url = env.gittip_asset_version_url.replace('%version', website.version)
website.asset_url = env.gittip_asset_url
website.cache_static = env.gittip_cache_static
website.compress_assets = env.gittip_compress_assets

website.google_analytics_id = env.google_analytics_id
website.sentry_dsn = env.sentry_dsn

website.min_threads = env.min_threads
website.log_busy_threads_every = env.log_busy_threads_every
website.log_metrics = env.log_metrics


def env():
env = Environment(
DATABASE_URL = unicode,
CANONICAL_HOST = unicode,
CANONICAL_SCHEME = unicode,
MIN_THREADS = int,
DATABASE_MAXCONN = int,
GITTIP_ASSET_VERSION_URL = unicode,
GITTIP_ASSET_URL = unicode,
GITTIP_CACHE_STATIC = is_yesish,
GITTIP_COMPRESS_ASSETS = is_yesish,
STRIPE_SECRET_API_KEY = unicode,
STRIPE_PUBLISHABLE_API_KEY = unicode,
BALANCED_API_SECRET = unicode,
DEBUG = unicode,
GITHUB_CLIENT_ID = unicode,
GITHUB_CLIENT_SECRET = unicode,
GITHUB_CALLBACK = unicode,
BITBUCKET_CONSUMER_KEY = unicode,
BITBUCKET_CONSUMER_SECRET = unicode,
BITBUCKET_CALLBACK = unicode,
TWITTER_CONSUMER_KEY = unicode,
TWITTER_CONSUMER_SECRET = unicode,
TWITTER_CALLBACK = unicode,
BOUNTYSOURCE_API_SECRET = unicode,
BOUNTYSOURCE_CALLBACK = unicode,
BOUNTYSOURCE_API_HOST = unicode,
BOUNTYSOURCE_WWW_HOST = unicode,
VENMO_CLIENT_ID = unicode,
VENMO_CLIENT_SECRET = unicode,
VENMO_CALLBACK = unicode,
OPENSTREETMAP_CONSUMER_KEY = unicode,
OPENSTREETMAP_CONSUMER_SECRET = unicode,
OPENSTREETMAP_CALLBACK = unicode,
OPENSTREETMAP_API_URL = unicode,
OPENSTREETMAP_AUTH_URL = unicode,
NANSWERS_THRESHOLD = int,
UPDATE_HOMEPAGE_EVERY = int,
GOOGLE_ANALYTICS_ID = unicode,
SENTRY_DSN = unicode,
LOG_BUSY_THREADS_EVERY = int,
LOG_METRICS = is_yesish,
)


# Error Checking
# ==============

if malformed_values:
malformed_values.sort()
these = len(malformed_values) != 1 and 'these' or 'this'
plural = len(malformed_values) != 1 and 's' or ''
if env.malformed:
these = len(env.malformed) != 1 and 'these' or 'this'
plural = len(env.malformed) != 1 and 's' or ''
aspen.log_dammit("=" * 42)
aspen.log_dammit( "Oh no! Gittip.com couldn't understand %s " % these
, "environment variable%s:" % plural
)
aspen.log_dammit(" ")
for key, err in malformed_values:
for key, err in env.malformed:
aspen.log_dammit(" {} ({})".format(key, err))
aspen.log_dammit(" ")
aspen.log_dammit("See ./default_local.env for hints.")

aspen.log_dammit("=" * 42)
keys = ', '.join([key for key in malformed_values])
keys = ', '.join([key for key in env.malformed])
raise BadEnvironment("Malformed envvar{}: {}.".format(plural, keys))

if missing_keys:
missing_keys.sort()
these = len(missing_keys) != 1 and 'these' or 'this'
plural = len(missing_keys) != 1 and 's' or ''
if env.missing:
these = len(env.missing) != 1 and 'these' or 'this'
plural = len(env.missing) != 1 and 's' or ''
aspen.log_dammit("=" * 42)
aspen.log_dammit( "Oh no! Gittip.com needs %s missing " % these
, "environment variable%s:" % plural
)
aspen.log_dammit(" ")
for key in missing_keys:
for key in env.missing:
aspen.log_dammit(" " + key)
aspen.log_dammit(" ")
aspen.log_dammit( "(Sorry, we must've started looking for "
Expand All @@ -284,5 +300,7 @@ def is_yesish(val):
aspen.log_dammit("See ./default_local.env for hints.")

aspen.log_dammit("=" * 42)
keys = ', '.join([key for key in missing_keys])
keys = ', '.join([key for key in env.missing])
raise BadEnvironment("Missing envvar{}: {}.".format(plural, keys))

return env
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@
./vendor/honcho-0.5.0.tar.gz

./vendor/vcrpy-0.6.0.tar.gz
./vendor/environment-1.0.0.tar.gz
Loading