Пример #1
0
class HgVendor(BackendVendor):
    url = "http://github.com/couchapp/couchapp"
    author = "Benoit Chesneau"
    author_email = "*****@*****.**"
    description = "HG vendor handler"
    long_description = """couchapp vendor install|update from mercurial::
    
    hg://somerepo (repo available via http, use http+ssh:// for ssh repos)
    """

    scheme = ['hg', 'hg+ssh']

    def fetch(self, url, path, *args, **opts):
        """ return git cmd path """
        if url.startswith("hg+ssh://"):
            url = url[8:]
        else:
            url = url.replace("hg://", "http://")
        try:
            cmd = locate_program("hg", raise_error=True)
        except ValueError, e:
            raise VendorError(e)

        cmd += " clone %s %s" % (url, path)

        # exec cmd
        (child_stdin, child_stdout, child_stderr) = popen3(cmd)
        err = child_stderr.read()
        if err:
            raise VendorError(str(err))

        logger.debug(child_stdout.read())
Пример #2
0
    def testPushDocs(self):
        os.chdir(self.tempdir)
        docsdir = os.path.join(self.tempdir, 'docs')
        os.makedirs(docsdir)
        
        # create 2 apps
        (child_stdin, child_stdout, child_stderr) = popen3("%s generate docs/app1" % self.cmd)
        (child_stdin, child_stdout, child_stderr) = popen3("%s generate docs/app2" % self.cmd)

        
        (child_stdin, child_stdout, child_stderr) = popen3("%s pushdocs docs/ http://127.0.0.1:5984/couchapp-test" % self.cmd)
       
        alldocs = self.db.all_docs()['rows']
        self.assert_(len(alldocs) == 2)
        
        self.assert_('_design/app1' == alldocs[0]['id'])
Пример #3
0
class GitVendor(BackendVendor):
    url = "http://github.com/couchapp/couchapp"
    author = "Benoit Chesneau"
    author_email = "*****@*****.**"
    description = "Git vendor handler"
    long_description = """couchapp vendor install|update from git::

    git://somerepo.git (use git+ssh:// for ssh repos)
    """

    scheme = ['git', 'git+ssh']

    def fetch(self, url, path, *args, **opts):
        if url.startswith("git+ssh://"):
            url = url[9:]
        """ return git cmd path """
        try:
            cmd = locate_program("git", raise_error=True)
        except ValueError, e:
            raise VendorError(e)

        cmd += " clone %s %s" % (url, path)

        # exec cmd
        (child_stdin, child_stdout, child_stderr) = popen3(cmd)
        err = child_stderr.read()
        if err:
            raise VendorError(str(err))
        logger.debug(child_stdout.read())
Пример #4
0
    def testPushApps(self):
        os.chdir(self.tempdir)
        docsdir = os.path.join(self.tempdir, 'docs')
        os.makedirs(docsdir)

        # create 2 apps
        (child_stdin, child_stdout,
         child_stderr) = popen3("%s generate docs/app1" % self.cmd)
        (child_stdin, child_stdout,
         child_stderr) = popen3("%s generate docs/app2" % self.cmd)

        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s pushapps docs/ http://127.0.0.1:5984/couchapp-test" % self.cmd)

        alldocs = self.db.all_docs()['rows']
        self.assert_(len(alldocs) == 2)
        self.assert_('_design/app1' == alldocs[0]['id'])
Пример #5
0
    def testPushApps(self):
        os.chdir(self.tempdir)
        docsdir = os.path.join(self.tempdir, 'docs')
        os.makedirs(docsdir)

        # create 2 apps
        (child_stdin, child_stdout, child_stderr) = \
            popen3("%s generate docs/app1" % self.cmd)
        (child_stdin, child_stdout, child_stderr) = \
            popen3("%s generate docs/app2" % self.cmd)

        (child_stdin, child_stdout, child_stderr) = \
            popen3("%s pushapps docs/ %scouchapp-test"
                   % (self.cmd, url))

        alldocs = self.db.all_docs()['rows']
        self.assertEqual(len(alldocs), 2)
        self.assertEqual('_design/app1', alldocs[0]['id'])
Пример #6
0
 def testGenerate(self):
     os.chdir(self.tempdir) 
     (child_stdin, child_stdout, child_stderr) = popen3("%s generate my-app" % self.cmd)
     appdir = os.path.join(self.tempdir, 'my-app')
     self.assert_(os.path.isdir(appdir) == True)
     cfile = os.path.join(appdir, '.couchapprc')
     self.assert_(os.path.isfile(cfile) == True)
     
     self.assert_(os.path.isdir(os.path.join(appdir, '_attachments')) == True)
     self.assert_(os.path.isfile(os.path.join(appdir, '_attachments', 'index.html')) == True)
     self.assert_(os.path.isfile(os.path.join(self.app_dir, '_attachments', 'style', 'main.css')))
     self.assert_(os.path.isdir(os.path.join(appdir, 'views')) == True)
     self.assert_(os.path.isdir(os.path.join(appdir, 'shows')) == True)
     self.assert_(os.path.isdir(os.path.join(appdir, 'lists')) == True)
Пример #7
0
    def testGenerate(self):
        os.chdir(self.tempdir)
        (child_stdin, child_stdout, child_stderr) = popen3("%s generate my-app"
                                                           % self.cmd)
        appdir = os.path.join(self.tempdir, 'my-app')
        self.assertTrue(os.path.isdir(appdir))
        cfile = os.path.join(appdir, '.couchapprc')
        self.assertTrue(os.path.isfile(cfile))

        self.assertTrue(os.path.isdir(os.path.join(appdir, '_attachments')))
        self.assertTrue(os.path.isfile(os.path.join(appdir, '_attachments',
                                                    'index.html')))
        self.assertTrue(os.path.isfile(os.path.join(self.app_dir,
                                                    '_attachments',
                                                    'style', 'main.css')))
        self.assertTrue(os.path.isdir(os.path.join(appdir, 'views')))
        self.assertTrue(os.path.isdir(os.path.join(appdir, 'shows')))
        self.assertTrue(os.path.isdir(os.path.join(appdir, 'lists')))
Пример #8
0
    def testPushNoAtomic(self):
        self._make_testapp()
        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s push --no-atomic my-app couchapp-test" % self.cmd)

        # any design doc created ?
        design_doc = None
        try:
            design_doc = self.db.open_doc('_design/my-app')
        except ResourceNotFound:
            pass
        self.assert_(design_doc is not None)

        # there are 3 revisions (1 doc creation + 2 attachments)
        self.assert_(design_doc['_rev'].startswith('3-'))

        # should create view
        self.assert_('function' in design_doc['views']['example']['map'])

        # should use macros
        self.assert_('stddev' in design_doc['views']['example']['map'])
        self.assert_('ejohn.org' in design_doc['shows']['example-show'])

        # should create index
        self.assert_(design_doc['_attachments']['index.html']['content_type']
                     == 'text/html')

        # should create manifest
        self.assert_('foo/' in design_doc['couchapp']['manifest'])

        # should push and macro the doc shows
        self.assert_('Generated CouchApp Form Template' in design_doc['shows']
                     ['example-show'])

        # should push and macro the view lists
        self.assert_('Test XML Feed' in design_doc['lists']['feed'])

        # should allow deeper includes
        self.assertFalse('"helpers"' in design_doc['shows']['example-show'])

        # deep require macros
        self.assertFalse('"template"' in design_doc['shows']['example-show'])
        self.assert_('Resig' in design_doc['shows']['example-show'])
Пример #9
0
 def testPushNoAtomic(self):
     self._make_testapp()
     (child_stdin, child_stdout, child_stderr) = popen3("%s push --no-atomic my-app couchapp-test" % self.cmd)
     
     # any design doc created ?
     design_doc = None
     try:
         design_doc = self.db.open_doc('_design/my-app')
     except ResourceNotFound:
         pass
     self.assert_(design_doc is not None)
     
     # there are 3 revisions (1 doc creation + 2 attachments)
     self.assert_(design_doc['_rev'].startswith('3-'))
     
     # should create view
     self.assert_('function' in design_doc['views']['example']['map'])
     
     # should use macros
     self.assert_('stddev' in design_doc['views']['example']['map'])
     self.assert_('ejohn.org' in design_doc['shows']['example-show'])
     
     # should create index
     self.assert_(design_doc['_attachments']['index.html']['content_type'] == 'text/html')
     
     # should create manifest
     self.assert_('foo/' in design_doc['couchapp']['manifest'])
     
     # should push and macro the doc shows
     self.assert_('Generated CouchApp Form Template' in design_doc['shows']['example-show'])
     
     # should push and macro the view lists
     self.assert_('Test XML Feed' in design_doc['lists']['feed'])
     
     # should allow deeper includes
     self.assertFalse('"helpers"' in design_doc['shows']['example-show'])
     
     # deep require macros
     self.assertFalse('"template"' in design_doc['shows']['example-show'])
     self.assert_('Resig' in design_doc['shows']['example-show'])
Пример #10
0
    def testPushNoAtomic(self):
        self._make_testapp()
        (child_stdin, child_stdout, child_stderr) = \
            popen3("%s push --no-atomic my-app %scouchapp-test" % (self.cmd,
                                                                   url))

        design_doc = self._retrieve_ddoc()

        # there are 3 revisions (1 doc creation + 2 attachments)
        self.assertTrue(design_doc['_rev'].startswith('3-'))

        # should create view
        self.assertIn('function', design_doc['views']['example']['map'])

        # should use macros
        self.assertIn('stddev', design_doc['views']['example']['map'])
        self.assertIn('ejohn.org', design_doc['shows']['example-show'])

        # should create index
        content_type = design_doc['_attachments']['index.html']['content_type']
        self.assertEqual(content_type, 'text/html')

        # should create manifest
        self.assertIn('foo/', design_doc['couchapp']['manifest'])

        # should push and macro the doc shows
        self.assertIn('Generated CouchApp Form Template',
                      design_doc['shows']['example-show'])

        # should push and macro the view lists
        self.assertIn('Test XML Feed', design_doc['lists']['feed'])

        # should allow deeper includes
        self.assertNotIn('"helpers"', design_doc['shows']['example-show'])

        # deep require macros
        self.assertNotIn('"template"', design_doc['shows']['example-show'])
        self.assertIn('Resig', design_doc['shows']['example-show'])
Пример #11
0
 def testClone(self):
     self._make_testapp()
     (child_stdin, child_stdout, child_stderr) = popen3("%s push -v my-app couchapp-test" % self.cmd)
             
     design_doc = self.db.open_doc('_design/my-app')
     
     app_dir =  os.path.join(self.tempdir, "couchapp-test")
     
     (child_stdin, child_stdout, child_stderr) = popen3("%s clone %s %s" % (
                 self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
                 app_dir))
                 
     # should create .couchapprc
     self.assert_(os.path.isfile(os.path.join(app_dir, ".couchapprc")))
      
      
     # should clone the views
     self.assert_(os.path.isdir(os.path.join(app_dir, "views")))
     
     # should create foo/bar.txt file
     self.assert_(os.path.isfile(os.path.join(app_dir, 'foo/bar.txt')))
     
     # should create lib/helpers/math.js file
     self.assert_(os.path.isfile(os.path.join(app_dir, 'lib/helpers/math.js')))
     
     # should work when design doc is edited manually
     design_doc['test.txt'] = "essai"
     
     design_doc = self.db.save_doc(design_doc)
             
     deltree(app_dir)
     (child_stdin, child_stdout, child_stderr) = popen3("%s clone %s %s" % (self.cmd, 
                 "http://127.0.0.1:5984/couchapp-test/_design/my-app",
                 app_dir))
     self.assert_(os.path.isfile(os.path.join(app_dir, 'test.txt')))
     
     # should work when a view is added manually
     design_doc["views"]["more"] = { "map": "function(doc) { emit(null, doc); }" }
     
     design_doc = self.db.save_doc(design_doc)        
     
     deltree(app_dir)
     (child_stdin, child_stdout, child_stderr) = popen3("%s clone %s %s" % (
                 self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
                 app_dir))
     self.assert_(os.path.isfile(os.path.join(app_dir, 'views/example/map.js')))
     
     # should work without manifest
     del design_doc['couchapp']['manifest']
     design_doc = self.db.save_doc(design_doc)   
     deltree(app_dir)
     (child_stdin, child_stdout, child_stderr) = popen3("%s clone %s %s" % (
                 self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
                 app_dir))
     self.assert_(os.path.isfile(os.path.join(app_dir, 'views/example/map.js')))
     
     # should create foo/bar without manifest
     self.assert_(os.path.isfile(os.path.join(app_dir, 'foo/bar')))
     
     # should create lib/helpers.json without manifest
     self.assert_(os.path.isfile(os.path.join(app_dir, 'lib/helpers.json')))
Пример #12
0
    def testClone(self):
        self._make_testapp()
        (child_stdin, child_stdout,
         child_stderr) = popen3("%s push -v my-app couchapp-test" % self.cmd)

        design_doc = self.db.open_doc('_design/my-app')

        app_dir = os.path.join(self.tempdir, "couchapp-test")

        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s clone %s %s" %
            (self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
             app_dir))

        # should create .couchapprc
        self.assert_(os.path.isfile(os.path.join(app_dir, ".couchapprc")))

        # should clone the views
        self.assert_(os.path.isdir(os.path.join(app_dir, "views")))

        # should create foo/bar.txt file
        self.assert_(os.path.isfile(os.path.join(app_dir, 'foo/bar.txt')))

        # should create lib/helpers/math.js file
        self.assert_(
            os.path.isfile(os.path.join(app_dir, 'lib/helpers/math.js')))

        # should work when design doc is edited manually
        design_doc['test.txt'] = "essai"

        design_doc = self.db.save_doc(design_doc)

        deltree(app_dir)
        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s clone %s %s" %
            (self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
             app_dir))
        self.assert_(os.path.isfile(os.path.join(app_dir, 'test.txt')))

        # should work when a view is added manually
        design_doc["views"]["more"] = {
            "map": "function(doc) { emit(null, doc); }"
        }

        design_doc = self.db.save_doc(design_doc)

        deltree(app_dir)
        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s clone %s %s" %
            (self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
             app_dir))
        self.assert_(
            os.path.isfile(os.path.join(app_dir, 'views/example/map.js')))

        # should work without manifest
        del design_doc['couchapp']['manifest']
        design_doc = self.db.save_doc(design_doc)
        deltree(app_dir)
        (child_stdin, child_stdout, child_stderr) = popen3(
            "%s clone %s %s" %
            (self.cmd, "http://127.0.0.1:5984/couchapp-test/_design/my-app",
             app_dir))
        self.assert_(
            os.path.isfile(os.path.join(app_dir, 'views/example/map.js')))

        # should create foo/bar without manifest
        self.assert_(os.path.isfile(os.path.join(app_dir, 'foo/bar')))

        # should create lib/helpers.json without manifest
        self.assert_(os.path.isfile(os.path.join(app_dir, 'lib/helpers.json')))