zillabyte-cli 0.9.33 → 0.9.34

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OGZjZTEyZTYyMmFmZTY5YzIwMDU0OTIyYjkyNDM3ZmViNWFlYzQ5ZA==
5
- data.tar.gz: !binary |-
6
- YzMzMDAzYjRjYTQzNjE4YzA0NTI0MTJhYWFjYzc2ZjE2MDcwMWIwMA==
2
+ SHA1:
3
+ metadata.gz: 873b66c2ff0aefd25f8e83dd77b47ab67bbeaf11
4
+ data.tar.gz: ad39b03a444c5b52b5834de35ab2fa7641157516
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZDBhZGVmZDU5NzFlOGZmNGM4MWQ4ZTEyNmYyNDgwMzI5YTVkMjFiMjFlYjc1
10
- Zjc4OWY2YmU2MmEwN2JmY2QxZjhiMzk0NTVlYmJiODhhMjg2ZGNiNjk5OTMx
11
- OTgwYjA0M2YzNWI0OGFlZjE4NDE4OGU4YjI1ZDAyMTMwNjdlNGY=
12
- data.tar.gz: !binary |-
13
- NGQyNWUzNjVlZTFiMmRhYWNlMmU3NjJmYmMxMmRmNWRlNGM4M2YwOTE1MjFh
14
- NjAwOGFmMDJlNzc2YTA1ZmQyM2U3MTZlZGM3NzgxNTNjMTcyMWUyNTQwZmQz
15
- MGMzZDA5NjIyMDYxOGVkOGQ4ODhiNmU2Y2RkY2FmZjA1MWU2NmU=
6
+ metadata.gz: 14fdbd895bbb43c5c800a681365595a64b72875d782c6935bb062ab70592992a76a649224584283e6ad6e09dd2ff5ca8d96c0c8b1fe7e7aed94baac6f5448b8e
7
+ data.tar.gz: 45329f8e5348ab8313a688250929cf556f97ac6ca40b52c108a32ddb6f384ba4ffd09fc330660eb2bb5e2d04b4dcf6cbdc5a57726539fc551a02833e9665a725
@@ -1,5 +1,5 @@
1
1
  module Zillabyte
2
2
  module CLI
3
- VERSION = "0.9.33"
3
+ VERSION = "0.9.34"
4
4
  end
5
5
  end
data/lib/zillabyte/cli.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  module Zillabyte; module CLI
2
2
 
3
3
  def self.start(*args)
4
+ require("zillabyte/helpers")
4
5
  begin
6
+ Zillabyte::Helpers.error("We're sorry, but Zillabyte requires Ruby 1.9.3 or above.") if !Zillabyte::Helpers.version_okay?(RUBY_VERSION, "1.9.3")
5
7
  command = args.shift().strip() rescue "help"
6
8
  require("zillabyte/command")
7
9
  Zillabyte::Command.load(command)
8
10
  Zillabyte::Command.run(command, args)
9
11
  rescue Interrupt
10
12
  `stty icanon echo`
11
- require("zillabyte/helpers")
12
13
  Zillabyte::Helpers.error("Command cancelled.")
13
14
  rescue => error
14
15
  raise
@@ -171,22 +171,6 @@ class Zillabyte::Command::Base
171
171
  self
172
172
  end
173
173
 
174
- def version_okay?(current_version, min_version)
175
- current_version = current_version.split(".").map {|v| v.to_i}
176
- minimum_version = min_version.split(".").map {|v| v.to_i}
177
- if current_version[0] > minimum_version[0]
178
- return true
179
- elsif current_version[0] == minimum_version[0]
180
- if current_version[1] > minimum_version[1]
181
- return true
182
- elsif current_version[1] == minimum_version[1]
183
- return true if current_version[2] >= minimum_version[2]
184
- end
185
- end
186
- return false
187
- end
188
-
189
-
190
174
  end
191
175
 
192
176
 
@@ -7,6 +7,7 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
7
7
  MAX_POLL_SECONDS = 60 * 5
8
8
  POLL_SLEEP = 1
9
9
  APPENDS_ROWS_SLICE = 5_000;
10
+ ONE_HUNDRED_MB = 1e8;
10
11
 
11
12
  # data
12
13
  #
@@ -138,39 +139,34 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
138
139
  description = options[:description] || nil
139
140
  aliases = options[:aliases] || nil
140
141
 
141
- if type.nil?
142
- hash = get_dataset_properties(schema,is_public,description,aliases)
143
- else
144
- hash = hash_dataset_properties(schema,is_public,description,aliases, type)
145
- end
142
+ hash = get_dataset_properties(schema,is_public,description,aliases)
146
143
 
147
144
  if file
148
145
  filetype ||= File.extname(file).gsub(".", "")
149
- rows = sanity_check_file(file,filetype, {"columns" => hash[:schema]}, type)
150
- hash[:rows] = rows
146
+ n_shards = calculate_number_of_shards(file)
147
+ hash[:shards] = n_shards
148
+ display "Sharding into ~#{n_shards} shard(s) for upload. (Actual number may be smaller.)" if type.nil?
151
149
  end
152
150
 
153
151
  res = api.data.create name, hash
152
+
154
153
  if res['error']
155
154
  error("#{res['error_message']}", type)
156
155
  else
156
+ if file
157
+ row_size = save_rows(hash[:schema], file, filetype, res['uris'], type)
158
+ end
157
159
  if type == "json"
158
160
  display "{}"
159
161
  else
160
- display "dataset ##{res['id']} #{res['action']}. size: #{res['size'] || 0} rows."
162
+ display "dataset ##{res['id']} #{res['action']}. size: #{row_size || 0} rows."
161
163
  end
162
164
  end
163
-
164
165
  end
165
166
  alias_command "relations:create", "data:create"
166
167
  alias_command "relation:create", "data:create"
167
168
  alias_command "datasets:create", "data:create"
168
169
  alias_command "dataset:create", "data:create"
169
-
170
-
171
-
172
-
173
-
174
170
 
175
171
  # data:authorize [ID] [SCOPE]
176
172
  #
@@ -255,28 +251,21 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
255
251
  error("no file given", type) if file.nil?
256
252
 
257
253
  dataset = self.api.data.get(id, options)
258
- columns = dataset["columns"].map{|col| {col["index"] => col["type"]}}
259
- raw_rows = sanity_check_file(file,filetype,{"columns" => columns}, type)
254
+ schema = dataset["schema"]
255
+ n_shards = calculate_number_of_shards(file)
260
256
 
261
- total_rows = 0
262
257
  display("uploading content.", false)
263
- raw_rows.each_slice(APPENDS_ROWS_SLICE) do |rows|
264
-
265
-
266
- # TODO: post to direct signed s3 (http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/PresignedPost.html)
267
- display(".", false)
268
- require("base64")
269
- res = self.api.data.append(id, {:gzip_rows => Base64.encode64(gzip(rows.to_json()))})
270
- # res = self.api.data.append(id, {:rows => rows})
271
-
272
- break unless res["size"]
273
- total_rows += res["size"]
274
- end
258
+ res = self.api.data.append(id, {:shards => n_shards})
275
259
 
276
- if type == "json"
277
- display({:rows => total_rows}.to_json)
260
+ if res['error']
261
+ error("#{res['error_message']}", type)
278
262
  else
279
- display "dataset ##{id} appended #{total_rows} rows"
263
+ row_size = save_rows(schema, file, filetype, res['uris'], type)
264
+ if type == "json"
265
+ display({:rows => row_size}.to_json)
266
+ else
267
+ display "dataset ##{id} appended #{row_size} rows"
268
+ end
280
269
  end
281
270
 
282
271
  end
@@ -547,7 +536,7 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
547
536
  end
548
537
 
549
538
  if is_public.nil?
550
- error("specify public or private using --public")
539
+ error("specify public or private using --public", type)
551
540
  end
552
541
 
553
542
  {:schema => schema, :public => is_public, :description => description, :aliases => aliases, :output_type => type}
@@ -613,85 +602,6 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
613
602
  {:schema => schema, :public => is_public, :description => description, :aliases => aliases}
614
603
  end
615
604
 
616
- def sanity_check_file(file, filetype, dataset, type = nil)
617
- rows = []
618
-
619
- n_columns = dataset["columns"].size
620
- float_cols = []
621
- int_cols = []
622
- array_cols = []
623
- map_cols = []
624
- (0...n_columns).each do |i|
625
- value = dataset["columns"][i].values[0].downcase
626
- # use integer instead of numeric to be consistent with multilang type declarations
627
- if(value == 'integer')
628
- int_cols << i
629
- elsif(value == "float" or value == "double")
630
- float_cols << i
631
- elsif(value == "array")
632
- array_cols << i
633
- elsif(value == "map")
634
- map_cols << i
635
- end
636
- end
637
-
638
- case filetype
639
- when "csv"
640
- begin
641
- require("csv")
642
- CSV.foreach(file) do |row|
643
- if row.size != n_columns
644
- error("Dataset expects #{n_columns} column(s). Found a row with #{row.size}::\n #{row}", type)
645
- end
646
-
647
- float_cols.each do |i|
648
- if (!(row[i] =~ /^[+-]?(\d+(.\d+)?)$/))
649
- error("Column #{i+1} should be a FLOAT or DOUBLE in row ::\n #{row}", type)
650
- end
651
- end
652
-
653
- int_cols.each do |i|
654
- if (!(row[i] =~ /^[+-]?(\d+)$/))
655
- error("Column #{i+1} should be an INTEGER in row ::\n #{row}", type)
656
- end
657
- end
658
-
659
- array_cols.each do |i|
660
- err = "Column #{i+1} should be an ARRAY (i.e. [v0,v1,...]) in row ::\n #{row}\n Please remember to escape strings in the array!"
661
- begin
662
- array = JSON.parse(row[i])
663
- rescue
664
- error(err, type)
665
- end
666
- if !array.instance_of?(Array)
667
- error(err, type)
668
- end
669
- end
670
-
671
- map_cols.each do |i|
672
- err = "Column #{i+1} should be a MAP (i.e. {\"k1\":v1,\"k2\":v2,...}) in row ::\n #{row}\n Please remember to escape strings in the map!"
673
- begin
674
- map = JSON.parse(row[i])
675
- rescue
676
- error(err, type)
677
- end
678
- if !map.instance_of?(Hash)
679
- error(err, type)
680
- end
681
- end
682
- rows << row
683
- end
684
- rescue Exception => e
685
- error("error when parsing csv : #{e}", type)
686
- end
687
-
688
- else
689
- error "unsupported type: #{filetype}"
690
-
691
- end
692
- rows
693
- end
694
-
695
605
  # # relations:status ID
696
606
  # #
697
607
  # # shows status of a relation
@@ -750,6 +660,130 @@ class Zillabyte::Command::Data < Zillabyte::Command::Base
750
660
  compressed
751
661
  end
752
662
 
663
+ def sanity_check_row(row, schema, n_columns, output_type)
664
+ if row.size != n_columns
665
+ error("Dataset expects #{n_columns} column(s). Found a row with #{row.size}::\n #{row}", output_type)
666
+ end
667
+
668
+ row_hash = {}
669
+ schema.each_with_index do |col, i|
670
+ case col.values.first
671
+ when "float", "double"
672
+ if (!(row[i] =~ /^[+-]?(\d+(.\d+)?)$/))
673
+ error("Column #{i+1} should be a FLOAT or DOUBLE in row ::\n #{row}", output_type)
674
+ end
675
+ row_hash[col.keys.first] = row[i].to_f
676
+ when "integer"
677
+ if (!(row[i] =~ /^[+-]?(\d+)$/))
678
+ error("Column #{i+1} should be an INTEGER in row ::\n #{row}", output_type)
679
+ end
680
+ row_hash[col.keys.first] = row[i].to_i
681
+ when "array"
682
+ err = "Column #{i+1} should be an ARRAY (i.e. [v0,v1,...]) in row ::\n #{row}\n Please remember to escape strings in the array!"
683
+ begin
684
+ row_hash[col.keys.first] = JSON.parse(row[i])
685
+ rescue
686
+ error(err, output_type)
687
+ end
688
+ if !row[i].instance_of?(Array)
689
+ error(err, output_type)
690
+ end
691
+ when "map"
692
+ err = "Column #{i+1} should be a MAP (i.e. {\"k1\":v1,\"k2\":v2,...}) in row ::\n #{row}\n Please remember to escape strings in the map!"
693
+ begin
694
+ row_hash[col.keys.first] = JSON.parse(row[i])
695
+ rescue
696
+ error(err, output_type)
697
+ end
698
+ if !row[i].instance_of?(Hash)
699
+ error(err, output_type)
700
+ end
701
+ else
702
+ row_hash[col.keys.first] = row[i]
703
+ end
704
+ end
705
+
706
+ row_hash.to_json
707
+ end
708
+
709
+ def flush_to_s3(rows, public_uris, output_type)
710
+ require "zlib"
711
+ while(true)
712
+ begin
713
+ str = StringIO.new("")
714
+ gz = Zlib::GzipWriter.new(str)
715
+ gz.write(rows.join("\n"))
716
+ gz.finish
717
+ str.rewind
718
+ rescue Exception => e
719
+ # just retry
720
+ end
721
+ break
722
+ end
723
+
724
+ require 'net/http'
725
+ require "uri"
726
+ display("Uploading.") if output_type.nil?
727
+ uri = URI.parse(public_uris.shift)
728
+ try_again = 1
729
+ while(try_again)
730
+ begin
731
+ Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
732
+ request = Net::HTTP::Put.new(uri.request_uri)
733
+ request.body_stream = str
734
+ request['Content-Length'] = request.body_stream.size
735
+ request['Content-Type'] = ''
736
+ response = http.request(request)
737
+ if response.code.to_i >= 300
738
+ display("Received code #{response.code}...re-trying.") if output_type.nil?
739
+ try_again = 1
740
+ sleep(3)
741
+ else
742
+ try_again = nil
743
+ end
744
+ end
745
+ rescue Exception => e
746
+ try_again = 1
747
+ end
748
+ end
749
+ end
750
+
751
+ def save_rows(schema, file, filetype, public_uris, output_type)
752
+ n_columns = schema.size
753
+ n_flushes = 1
754
+ total_rows = 0
755
+ display "Checking your file and constructing shard ##{n_flushes}." if output_type.nil?
756
+ case filetype
757
+ when "csv"
758
+ require("csv")
759
+ total_size = 0
760
+ rows = []
761
+ CSV.foreach(file) do |row|
762
+ total_rows += 1
763
+ print "." if(total_rows % 10000 == 0)
764
+ total_size += row.join.bytesize
765
+ row_json = sanity_check_row(row, schema, n_columns, output_type)
766
+ rows << row_json
767
+
768
+ if total_size > ONE_HUNDRED_MB
769
+ flush_to_s3(rows, public_uris, output_type)
770
+ total_size = 0
771
+ n_flushes += 1
772
+ display "Checking your file and constructing shard ##{n_flushes}." if output_type.nil?
773
+ rows = []
774
+ end
775
+ end
776
+ flush_to_s3(rows, public_uris, output_type) if total_size > 0
777
+ else
778
+ error "unsupported type: #{filetype}", output_type
779
+ end
753
780
 
781
+ total_rows
782
+ end
783
+
784
+ def calculate_number_of_shards(file)
785
+ filesize = File.size(file)
786
+ (filesize / ONE_HUNDRED_MB + 1).floor
787
+ end
754
788
 
755
789
  end
@@ -5,7 +5,7 @@ require("zillabyte/cli/base")
5
5
  class Zillabyte::Command::Download < Zillabyte::Command::Base
6
6
 
7
7
  MIN_LOCAL_JAR_VERSION = "0.0.3"
8
- LATEST_JAR_VERSION = "0.9.33"
8
+ LATEST_JAR_VERSION = "0.9.34"
9
9
  MIN_JAVA_VERSION = "1.7.0"
10
10
 
11
11
  # --local # HIDDEN
@@ -0,0 +1,2 @@
1
+ # <%= name %>
2
+
@@ -324,6 +324,21 @@ module Zillabyte
324
324
  end
325
325
  end
326
326
 
327
+ def version_okay?(current_version, min_version)
328
+ current_version = current_version.split(".").map {|v| v.to_i}
329
+ minimum_version = min_version.split(".").map {|v| v.to_i}
330
+ if current_version[0] > minimum_version[0]
331
+ return true
332
+ elsif current_version[0] == minimum_version[0]
333
+ if current_version[1] > minimum_version[1]
334
+ return true
335
+ elsif current_version[1] == minimum_version[1]
336
+ return true if current_version[2] >= minimum_version[2]
337
+ end
338
+ end
339
+ return false
340
+ end
341
+
327
342
  end
328
343
  end
329
344
 
metadata CHANGED
@@ -1,139 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zillabyte-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.33
4
+ version: 0.9.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - zillabyte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-19 00:00:00.000000000 Z
11
+ date: 2014-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: netrc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.7.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.7.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rest-client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.6.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.6.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: excon
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0.31'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.31'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: terminal-table
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.4'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.4'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: activesupport
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: 3.2.11
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 3.2.11
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: multi_json
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: colorize
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0.6'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.6'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: indentation
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.1'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.1'
139
139
  description: The Official Zillabyte CLI Gem
@@ -194,6 +194,7 @@ files:
194
194
  - lib/zillabyte/cli/templates/apps/python/zillabyte.conf.yaml
195
195
  - lib/zillabyte/cli/templates/apps/ruby/Gemfile
196
196
  - lib/zillabyte/cli/templates/apps/ruby/README.md
197
+ - lib/zillabyte/cli/templates/apps/ruby/README.md.erb
197
198
  - lib/zillabyte/cli/templates/apps/ruby/app.rb.erb
198
199
  - lib/zillabyte/cli/templates/apps/ruby/zillabyte.conf.yaml
199
200
  - lib/zillabyte/cli/templates/components/js/simple_function.js
@@ -220,22 +221,28 @@ homepage: http://www.zillabyte.com
220
221
  licenses:
221
222
  - MIT
222
223
  metadata: {}
223
- post_install_message: ! "\nGetting Started with Zillabyte\n==============================\n\n(1)
224
- Register for an auth token at http://zillabyte.com\n(2) Log in by running 'zillabyte
225
- login' in the command line\n(3) Build an empty app by running 'zillabyte apps:init'\n
226
- \ Or... check out our Quick Starts by visiting http://docs.zillabyte.com/\n\nQuestions,
227
- comments? Please visit us at http://docs.zillabyte.com\n"
224
+ post_install_message: |2
225
+
226
+ Getting Started with Zillabyte
227
+ ==============================
228
+
229
+ (1) Register for an auth token at http://zillabyte.com
230
+ (2) Log in by running 'zillabyte login' in the command line
231
+ (3) Build an empty app by running 'zillabyte apps:init'
232
+ Or... check out our Quick Starts by visiting http://docs.zillabyte.com/
233
+
234
+ Questions, comments? Please visit us at http://docs.zillabyte.com
228
235
  rdoc_options: []
229
236
  require_paths:
230
237
  - lib
231
238
  required_ruby_version: !ruby/object:Gem::Requirement
232
239
  requirements:
233
- - - ! '>='
240
+ - - ">="
234
241
  - !ruby/object:Gem::Version
235
242
  version: '0'
236
243
  required_rubygems_version: !ruby/object:Gem::Requirement
237
244
  requirements:
238
- - - ! '>='
245
+ - - ">="
239
246
  - !ruby/object:Gem::Version
240
247
  version: '0'
241
248
  requirements: []