Merge remote-tracking branch 'joar/exif-rebase'
authorJoar Wandborg <git@wandborg.com>
Sat, 28 Jan 2012 17:47:01 +0000 (18:47 +0100)
committerJoar Wandborg <git@wandborg.com>
Sat, 28 Jan 2012 17:47:01 +0000 (18:47 +0100)
MANIFEST.in
bootstrap.py [deleted file]
buildout.cfg [deleted file]
mediagoblin/buildout_recipes.py [deleted file]
mediagoblin/db/mixin.py
mediagoblin/db/open.py
mediagoblin/db/sql/base.py
mediagoblin/db/sql/models.py
mediagoblin/db/util.py
mediagoblin/templates/mediagoblin/user_pages/media.html
setup.py

index b1f93dba1de17b9ececf2ce6618569d259b4139a..9300c698c61d2c9bc5cf58f68bbe034dbefb5357 100644 (file)
@@ -1,5 +1,5 @@
-recursive-include mediagoblin/templates *.html
-recursive-include mediagoblin/static *.js *.css *.png *.svg
+recursive-include mediagoblin/templates *.html *.txt
+recursive-include mediagoblin/static *.js *.css *.png *.svg *.ico
 recursive-include mediagoblin/tests *.ini
 recursive-include docs *.rst *.html
-
+include mediagoblin/config_spec.ini
diff --git a/bootstrap.py b/bootstrap.py
deleted file mode 100644 (file)
index 5f2cb08..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-"""
-
-import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess
-from optparse import OptionParser
-
-if sys.platform == 'win32':
-    def quote(c):
-        if ' ' in c:
-            return '"%s"' % c # work around spawn lamosity on windows
-        else:
-            return c
-else:
-    quote = str
-
-# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
-stdout, stderr = subprocess.Popen(
-    [sys.executable, '-Sc',
-     'try:\n'
-     '    import ConfigParser\n'
-     'except ImportError:\n'
-     '    print 1\n'
-     'else:\n'
-     '    print 0\n'],
-    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-has_broken_dash_S = bool(int(stdout.strip()))
-
-# In order to be more robust in the face of system Pythons, we want to
-# run without site-packages loaded.  This is somewhat tricky, in
-# particular because Python 2.6's distutils imports site, so starting
-# with the -S flag is not sufficient.  However, we'll start with that:
-if not has_broken_dash_S and 'site' in sys.modules:
-    # We will restart with python -S.
-    args = sys.argv[:]
-    args[0:0] = [sys.executable, '-S']
-    args = map(quote, args)
-    os.execv(sys.executable, args)
-# Now we are running with -S.  We'll get the clean sys.path, import site
-# because distutils will do it later, and then reset the path and clean
-# out any namespace packages from site-packages that might have been
-# loaded by .pth files.
-clean_path = sys.path[:]
-import site
-sys.path[:] = clean_path
-for k, v in sys.modules.items():
-    if k in ('setuptools', 'pkg_resources') or (
-        hasattr(v, '__path__') and
-        len(v.__path__)==1 and
-        not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))):
-        # This is a namespace package.  Remove it.
-        sys.modules.pop(k)
-
-is_jython = sys.platform.startswith('java')
-
-setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
-distribute_source = 'http://python-distribute.org/distribute_setup.py'
-
-# parsing arguments
-def normalize_to_url(option, opt_str, value, parser):
-    if value:
-        if '://' not in value: # It doesn't smell like a URL.
-            value = 'file://%s' % (
-                urllib.pathname2url(
-                    os.path.abspath(os.path.expanduser(value))),)
-        if opt_str == '--download-base' and not value.endswith('/'):
-            # Download base needs a trailing slash to make the world happy.
-            value += '/'
-    else:
-        value = None
-    name = opt_str[2:].replace('-', '_')
-    setattr(parser.values, name, value)
-
-usage = '''\
-[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-
-Bootstraps a buildout-based project.
-
-Simply run this script in a directory containing a buildout.cfg, using the
-Python that you want bin/buildout to use.
-
-Note that by using --setup-source and --download-base to point to
-local resources, you can keep this script from going over the network.
-'''
-
-parser = OptionParser(usage=usage)
-parser.add_option("-v", "--version", dest="version",
-                          help="use a specific zc.buildout version")
-parser.add_option("-d", "--distribute",
-                   action="store_true", dest="use_distribute", default=False,
-                   help="Use Distribute rather than Setuptools.")
-parser.add_option("--setup-source", action="callback", dest="setup_source",
-                  callback=normalize_to_url, nargs=1, type="string",
-                  help=("Specify a URL or file location for the setup file. "
-                        "If you use Setuptools, this will default to " +
-                        setuptools_source + "; if you use Distribute, this "
-                        "will default to " + distribute_source +"."))
-parser.add_option("--download-base", action="callback", dest="download_base",
-                  callback=normalize_to_url, nargs=1, type="string",
-                  help=("Specify a URL or directory for downloading "
-                        "zc.buildout and either Setuptools or Distribute. "
-                        "Defaults to PyPI."))
-parser.add_option("--eggs",
-                  help=("Specify a directory for storing eggs.  Defaults to "
-                        "a temporary directory that is deleted when the "
-                        "bootstrap script completes."))
-parser.add_option("-t", "--accept-buildout-test-releases",
-                  dest='accept_buildout_test_releases',
-                  action="store_true", default=False,
-                  help=("Normally, if you do not specify a --version, the "
-                        "bootstrap script and buildout gets the newest "
-                        "*final* versions of zc.buildout and its recipes and "
-                        "extensions for you.  If you use this flag, "
-                        "bootstrap and buildout will get the newest releases "
-                        "even if they are alphas or betas."))
-parser.add_option("-c", None, action="store", dest="config_file",
-                   help=("Specify the path to the buildout configuration "
-                         "file to be used."))
-
-options, args = parser.parse_args()
-
-# if -c was provided, we push it back into args for buildout's main function
-if options.config_file is not None:
-    args += ['-c', options.config_file]
-
-if options.eggs:
-    eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
-else:
-    eggs_dir = tempfile.mkdtemp()
-
-if options.setup_source is None:
-    if options.use_distribute:
-        options.setup_source = distribute_source
-    else:
-        options.setup_source = setuptools_source
-
-if options.accept_buildout_test_releases:
-    args.append('buildout:accept-buildout-test-releases=true')
-args.append('bootstrap')
-
-try:
-    import pkg_resources
-    import setuptools # A flag.  Sometimes pkg_resources is installed alone.
-    if not hasattr(pkg_resources, '_distribute'):
-        raise ImportError
-except ImportError:
-    ez_code = urllib2.urlopen(
-        options.setup_source).read().replace('\r\n', '\n')
-    ez = {}
-    exec ez_code in ez
-    setup_args = dict(to_dir=eggs_dir, download_delay=0)
-    if options.download_base:
-        setup_args['download_base'] = options.download_base
-    if options.use_distribute:
-        setup_args['no_fake'] = True
-    ez['use_setuptools'](**setup_args)
-    if 'pkg_resources' in sys.modules:
-        reload(sys.modules['pkg_resources'])
-    import pkg_resources
-    # This does not (always?) update the default working set.  We will
-    # do it.
-    for path in sys.path:
-        if path not in pkg_resources.working_set.entries:
-            pkg_resources.working_set.add_entry(path)
-
-cmd = [quote(sys.executable),
-       '-c',
-       quote('from setuptools.command.easy_install import main; main()'),
-       '-mqNxd',
-       quote(eggs_dir)]
-
-if not has_broken_dash_S:
-    cmd.insert(1, '-S')
-
-find_links = options.download_base
-if not find_links:
-    find_links = os.environ.get('bootstrap-testing-find-links')
-if find_links:
-    cmd.extend(['-f', quote(find_links)])
-
-if options.use_distribute:
-    setup_requirement = 'distribute'
-else:
-    setup_requirement = 'setuptools'
-ws = pkg_resources.working_set
-setup_requirement_path = ws.find(
-    pkg_resources.Requirement.parse(setup_requirement)).location
-env = dict(
-    os.environ,
-    PYTHONPATH=setup_requirement_path)
-
-requirement = 'zc.buildout'
-version = options.version
-if version is None and not options.accept_buildout_test_releases:
-    # Figure out the most recent final version of zc.buildout.
-    import setuptools.package_index
-    _final_parts = '*final-', '*final'
-    def _final_version(parsed_version):
-        for part in parsed_version:
-            if (part[:1] == '*') and (part not in _final_parts):
-                return False
-        return True
-    index = setuptools.package_index.PackageIndex(
-        search_path=[setup_requirement_path])
-    if find_links:
-        index.add_find_links((find_links,))
-    req = pkg_resources.Requirement.parse(requirement)
-    if index.obtain(req) is not None:
-        best = []
-        bestv = None
-        for dist in index[req.project_name]:
-            distv = dist.parsed_version
-            if _final_version(distv):
-                if bestv is None or distv > bestv:
-                    best = [dist]
-                    bestv = distv
-                elif distv == bestv:
-                    best.append(dist)
-        if best:
-            best.sort()
-            version = best[-1].version
-if version:
-    requirement = '=='.join((requirement, version))
-cmd.append(requirement)
-
-if is_jython:
-    import subprocess
-    exitcode = subprocess.Popen(cmd, env=env).wait()
-else: # Windows prefers this, apparently; otherwise we would prefer subprocess
-    exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
-if exitcode != 0:
-    sys.stdout.flush()
-    sys.stderr.flush()
-    print ("An error occurred when trying to install zc.buildout. "
-           "Look above this message for any errors that "
-           "were output by easy_install.")
-    sys.exit(exitcode)
-
-ws.add_entry(eggs_dir)
-ws.require(requirement)
-import zc.buildout.buildout
-zc.buildout.buildout.main(args)
-if not options.eggs: # clean up temporary egg directory
-    shutil.rmtree(eggs_dir)
diff --git a/buildout.cfg b/buildout.cfg
deleted file mode 100644 (file)
index a77bf93..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-[buildout]
-develop = . 
-parts = mediagoblin make_user_dev_dirs
-
-[mediagoblin]
-recipe=zc.recipe.egg
-interpreter=python
-dependent-scripts = true
-eggs=
-    python-dateutil>=1.5.0,<2.0.0
-    mediagoblin
-entry-points = 
-    nosetests=nose:run_exit
-    paster=paste.script.command:run
-
-
-[make_user_dev_dirs]
-recipe = mediagoblin:make_user_dev_dirs
-path = user_dev
\ No newline at end of file
diff --git a/mediagoblin/buildout_recipes.py b/mediagoblin/buildout_recipes.py
deleted file mode 100644 (file)
index f3d0362..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 MediaGoblin contributors.  See AUTHORS.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-import logging
-import os
-
-
-MAKE_SUBDIRECTORIES = ['media/queue', 'media/public', 'beaker']
-
-
-class MakeUserDevDirs(object):
-    """
-    Simple recipe for making subdirectories for user buildout convenience
-    """
-    def __init__(self, buildout, name, options):
-        self.buildout, self.name, self.options = buildout, name, options
-
-        if self.options['path'].startswith('/'):
-            self.path = self.options['path']
-        else:
-            self.path = os.path.join(
-                self.buildout['buildout']['directory'],
-                self.options['path'])
-
-    def install(self):
-        for make_subdir in MAKE_SUBDIRECTORIES:
-            fulldir = os.path.join(self.path, make_subdir)
-
-            if not os.path.exists(fulldir):
-                logging.getLogger(self.name).info(
-                    'Creating directory %s' % fulldir)
-                os.makedirs(fulldir)
-
-        return ()
-
-    update = install
index d587ccb42978f0daaecea8039a12462ae96240f5..254dbcff083255e0a6f81face4057839d5f84df8 100644 (file)
@@ -63,6 +63,10 @@ class MediaEntryMixin(object):
     def main_mediafile(self):
         pass
 
+    @property
+    def slug_or_id(self):
+        return (self.slug or self._id)
+
     def url_for_self(self, urlgen, **extra_args):
         """
         Generate an appropriate url for ourselves
@@ -71,18 +75,11 @@ class MediaEntryMixin(object):
         """
         uploader = self.get_uploader
 
-        if self.get('slug'):
-            return urlgen(
-                'mediagoblin.user_pages.media_home',
-                user=uploader.username,
-                media=self.slug,
-                **extra_args)
-        else:
-            return urlgen(
-                'mediagoblin.user_pages.media_home',
-                user=uploader.username,
-                media=unicode(self._id),
-                **extra_args)
+        return urlgen(
+            'mediagoblin.user_pages.media_home',
+            user=uploader.username,
+            media=self.slug_or_id,
+            **extra_args)
 
     def get_fail_exception(self):
         """
index 32827fcbd54501a1829a8b40038b89cfacfc41ca..6cd178691ff87e57741c41c1156204d854fc3432 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.db.mongo.open import \
-    setup_connection_and_db_from_config, check_db_migrations_current
+try:
+    from mediagoblin.db.sql_switch import use_sql
+except ImportError:
+    use_sql = False
+
+if use_sql:
+    from mediagoblin.db.sql.open import \
+        setup_connection_and_db_from_config, check_db_migrations_current
+else:
+    from mediagoblin.db.mongo.open import \
+        setup_connection_and_db_from_config, check_db_migrations_current
index 6f45b21b798326193fc93b7d6f93410f9d7d3b57..1db53c56728e549c46970188190b411110612900 100644 (file)
@@ -15,6 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
+from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.orm import scoped_session, sessionmaker, object_session
 from sqlalchemy.orm.query import Query
 from sqlalchemy.sql.expression import desc
@@ -73,3 +74,6 @@ class GMGTableBase(object):
             sess = Session()
         sess.add(self)
         sess.commit()
+
+
+Base = declarative_base(cls=GMGTableBase)
index 57444c2c56a4dc96800c7b0993990f2cc86df979..6232fff856b3df0606f7edf863fd73ffa47843c8 100644 (file)
@@ -17,7 +17,6 @@
 
 import datetime
 
-from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy import (
     Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
     UniqueConstraint)
@@ -27,13 +26,10 @@ from sqlalchemy.sql.expression import desc
 from sqlalchemy.ext.associationproxy import association_proxy
 
 from mediagoblin.db.sql.extratypes import PathTupleWithSlashes
-from mediagoblin.db.sql.base import GMGTableBase
+from mediagoblin.db.sql.base import Base
 from mediagoblin.db.mixin import UserMixin, MediaEntryMixin
 
 
-Base = declarative_base(cls=GMGTableBase)
-
-
 class SimpleFieldAlias(object):
     """An alias for any field"""
     def __init__(self, fieldname):
@@ -76,7 +72,7 @@ class MediaEntry(Base, MediaEntryMixin):
     id = Column(Integer, primary_key=True)
     uploader = Column(Integer, ForeignKey('users.id'), nullable=False)
     title = Column(Unicode, nullable=False)
-    slug = Column(Unicode, nullable=False)
+    slug = Column(Unicode)
     created = Column(DateTime, nullable=False, default=datetime.datetime.now)
     description = Column(UnicodeText) # ??
     description_html = Column(UnicodeText) # ??
index 1df9494ca2e8fd15b4ef317ce5a1ab785ba21385..fff71d06252115a417320a753cea6e10e9af4a1a 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.db.mongo.util import (ObjectId, InvalidId,
-    DESCENDING)
+try:
+    from mediagoblin.db.sql_switch import use_sql
+except ImportError:
+    use_sql = False
+
+if use_sql:
+    from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING
+else:
+    from mediagoblin.db.mongo.util import ObjectId, InvalidId, DESCENDING
index 2229bbb2cc3d753fb80cf85916417193796112b7..dec443cd6b388e03ff22cb168ebf12bc0a99ca15 100644 (file)
             <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
                    comment = comment._id,
                    user = media.get_uploader.username,
-                   media = media.slug) }}#comment">
+                   media = media.slug_or_id) }}#comment">
               {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }}
             </a>
           </div>
index 293f3f03d5615bdf28976fb6c73fa6ce7ee1c65e..ca7d4ae2ce5f58a01128a9365b0c15bc6652d15c 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -38,6 +38,7 @@ setup(
     version=get_version(),
     packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
     zip_safe=False,
+    include_package_data = True,
     # scripts and dependencies
     install_requires=[
         'setuptools',