def test_add_slash_redirect(self):
        app = Application({})
        factory = lambda *args: type('Resource', (), {'GET': None})
        app.mount_resource('test', factory, '/some/dir', add_slash=True)

        # Should not redirect
        next_handler = lambda app_, request_: 'NEXT'
        request = app.make_blank_request('/some/dir/')
        self.assertEqual(resource_finder(app, request, next_handler), 'NEXT')

        # Should redirect
        request = app.make_blank_request('/some/dir')
        try:
            resource_finder(app, request, next_handler)
        except Exception as exc:
            self.assertTrue(exc.status.startswith('3'))
            self.assertTrue(exc.location.endswith('/some/dir/'))
 def setUp(self):
     app = Application({})
     app.mount_resource('test', TestResource, '/test')
     self.app = app
Beispiel #3
0
def on_created(event):
    # Make a request to the root of the example app after it's created.
    print('Example request and response:\n')
    request = event.app.make_blank_request('/')
    response = event.app.handle_request(request)
    print(request, response, sep='\n\n')


if __name__ == '__main__':
    settings = {
        'debug': True,
        'tangled.app.on_created': [on_created],
        'tangled.app.defer_created': True,
    }

    app = Application(settings)
    app.mount_resource('home', Home, '/')

    # Greet user with "Hello" by default. The user's name must be passed
    # as a URL arg. A different greeting can be passed as the greeting
    # query parameter.
    app.mount_resource('hello', Hello, '/hello/<name>')

    # Greet with a specific greeting. Both the user's name and the
    # greeting must be passed as URL args.
    app.mount_resource('greet', Hello, '/greet/<name>/<greeting>')

    # Fire on-created event to initiate the example request.
    app.created()

    server = make_server('0.0.0.0', 6666, app)
Beispiel #4
0
 def setUp(self):
     app = Application('tangled.web.tests:test.ini')
     app.mount_resource('user', UserResource, '/users/<id>')
     self.app = TestApp(app)
     self._original_data = copy.deepcopy(Users.data)
Beispiel #5
0
 def setUp(self):
     app = Application({})
     app.mount_resource('test', TestResource, '/test')
     self.app = app
Beispiel #6
0
from wsgiref.simple_server import make_server

from tangled.web import Application, Resource


class Hello(Resource):

    def GET(self):
        if 'name' in self.urlvars:
            content = 'Hello, {name}'.format(**self.urlvars)
        else:
            content = 'Hello'
        return content


if __name__ == '__main__':
    settings = {
        'debug': True,
    }
    app = Application(settings)
    app.mount_resource('hello', Hello, '/')
    app.mount_resource('hello_name', Hello, '/<name>')
    server = make_server('0.0.0.0', 6666, app)
    server.serve_forever()
Beispiel #7
0
 def setUp(self):
     app = Application({})
     app.mount_resource('home', TestResource, '/')
     app.mount_resource('catch-all-single-segment-paths', TestResource, '/<x>', methods='GET')
     app.mount_resource('a', TestResource, '/a')
     app.mount_resource('b', TestResource, '/b/')
     app.mount_resource('abc', TestResource, '/a/b/c')
     app.mount_resource('abc_any', TestResource, '/<a>/<b>/<c>')
     app.mount_resource('xyz', TestResource, '/x/<y>/z', methods='GET')
     app.mount_resource('xkz', TestResource, '/x/k/z')
     app.mount_resource('y_get', TestResource, '/y', methods='GET')
     app.mount_resource('y_post', TestResource, '/y', methods='POST')
     app.mount_resource('cached', TestResource, '/cached')
     self.app = app
Beispiel #8
0
 def setUp(self):
     self.app = Application({})
Beispiel #9
0
def make_app(settings):
    """Configure ${package_name}."""
    app = Application(settings)
    app.mount_resource('home', '.resources:Hello', '/', methods='GET')
    app.mount_resource('hello', '.resources:Hello', '/<name>', methods='GET')
    return app
Beispiel #10
0
class TestConfig(unittest.TestCase):
    def setUp(self):
        self.app = Application({})

    def test_no_args_raises_TypeError(self):
        with self.assertRaises(TypeError):
            config('*/*')(type('Resource', (), {}))

    def test_no_defaults(self):
        class Resource(BaseResource):
            @config('text/html', status=303)
            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

    def test_defaults(self):
        @config('*/*', status=303)
        class Resource(BaseResource):
            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

    def test_override_defaults(self):
        @config('*/*',
                type='no_content',
                status=301,
                response_attrs={'status': 204})
        class Resource(BaseResource):
            @config('*/*', status=302)
            @config('application/json', status=303, response_attrs={'x': 'x'})
            @config('text/html', type=None, response_attrs={})
            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 302)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET',
                                   'application/json')
        self.assertEqual(info.type, 'no_content')
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {'x': 'x'})
        self.assertEqual(info.representation_args, {})

    def test_add_arg(self):
        class Resource(BaseResource):
            def GET(self):
                pass

        with self.assertRaises(TypeError):
            self.app.load_config(config('*/*', xxx=True)(Resource))

        self.app.add_config_field('*/*', 'xxx', False)
        self.app.load_config(config('*/*', xxx=True)(Resource))

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertTrue(hasattr(info, 'xxx'))
        self.assertTrue(info.xxx)
Beispiel #11
0
 def setUp(self):
     self.app = Application({})
Beispiel #12
0
class TestConfig(unittest.TestCase):

    def setUp(self):
        self.app = Application({})

    def test_no_args_raises_TypeError(self):
        with self.assertRaises(TypeError):
            config('*/*')(type('Resource', (), {}))

    def test_no_defaults(self):

        class Resource(BaseResource):

            @config('text/html', status=303)
            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

    def test_defaults(self):

        @config('*/*', status=303)
        class Resource(BaseResource):

            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

    def test_override_defaults(self):
        @config(
            '*/*', type='no_content', status=301,
            response_attrs={'status': 204})
        class Resource(BaseResource):

            @config('*/*', status=302)
            @config('application/json', status=303, response_attrs={'x': 'x'})
            @config('text/html', type=None, response_attrs={})
            def GET(self):
                pass

        self.app.load_config(Resource)

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertIsNone(info.type)
        self.assertEqual(info.status, 302)
        self.assertEqual(info.response_attrs, {})
        self.assertEqual(info.representation_args, {})

        resource = Resource(None, None)
        info = Config.for_resource(
            self.app, resource, 'GET', 'application/json')
        self.assertEqual(info.type, 'no_content')
        self.assertEqual(info.status, 303)
        self.assertEqual(info.response_attrs, {'x': 'x'})
        self.assertEqual(info.representation_args, {})

    def test_add_arg(self):

        class Resource(BaseResource):

            def GET(self):
                pass

        with self.assertRaises(TypeError):
            self.app.load_config(config('*/*', xxx=True)(Resource))

        self.app.add_config_field('*/*', 'xxx', False)
        self.app.load_config(config('*/*', xxx=True)(Resource))

        resource = Resource(None, None)
        info = Config.for_resource(self.app, resource, 'GET', 'text/html')
        self.assertTrue(hasattr(info, 'xxx'))
        self.assertTrue(info.xxx)