influxdb-client 1.0.0.beta → 1.0.0.pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +17 -57
- data/.gitignore +1 -2
- data/{LICENSE → LICENSE.txt} +0 -0
- data/README.md +27 -38
- data/bin/influxdb-restart.sh +16 -10
- data/influxdb-client.gemspec +5 -6
- data/lib/{influxdb2 → influxdb}/client.rb +5 -5
- data/lib/{influxdb2 → influxdb}/client/client.rb +6 -8
- data/lib/{influxdb2 → influxdb}/client/influx_error.rb +1 -1
- data/lib/{influxdb2 → influxdb}/client/point.rb +6 -8
- data/lib/{influxdb2 → influxdb}/client/version.rb +2 -2
- data/lib/{influxdb2 → influxdb}/client/write_api.rb +2 -12
- data/test/influxdb/client_test.rb +12 -12
- data/test/influxdb/point_test.rb +79 -101
- data/test/influxdb/write_api_integration_test.rb +8 -9
- data/test/influxdb/write_api_test.rb +52 -73
- data/test/test_helper.rb +1 -1
- metadata +15 -18
- data/.circleci/setup-rubygems.sh +0 -3
- data/CHANGELOG.md +0 -5
- data/bin/influxdb-onboarding.sh +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efaf2b6d0ecb5fb8afb2f89ae5f5453ae503d0752a84c18f0778f1b897852a4c
|
4
|
+
data.tar.gz: 1cd9c661e1ebaeb5766884dbbf8d5b4bfaac4f80e6d49e9a0be7c35e4cc82c78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76084520edb946cb367ea1bc7e30671b8921888c51631be40564510cb63993c8e8bf789caf7bc0cb6c7f363d249ba2a88805c59b4b8d3be18790951a65b4859a
|
7
|
+
data.tar.gz: 3e1c904a3e3e2a2753f5140580fdfe382908cfc5bce650387a9b0f3e513f21d848a669c0d223c2cc79b0be07d09b7374ecc9de539d0461921202412b2528cbfa
|
data/.circleci/config.yml
CHANGED
@@ -23,33 +23,28 @@
|
|
23
23
|
version: 2.1
|
24
24
|
|
25
25
|
commands:
|
26
|
-
influxdb-
|
26
|
+
influxdb-restart:
|
27
27
|
steps:
|
28
28
|
- run:
|
29
|
-
name: "
|
30
|
-
command: ./bin/influxdb-
|
29
|
+
name: "Start InfluxDB 2"
|
30
|
+
command: ./bin/influxdb-restart.sh
|
31
31
|
prepare:
|
32
32
|
description: "Prepare environment to tests"
|
33
33
|
steps:
|
34
34
|
- checkout
|
35
|
-
- influxdb-
|
35
|
+
- influxdb-restart
|
36
36
|
test:
|
37
|
-
parameters:
|
38
|
-
ruby-image:
|
39
|
-
type: string
|
40
37
|
steps:
|
41
38
|
- restore_cache:
|
42
39
|
name: Restoring Gem Cache
|
43
40
|
keys:
|
44
|
-
- &cache-key gem-cache-{{ checksum "influxdb-client.gemspec" }}
|
45
|
-
- gem-cache-{{ checksum "influxdb-client.gemspec" }}
|
41
|
+
- &cache-key gem-cache-{{ checksum "influxdb-client.gemspec" }}
|
46
42
|
- gem-cache-
|
47
43
|
- run:
|
48
44
|
name: Install dependencies
|
49
45
|
command: |
|
50
46
|
gem install bundler
|
51
|
-
bundle
|
52
|
-
bundle install --jobs=4 --retry=3
|
47
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
53
48
|
- run:
|
54
49
|
name: Static code analyze
|
55
50
|
command: |
|
@@ -72,75 +67,40 @@ commands:
|
|
72
67
|
|
73
68
|
jobs:
|
74
69
|
tests-ruby:
|
75
|
-
|
76
|
-
ruby-image:
|
77
|
-
type: string
|
78
|
-
default: &default-ruby-image "circleci/ruby:2.6-stretch"
|
79
|
-
influxdb-image:
|
80
|
-
type: string
|
81
|
-
default: &default-influxdb-image "influxdb:2.0.0-beta"
|
82
|
-
docker:
|
83
|
-
- image: << parameters.ruby-image >>
|
84
|
-
- image: &influx-image quay.io/influxdb/<< parameters.influxdb-image >>
|
70
|
+
machine: true
|
85
71
|
steps:
|
86
72
|
- prepare
|
87
|
-
- test
|
88
|
-
ruby-image: << parameters.ruby-image >>
|
73
|
+
- test
|
89
74
|
- storing-test-results
|
90
75
|
|
91
76
|
deploy-preview:
|
92
|
-
|
93
|
-
influxdb-image:
|
94
|
-
type: string
|
95
|
-
default: *default-influxdb-image
|
96
|
-
docker:
|
97
|
-
- image: *default-ruby-image
|
98
|
-
- image: *influx-image
|
77
|
+
machine: true
|
99
78
|
steps:
|
100
79
|
- run:
|
101
80
|
name: Early return if this build is from a forked repository
|
102
81
|
command: |
|
103
|
-
if [[ $CIRCLE_PROJECT_USERNAME != "
|
82
|
+
if [[ $CIRCLE_PROJECT_USERNAME != "bonitoo-io" ]]; then
|
104
83
|
echo "Nothing to do for forked repositories, so marking this step successful"
|
105
84
|
circleci step halt
|
106
85
|
fi
|
107
86
|
- checkout
|
108
87
|
- run:
|
109
|
-
name:
|
110
|
-
command: bash .circleci/setup-rubygems.sh
|
111
|
-
- run:
|
112
|
-
name: Build a Gem bundle
|
88
|
+
name: Build a gem bundle
|
113
89
|
command: |
|
114
90
|
gem build influxdb-client.gemspec
|
91
|
+
GEM_FILE_NAME=`find . -name 'influxdb-client*.pre.*.gem'`
|
115
92
|
- run:
|
116
|
-
name: Deploy
|
93
|
+
name: Deploy $GEM_FILE_NAME into https://rubygems.org
|
117
94
|
command: |
|
118
|
-
|
95
|
+
echo "TODO"
|
119
96
|
workflows:
|
120
97
|
version: 2
|
121
98
|
build:
|
122
99
|
jobs:
|
123
|
-
- tests-ruby
|
124
|
-
name: ruby-2.7
|
125
|
-
ruby-image: "circleci/ruby:2.7-buster"
|
126
|
-
- tests-ruby:
|
127
|
-
name: ruby-2.6
|
128
|
-
- tests-ruby:
|
129
|
-
name: ruby-2.6-nightly
|
130
|
-
influxdb-image: "influx:nightly"
|
131
|
-
- tests-ruby:
|
132
|
-
name: ruby-2.5
|
133
|
-
ruby-image: "circleci/ruby:2.5-stretch"
|
134
|
-
- tests-ruby:
|
135
|
-
name: ruby-2.4
|
136
|
-
ruby-image: "circleci/ruby:2.4-stretch"
|
100
|
+
- tests-ruby
|
137
101
|
- deploy-preview:
|
138
102
|
requires:
|
139
|
-
- ruby
|
140
|
-
- ruby-2.6
|
141
|
-
- ruby-2.6-nightly
|
142
|
-
- ruby-2.5
|
143
|
-
- ruby-2.4
|
103
|
+
- tests-ruby
|
144
104
|
filters:
|
145
105
|
branches:
|
146
106
|
only: master
|
@@ -154,4 +114,4 @@ workflows:
|
|
154
114
|
only:
|
155
115
|
- master
|
156
116
|
jobs:
|
157
|
-
- tests-ruby
|
117
|
+
- tests-ruby
|
data/.gitignore
CHANGED
data/{LICENSE → LICENSE.txt}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
# influxdb-client-ruby
|
2
2
|
|
3
|
-
[](https://www.influxdata.com/slack)
|
3
|
+
[](https://circleci.com/gh/bonitoo-io/influxdb-client-ruby)
|
4
|
+
[](https://codecov.io/gh/bonitoo-io/influxdb-client-ruby)
|
5
|
+
[](https://badge.fury.io/rb/influxdb_client)
|
6
|
+
[](https://github.com/bonitoo-io/influxdb-client-ruby/blob/master/LICENSE)
|
7
|
+
[](https://github.com/bonitoo-io/influxdb-client-ruby/issues)
|
8
|
+
[](https://github.com/bonitoo-io/influxdb-client-ruby/pulls)
|
10
9
|
|
11
10
|
This repository contains the reference Ruby client for the InfluxDB 2.0.
|
12
11
|
|
13
12
|
#### Note: This library is for use with InfluxDB 2.x. For connecting to InfluxDB 1.x instances, please use the [influxdb-ruby](https://github.com/influxdata/influxdb-ruby) client.
|
14
|
-
#### Disclaimer: This library is a work in progress and should not be considered production ready yet.
|
15
13
|
|
16
14
|
## Installation
|
17
15
|
|
18
|
-
The InfluxDB 2 client is bundled as a gem and is hosted on [Rubygems](https://rubygems.org/gems/
|
16
|
+
The InfluxDB 2 client is bundled as a gem and is hosted on [Rubygems](https://rubygems.org/gems/mongo).
|
19
17
|
|
20
18
|
### Install the Gem
|
21
19
|
|
@@ -24,7 +22,7 @@ The client can be installed manually or with bundler.
|
|
24
22
|
To install the client gem manually:
|
25
23
|
|
26
24
|
```
|
27
|
-
gem install
|
25
|
+
gem install influxdb_client --version 1.0.0 --pre
|
28
26
|
```
|
29
27
|
|
30
28
|
## Usage
|
@@ -34,7 +32,7 @@ gem install influxdb-client -v 1.0.0.beta
|
|
34
32
|
Use **InfluxDB::Client** to create a client connected to a running InfluxDB 2 instance.
|
35
33
|
|
36
34
|
```ruby
|
37
|
-
client =
|
35
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token')
|
38
36
|
```
|
39
37
|
|
40
38
|
#### Client Options
|
@@ -48,22 +46,21 @@ client = InfluxDB2::Client.new('https://localhost:9999', 'my-token')
|
|
48
46
|
| write_timeout | Number of seconds to wait for one block of data to be written | Integer | 10 |
|
49
47
|
| read_timeout | Number of seconds to wait for one block of data to be read | Integer | 10 |
|
50
48
|
| max_redirect_count | Maximal number of followed HTTP redirects | Integer | 10 |
|
51
|
-
| use_ssl | Turn on/off SSL for HTTP communication | bool | true |
|
52
49
|
|
53
50
|
```ruby
|
54
|
-
client =
|
55
|
-
bucket: 'my-bucket',
|
56
|
-
org: 'my-org',
|
57
|
-
precision:
|
51
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
52
|
+
bucket: 'my-bucket',
|
53
|
+
org: 'my-org',
|
54
|
+
precision: InfluxDB::WritePrecision::NANOSECOND)
|
58
55
|
```
|
59
56
|
|
60
57
|
### Writing data
|
61
58
|
|
62
59
|
```ruby
|
63
|
-
client =
|
60
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
64
61
|
bucket: 'my-bucket',
|
65
62
|
org: 'my-org',
|
66
|
-
precision:
|
63
|
+
precision: InfluxDB::WritePrecision::NANOSECOND)
|
67
64
|
|
68
65
|
write_api = client.create_write_api
|
69
66
|
write_api.write(data: 'h2o,location=west value=33i 15')
|
@@ -73,20 +70,20 @@ write_api.write(data: 'h2o,location=west value=33i 15')
|
|
73
70
|
|
74
71
|
Configure default time precision:
|
75
72
|
```ruby
|
76
|
-
client =
|
73
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
77
74
|
bucket: 'my-bucket',
|
78
75
|
org: 'my-org',
|
79
|
-
precision:
|
76
|
+
precision: InfluxDB::WritePrecision::NANOSECOND)
|
80
77
|
```
|
81
78
|
|
82
79
|
Configure precision per write:
|
83
80
|
```ruby
|
84
|
-
client =
|
81
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
85
82
|
bucket: 'my-bucket',
|
86
83
|
org: 'my-org')
|
87
84
|
|
88
85
|
write_api = client.create_write_api
|
89
|
-
write_api.write(data: 'h2o,location=west value=33i 15', precision:
|
86
|
+
write_api.write(data: 'h2o,location=west value=33i 15', precision: InfluxDB::WritePrecision::SECOND)
|
90
87
|
```
|
91
88
|
|
92
89
|
Allowed values for precision are:
|
@@ -99,15 +96,15 @@ Allowed values for precision are:
|
|
99
96
|
|
100
97
|
Default `bucket` and `organization` destination are configured via `InfluxDB::Client`:
|
101
98
|
```ruby
|
102
|
-
client =
|
99
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
103
100
|
bucket: 'my-bucket',
|
104
101
|
org: 'my-org')
|
105
102
|
```
|
106
103
|
|
107
104
|
but there is also possibility to override configuration per write:
|
108
|
-
|
105
|
+
|
109
106
|
```ruby
|
110
|
-
client =
|
107
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token')
|
111
108
|
|
112
109
|
write_api = client.create_write_api
|
113
110
|
write_api.write(data: 'h2o,location=west value=33i 15', bucket: 'production-data', org: 'customer-1')
|
@@ -119,16 +116,16 @@ The data could be written as:
|
|
119
116
|
|
120
117
|
1. `String` that is formatted as a InfluxDB's line protocol
|
121
118
|
1. `Hash` with keys: name, tags, fields and time
|
122
|
-
1. [Data Point](https://github.com/
|
119
|
+
1. [Data Point](https://github.com/bonitoo-io/influxdb-client-ruby/blob/master/lib/influxdb/client/point.rb#L28) structure
|
123
120
|
1. `Array` of above items
|
124
121
|
|
125
122
|
```ruby
|
126
|
-
client =
|
123
|
+
client = InfluxDB::Client.new('http://localhost:9999', 'my-token',
|
127
124
|
bucket: 'my-bucket',
|
128
125
|
org: 'my-org',
|
129
|
-
precision:
|
126
|
+
precision: InfluxDB::WritePrecision::NANOSECOND)
|
130
127
|
|
131
|
-
point =
|
128
|
+
point = InfluxDB::Point.new(name: 'h2o')
|
132
129
|
.add_tag('location', 'europe')
|
133
130
|
.add_field('level', 2)
|
134
131
|
|
@@ -140,17 +137,9 @@ write_api = client.create_write_api
|
|
140
137
|
write_api.write(data: ['h2o,location=west value=33i 15', point, hash])
|
141
138
|
```
|
142
139
|
|
143
|
-
## Local tests
|
144
|
-
|
145
|
-
```
|
146
|
-
brew install wget # on a mac, if not yet installed!
|
147
|
-
bin/influxdb-restart.sh
|
148
|
-
rake test
|
149
|
-
```
|
150
|
-
|
151
140
|
## Contributing
|
152
141
|
|
153
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
142
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/bonitoo-io/influxdb-client-ruby.
|
154
143
|
|
155
144
|
## License
|
156
145
|
|
data/bin/influxdb-restart.sh
CHANGED
@@ -26,13 +26,9 @@ set -e
|
|
26
26
|
DEFAULT_DOCKER_REGISTRY="quay.io/influxdb/"
|
27
27
|
DOCKER_REGISTRY="${DOCKER_REGISTRY:-$DEFAULT_DOCKER_REGISTRY}"
|
28
28
|
|
29
|
-
|
30
|
-
DEFAULT_INFLUXDB_V2_VERSION="2.0.0-beta"
|
31
|
-
INFLUXDB_V2_REPOSITORY="${INFLUXDB_V2_REPOSITORY:-$DEFAULT_INFLUXDB_V2_REPOSITORY}"
|
29
|
+
DEFAULT_INFLUXDB_V2_VERSION="nightly"
|
32
30
|
INFLUXDB_V2_VERSION="${INFLUXDB_V2_VERSION:-$DEFAULT_INFLUXDB_V2_VERSION}"
|
33
|
-
INFLUXDB_V2_IMAGE=${DOCKER_REGISTRY}
|
34
|
-
|
35
|
-
SCRIPT_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
|
31
|
+
INFLUXDB_V2_IMAGE=${DOCKER_REGISTRY}influx:${INFLUXDB_V2_VERSION}
|
36
32
|
|
37
33
|
docker kill influxdb_v2 || true
|
38
34
|
docker rm influxdb_v2 || true
|
@@ -54,7 +50,17 @@ docker run \
|
|
54
50
|
--publish 9999:9999 \
|
55
51
|
"${INFLUXDB_V2_IMAGE}"
|
56
52
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
53
|
+
echo "Wait to start InfluxDB 2.0"
|
54
|
+
wget -S --spider --tries=20 --retry-connrefused --waitretry=5 http://localhost:9999/metrics
|
55
|
+
|
56
|
+
echo
|
57
|
+
echo "Post onBoarding request, to setup initial user (my-user@my-password), org (my-org) and bucketSetup (my-bucket)"
|
58
|
+
echo
|
59
|
+
curl -i -X POST http://localhost:9999/api/v2/setup -H 'accept: application/json' \
|
60
|
+
-d '{
|
61
|
+
"username": "my-user",
|
62
|
+
"password": "my-password",
|
63
|
+
"org": "my-org",
|
64
|
+
"bucket": "my-bucket",
|
65
|
+
"token": "my-token"
|
66
|
+
}'
|
data/influxdb-client.gemspec
CHANGED
@@ -20,27 +20,26 @@
|
|
20
20
|
|
21
21
|
lib = File.expand_path('lib', __dir__)
|
22
22
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
23
|
-
require '
|
23
|
+
require 'influxdb/client/version'
|
24
24
|
|
25
25
|
Gem::Specification.new do |spec|
|
26
26
|
spec.name = 'influxdb-client'
|
27
|
-
spec.version = ENV['CIRCLE_BUILD_NUM'] ? "#{
|
27
|
+
spec.version = ENV['CIRCLE_BUILD_NUM'] ? "#{InfluxDB::VERSION}-#{ENV['CIRCLE_BUILD_NUM']}" : InfluxDB::VERSION
|
28
28
|
spec.authors = ['Jakub Bednar']
|
29
29
|
spec.email = ['jakub.bednar@gmail.com']
|
30
30
|
|
31
31
|
spec.summary = 'Ruby library for InfluxDB 2.'
|
32
32
|
spec.description = 'This is the official Ruby library for InfluxDB 2.'
|
33
|
-
spec.homepage = 'https://github.com/
|
33
|
+
spec.homepage = 'https://github.com/bonitoo-io/influxdb-client-ruby'
|
34
34
|
spec.license = 'MIT'
|
35
35
|
|
36
36
|
spec.metadata['homepage_uri'] = spec.homepage
|
37
|
-
spec.metadata['source_code_uri'] = 'https://github.com/
|
38
|
-
spec.metadata['changelog_uri'] = 'https://raw.githubusercontent.com/
|
37
|
+
spec.metadata['source_code_uri'] = 'https://github.com/bonitoo-io/influxdb-client-ruby'
|
38
|
+
spec.metadata['changelog_uri'] = 'https://raw.githubusercontent.com/bonitoo-io/influxdb-client-ruby/master/CHANGELOG.md'
|
39
39
|
|
40
40
|
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
41
41
|
spec.test_files = spec.files.grep(%r{^(test|spec|features|smoke)/})
|
42
42
|
spec.require_paths = ['lib']
|
43
|
-
spec.required_ruby_version = '>= 2.2.0'
|
44
43
|
|
45
44
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
46
45
|
spec.add_development_dependency 'codecov', '~> 0.1.16'
|
@@ -18,8 +18,8 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
require '
|
22
|
-
require '
|
23
|
-
require '
|
24
|
-
require '
|
25
|
-
require '
|
21
|
+
require 'influxdb/client/version'
|
22
|
+
require 'influxdb/client/client'
|
23
|
+
require 'influxdb/client/influx_error'
|
24
|
+
require 'influxdb/client/write_api'
|
25
|
+
require 'influxdb/client/point'
|
@@ -17,9 +17,8 @@
|
|
17
17
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
|
-
require 'net/http'
|
21
20
|
|
22
|
-
module
|
21
|
+
module InfluxDB
|
23
22
|
# The client is the entry point to HTTP API defined
|
24
23
|
# in https://github.com/influxdata/influxdb/blob/master/http/swagger.yml.
|
25
24
|
class Client
|
@@ -29,11 +28,11 @@ module InfluxDB2
|
|
29
28
|
# Instantiate a new InfluxDB client.
|
30
29
|
#
|
31
30
|
# @example Instantiate a client.
|
32
|
-
# InfluxDBClient::Client.new(url: '
|
31
|
+
# InfluxDBClient::Client.new(url: 'http://localhost:9999', token: 'my-token')
|
33
32
|
#
|
34
33
|
# @param [Hash] options The options to be used by the client.
|
35
|
-
# @param [String] url InfluxDB
|
36
|
-
# @param [String] token
|
34
|
+
# @param [String] url InfluxDB server API url (ex. http://localhost:9999).
|
35
|
+
# @param [String] token authentication token
|
37
36
|
#
|
38
37
|
# @option options [String] :bucket the default destination bucket for writes
|
39
38
|
# @option options [String] :org the default organization bucket for writes
|
@@ -42,7 +41,6 @@ module InfluxDB2
|
|
42
41
|
# @option options [Integer] :write_timeout Number of seconds to wait for one block of data to be written
|
43
42
|
# @option options [Integer] :read_timeout Number of seconds to wait for one block of data to be read
|
44
43
|
# @option options [Integer] :max_redirect_count Maximal number of followed HTTP redirects
|
45
|
-
# @option options [bool] :use_ssl Turn on/off SSL for HTTP communication
|
46
44
|
# the body line-protocol
|
47
45
|
def initialize(url, token, options = nil)
|
48
46
|
@options = options ? options.dup : {}
|
@@ -50,7 +48,7 @@ module InfluxDB2
|
|
50
48
|
@options[:token] = token if token.is_a? String
|
51
49
|
@closed = false
|
52
50
|
|
53
|
-
at_exit { close
|
51
|
+
at_exit { close }
|
54
52
|
end
|
55
53
|
|
56
54
|
# Write time series data into InfluxDB thought WriteApi.
|
@@ -63,7 +61,7 @@ module InfluxDB2
|
|
63
61
|
# Close all connections into InfluxDB 2.
|
64
62
|
#
|
65
63
|
# @return [ true ] Always true.
|
66
|
-
def close
|
64
|
+
def close
|
67
65
|
@closed = true
|
68
66
|
true
|
69
67
|
end
|