Skip to content

Query Server package code review #286

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 66 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
b9ac81b
[server] Introduce query server package
kxepal Mar 22, 2016
e38397e
[server] Introduce `BaseQueryServer` and `SimpleQueryServer`
kxepal May 13, 2016
3a71bff
[server] mv view.py to server/__main__.py
kxepal May 9, 2016
820bda5
[server] Add server test suite
kxepal May 14, 2016
55d7088
[server] Test suite for `server.stream`
kxepal May 14, 2016
dcbbd47
[server] Apply proper API calls to __main__.py
kxepal May 9, 2016
b47a059
[server] New cmd option `--log-level`
kxepal May 9, 2016
76256a1
[server] New cmd option `--allow-get-update`
kxepal May 9, 2016
ce1a300
[server] New cmd option `--enable-eggs`
kxepal May 9, 2016
e217c4f
[server] New cmd option `--egg-cache`
kxepal May 9, 2016
12893f6
[server] New cmd option `couchdb-version`
kxepal May 9, 2016
146d969
[server] `BaseQueryServer.commands` property
kxepal May 13, 2016
147364e
[server] Exception handlers for `BaseQueryServer`
kxepal May 13, 2016
369f320
[server] Property `BaseQueryServer.state`
kxepal May 13, 2016
bd98047
[server] Server cmd: `log`
kxepal May 13, 2016
a0fbacd
[server] Server API: `compile`
kxepal May 13, 2016
2f562a7
[server] Resolve dependencies of `compiler`: `maybe_export_egg`
kxepal May 15, 2016
3bad349
[server] Resolve dependencies of `compiler`
kxepal May 15, 2016
45682c5
[server] Resolve dependencies of `compiler`: `require`
kxepal May 15, 2016
906c6b1
[server] Resolve dependencies of `compiler`: `compile_func`
kxepal May 15, 2016
37798ba
[server] Server cmd: `add_lib`
kxepal May 13, 2016
4349d51
[server] Server cmd: `add_fun`
kxepal May 13, 2016
9c30606
[server] Server cmd: `reset`
kxepal May 13, 2016
c4e152b
[server] Server cmd: `add_ddoc`
kxepal May 13, 2016
d4f7a01
[server] Server API: `ddoc_cmd`
kxepal May 13, 2016
698ee0e
[server] Server cmd: `map_doc`
kxepal May 13, 2016
d00497d
[server] Server cmd: `reduce`
kxepal May 13, 2016
bb91838
[server] Server cmd: `rereduce`
kxepal May 13, 2016
a2c5841
[server] Server cmd: `show_doc`
kxepal May 13, 2016
0a457bf
[server] `render_function` required by `show_doc`
kxepal May 13, 2016
cca018d
[server] `response_with` required by `show_doc`
kxepal May 13, 2016
dbcc74d
[server] Introduce `MimeProvider`
kxepal May 13, 2016
b321342
[server] Add `util.OrderedDict` required by `mime`
iblislin May 14, 2016
1db4916
[server] Add helper functions in module `mime`
kxepal May 14, 2016
91abfb9
[server] Server cmd: `list_old`
kxepal May 14, 2016
3f47ac1
[server] Server cmd: `show`
kxepal May 14, 2016
9e9422c
[server] Server cmd: `list`
kxepal May 14, 2016
2148e00
[server] Server cmd: `update`
kxepal May 14, 2016
ef9c855
[server] Server cmd: `filter`
kxepal May 14, 2016
6cede86
[server] Server cmd: `validate_doc_update`
kxepal May 14, 2016
6f365b8
[server] Server cmd: `ddoc shows`
kxepal May 14, 2016
8e7b197
[server] Server cmd: `ddoc lists`
kxepal May 14, 2016
64c7d14
[server] Server cmd: `ddoc updates`
kxepal May 14, 2016
106e528
[server] Server cmd: `ddoc filters`
kxepal May 14, 2016
e60cf48
[server] Server cmd: `ddoc views`
kxepal May 14, 2016
27facf4
[server] Server cmd: `ddoc validate_doc_update`
kxepal May 14, 2016
60b8555
[server] Add test suite: 'cli'
kxepal May 15, 2016
e741a85
[server] unicode anywhere in stream.respond
iblislin May 20, 2016
cc4798e
[server] Fix setup.py packages options
iblislin May 20, 2016
8bd1985
[server] update docstring of __main__ script
iblislin May 20, 2016
439af0a
[server] move local import statement to the top
iblislin May 20, 2016
39131fd
[server] Fix option string of cli script
iblislin May 20, 2016
838c861
[server] Replace try-except block with assertRaises
iblislin May 20, 2016
2b84a3a
[server] Apply `None` checking for `qs.log` properly
iblislin May 21, 2016
c1b50cd
[server] fix typo in compiler.py
iblislin May 22, 2016
71db52b
[server] clean up legacy code in compiler.py
iblislin May 23, 2016
2b8d345
[server] clean up legacy test case in compiler.py
iblislin May 23, 2016
0b99d7b
[server] Reimplement compiler.maybe_b64egg
iblislin May 24, 2016
b0cc416
[server] Accept empty context in compiler.require
iblislin May 28, 2016
f0c5054
[server] code clean up in compiler.py
iblislin May 28, 2016
f373e06
[server] check side effect in test case
iblislin May 30, 2016
a2ff50d
[server] Remove obsolete var: state.line_length
iblislin Jun 6, 2016
f7aee62
[server] Exam the output of user map funcion
iblislin Jun 11, 2016
f91a237
[server] check the empty output of map_doc in test case
iblislin Jun 23, 2016
13f6c8d
[server] raise exceptions in try-else block for views.py
iblislin Oct 25, 2016
d099408
[server] mime: update DEFAULT_TYPES
iblislin Oct 26, 2016
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
Prev Previous commit
Next Next commit
[server] Server API: ddoc_cmd
Author:     Alexander Shorin <kxepal@gmail.com>
Patched by: Iblis Lin <iblis@hs.ntnu.edu.tw>

Reference: #268
See Also:  #276
  • Loading branch information
kxepal authored and iblislin committed May 15, 2016
commit d4f7a01ba3f64478de92b44c999acfb7df290786
29 changes: 29 additions & 0 deletions couchdb/server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,35 @@ def reset(self, config=None):
return self._process_request(['reset', config])
return self._process_request(['reset'])

def ddoc_cmd(self, ddoc_id, cmd, func_path, func_args):
"""Runs ``ddoc`` command.
Requires teached ddoc by :meth:`add_ddoc`.

:param ddoc_id: DDoc id.
:type ddoc_id: str

:param cmd: Command name.
:type cmd: str

:param func_path: List of keys which holds filter function within ddoc.
:type func_path: list

:param func_args: List of design function arguments.
:type func_args: list

:return: Returned value depended from executed command.

.. versionadded:: 0.11.0
"""
if not func_path or func_path[0] != cmd:
func_path.insert(0, cmd)
return self._process_request(['ddoc', ddoc_id, func_path, func_args])

@property
def ddocs(self):
"""Returns dict with registered ddocs"""
return self.commands['ddoc']

@property
def query_config(self):
"""Returns query server config which :meth:`reset` operates with"""
Expand Down
49 changes: 49 additions & 0 deletions couchdb/server/ddoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,52 @@ def add_ddoc(self, server, ddoc_id, ddoc):
log.debug('Cache design document `%s`', ddoc_id)
self.cache[ddoc_id] = ddoc
return True

def run_ddoc_func(self, server, ddoc_id, fun_path, fun_args):
"""
:param server: Query server instance.
:type server: :class:`~couchdb.server.BaseQueryServer`

:param ddoc_id: Design document id, holder of requested function.
:type ddoc_id: unicode

:param fun_path: List of key by which request function could be found
within ddoc object. First element of this list is
ddoc command.
:type fun_path: list

:param fun_args: List of function arguments.
:type fun_args: list

:return: Result of called design function if any available.
For example, lists doesn't explicitly returns any value.

.. versionadded:: 0.11.0
"""
ddoc = self.cache.get(ddoc_id)
if ddoc is None:
msg = 'Uncached design document: {0}'.format(ddoc_id)
log.error(msg)
raise FatalError('query_protocol_error', msg)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just out of curiosity: I am trying to understand this erlang code about query server, and I grep the code, do not see any atom looks like query_protocol_error. So what will happen if our python qs raise the query_protocol_error?
I can find some error catch by erlang, like compilation_error, but query_protocol_error not.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should check JavaScript QS instead.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it's worth to check the error_reason.

diff --git a/couchdb/tests/server/ddoc.py b/couchdb/tests/server/ddoc.py
index ea0a316..1c1da71 100644
--- a/couchdb/tests/server/ddoc.py
+++ b/couchdb/tests/server/ddoc.py
@@ -52,10 +52,11 @@ class DDocTestCase(unittest.TestCase):
     def test_fail_process_unregistered_ddoc(self):
         """should raise FatalError if ddoc was not registered
         before design function call"""
-        self.assertRaises(
-            exceptions.FatalError,
-            self.ddoc, self.server, 'foo', ['bar', 'baz'], []
-        )
+        try:
+            self.ddoc(self.server, 'foo', ['bar', 'baz'], [])
+        except Exception as err:
+            self.assertTrue(isinstance(err, exceptions.FatalError))
+            self.assertEqual(err.args[0], 'query_protocol_error')

     def test_fail_call_unknown_func(self):
         """should raise Error for unknown design function call"""

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any comment about this patch?

cmd = fun_path[0]
if cmd not in self.commands:
msg = 'Unknown ddoc command `{0}`'.format(cmd)
log.error(msg)
raise FatalError('unknown_command', msg)
handler = self.commands[cmd]
point = ddoc
for item in fun_path:
prev, point = point, point.get(item)
if point is None:
msg = 'Missed function `%s` in design doc `%s` by path: %s'
args = (item, ddoc_id, '/'.join(fun_path))
log.error(msg, *args)
raise Error('not_found', msg % args)
else:
func = point
if not isinstance(func, FunctionType):
func = server.compile(func, ddoc)
prev[item] = func
log.debug('Run %s in design doc `%s` by path: %s',
func, ddoc_id, '/'.join(fun_path))
return handler(server, func, *fun_args)