Skip to content

Commit 76b0725

Browse files
authored
Merge pull request #160 from zhenlineo/1.2-fix-examples
Fix examples
2 parents 64cbfa5 + da58ba2 commit 76b0725

40 files changed

+865
-346
lines changed

neo4j/bolt/connection.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ def connect(address, ssl_context=None, **config):
458458
raise ServiceUnavailable("Failed to establish connection to {!r}".format(address))
459459
else:
460460
raise
461+
except ConnectionResetError:
462+
raise ServiceUnavailable("Failed to establish connection to {!r}".format(address))
461463

462464
# Secure the connection if an SSL context has been provided
463465
if ssl_context and SSL_AVAILABLE:
@@ -500,7 +502,10 @@ def connect(address, ssl_context=None, **config):
500502
ready_to_read, _, _ = select((s,), (), (), 0)
501503
while not ready_to_read:
502504
ready_to_read, _, _ = select((s,), (), (), 0)
503-
data = s.recv(4)
505+
try:
506+
data = s.recv(4)
507+
except ConnectionResetError:
508+
raise ServiceUnavailable("Failed to read any data from server {!r} after connected".format(address))
504509
data_size = len(data)
505510
if data_size == 0:
506511
# If no data is returned after a successful select

neo4j/v1/api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from collections import deque
2323
from random import random
2424
from threading import RLock
25-
from time import clock, sleep
25+
from time import time, sleep
2626
from warnings import warn
2727

2828
from neo4j.bolt import ProtocolError, ServiceUnavailable
@@ -422,11 +422,11 @@ def _run_transaction(self, access_mode, unit_of_work, *args, **kwargs):
422422
RETRY_DELAY_MULTIPLIER,
423423
RETRY_DELAY_JITTER_FACTOR)
424424
last_error = None
425-
t0 = t1 = clock()
425+
t0 = t1 = time()
426426
while t1 - t0 <= self._max_retry_time:
427427
try:
428-
self._create_transaction()
429428
self._connect(access_mode)
429+
self._create_transaction()
430430
self.__begin__()
431431
with self._transaction as tx:
432432
return unit_of_work(tx, *args, **kwargs)
@@ -438,7 +438,7 @@ def _run_transaction(self, access_mode, unit_of_work, *args, **kwargs):
438438
else:
439439
raise error
440440
sleep(next(retry_delay))
441-
t1 = clock()
441+
t1 = time()
442442
raise last_error
443443

444444
def read_transaction(self, unit_of_work, *args, **kwargs):

neo4j/v1/session.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ def __run__(self, statement, parameters):
4747
result.statement = statement
4848
result.parameters = parameters
4949

50-
self._connection.append(RUN, (statement, parameters), response=run_response)
51-
self._connection.append(PULL_ALL, response=pull_all_response)
50+
try:
51+
self._connection.append(RUN, (statement, parameters), response=run_response)
52+
self._connection.append(PULL_ALL, response=pull_all_response)
53+
except AttributeError:
54+
pass
5255

5356
return result
5457

test/examples/__main__.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
22+
if __name__ == "__main__":
23+
from os.path import dirname
24+
from test.tools import run_tests
25+
run_tests(dirname(__file__))
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::autocommit-transaction-import[]
22+
from neo4j.v1 import Session;
23+
from test.examples.base_application import BaseApplication
24+
# end::autocommit-transaction-import[]
25+
26+
class AutocommitTransactionExample(BaseApplication):
27+
def __init__(self, uri, user, password):
28+
super(AutocommitTransactionExample, self).__init__(uri, user, password)
29+
30+
# tag::autocommit-transaction[]
31+
def add_person(self, name):
32+
session = self._driver.session()
33+
session.run( "CREATE (a:Person {name: $name})", {"name": name} )
34+
# end::autocommit-transaction[]

test/examples/base_application.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
from neo4j.v1 import GraphDatabase
22+
23+
class BaseApplication(object):
24+
def __init__(self, uri, user, password):
25+
self._driver = GraphDatabase.driver( uri, auth=( user, password ) )
26+
27+
def close(self):
28+
self._driver.close()

test/examples/basic_auth_example.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::basic-auth-import[]
22+
from neo4j.v1 import GraphDatabase
23+
# end::basic-auth-import[]
24+
25+
class BasicAuthExample:
26+
# tag::basic-auth[]
27+
def __init__(self, uri, user, password):
28+
self._driver = GraphDatabase.driver(uri, auth=(user, password))
29+
# end::basic-auth[]
30+
31+
def close(self):
32+
self._driver.close()
33+
34+
def can_connect(self):
35+
record_list = list(self._driver.session().run("RETURN 1"))
36+
return int(record_list[0][0]) == 1
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::config-connection-timeout-import[]
22+
from neo4j.v1 import GraphDatabase
23+
# end::config-connection-timeout-import[]
24+
25+
class ConfigConnectionTimeoutExample:
26+
# tag::config-connection-timeout[]
27+
def __init__(self, uri, user, password):
28+
self._driver = GraphDatabase.driver( uri, auth=( user, password ),
29+
Config.build().withConnectionTimeout( 15, SECONDS ).toConfig() )
30+
# end::config-connection-timeout[]
31+
32+
def close(self):
33+
self._driver.close();
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::config-max-retry-time-import[]
22+
from neo4j.v1 import GraphDatabase
23+
# end::config-max-retry-time-import[]
24+
25+
class ConfigMaxRetryTimeExample:
26+
# tag::config-max-retry-time[]
27+
def __init__(self, uri, user, password):
28+
self._driver = GraphDatabase.driver(uri, auth=(user, password),
29+
Config.build().withMaxTransactionRetryTime( 15, SECONDS ).toConfig() )
30+
# end::config-max-retry-time[]
31+
32+
def close(self):
33+
self._driver.close();

test/examples/config_trust_example.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::config-trust-import[]
22+
from neo4j.v1 import GraphDatabase
23+
# end::config-trust-import[]
24+
25+
class ConfigTrustExample:
26+
# tag::config-trust[]
27+
def __init__(self, uri, user, password):
28+
self._driver = GraphDatabase.driver(uri, auth=(user, password),
29+
Config.build().withTrustStrategy( Config.TrustStrategy.trustSystemCertificates() ).toConfig() )
30+
# end::config-trust[]
31+
32+
def close(self):
33+
self._driver.close();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::config-unencrypted-import[]
22+
from neo4j.v1 import GraphDatabase
23+
# end::config-unencrypted-import[]
24+
25+
class ConfigUnencryptedExample:
26+
# tag::config-unencrypted[]
27+
def __init__(self, uri, user, password):
28+
self._driver = GraphDatabase.driver(uri, auth=(user, password), encrypted=False)
29+
# end::config-unencrypted[]
30+
31+
def close(self):
32+
self._driver.close();

test/examples/custom_auth_example.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
# Copyright (c) 2002-2017 "Neo Technology,"
5+
# Network Engine for Objects in Lund AB [http://neotechnology.com]
6+
#
7+
# This file is part of Neo4j.
8+
#
9+
# Licensed under the Apache License, Version 2.0 (the "License");
10+
# you may not use this file except in compliance with the License.
11+
# You may obtain a copy of the License at
12+
#
13+
# http://www.apache.org/licenses/LICENSE-2.0
14+
#
15+
# Unless required by applicable law or agreed to in writing, software
16+
# distributed under the License is distributed on an "AS IS" BASIS,
17+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
# See the License for the specific language governing permissions and
19+
# limitations under the License.
20+
21+
# tag::custom-auth-import[]
22+
from neo4j.v1 import GraphDatabase;
23+
# end::custom-auth-import[]
24+
25+
class CustomAuthExample:
26+
# tag::custom-auth[]
27+
def __init__(self, uri, principal, credentials, realm, scheme, parameters):
28+
self._driver = GraphDatabase.driver( uri, auth=(principal, credentials, realm, scheme, parameters))
29+
# end::custom-auth[]
30+
31+
def close(self):
32+
self._driver.close()

0 commit comments

Comments
 (0)