comma-heaven 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "activerecord", "< 3.0.0"
4
- gem "actionpack", "< 3.0.0"
3
+ gem "activerecord", "< 4.0.0"
4
+ gem "actionpack", "< 4.0.0"
5
5
  gem "fastercsv" unless RUBY_VERSION > "1.9"
6
6
 
7
7
  group :development do
@@ -12,4 +12,5 @@ group :development do
12
12
  gem 'simplecov', :require => false
13
13
  gem 'sqlite3'
14
14
  gem 'mysql2', '0.2.7'
15
+ gem 'awesome_print'
15
16
  end
data/Gemfile.lock CHANGED
@@ -1,46 +1,80 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- actionpack (2.3.14)
5
- activesupport (= 2.3.14)
6
- rack (~> 1.1.0)
7
- activerecord (2.3.14)
8
- activesupport (= 2.3.14)
9
- activesupport (2.3.14)
4
+ actionpack (3.2.9)
5
+ activemodel (= 3.2.9)
6
+ activesupport (= 3.2.9)
7
+ builder (~> 3.0.0)
8
+ erubis (~> 2.7.0)
9
+ journey (~> 1.0.4)
10
+ rack (~> 1.4.0)
11
+ rack-cache (~> 1.2)
12
+ rack-test (~> 0.6.1)
13
+ sprockets (~> 2.2.1)
14
+ activemodel (3.2.9)
15
+ activesupport (= 3.2.9)
16
+ builder (~> 3.0.0)
17
+ activerecord (3.2.9)
18
+ activemodel (= 3.2.9)
19
+ activesupport (= 3.2.9)
20
+ arel (~> 3.0.2)
21
+ tzinfo (~> 0.3.29)
22
+ activesupport (3.2.9)
23
+ i18n (~> 0.6)
24
+ multi_json (~> 1.0)
25
+ arel (3.0.2)
26
+ awesome_print (1.1.0)
27
+ builder (3.0.4)
10
28
  diff-lcs (1.1.3)
29
+ erubis (2.7.0)
11
30
  git (1.2.5)
31
+ hike (1.2.1)
32
+ i18n (0.6.1)
12
33
  jeweler (1.8.4)
13
34
  bundler (~> 1.0)
14
35
  git (>= 1.2.5)
15
36
  rake
16
37
  rdoc
38
+ journey (1.0.4)
17
39
  json (1.7.5)
18
- multi_json (1.3.6)
40
+ multi_json (1.3.7)
19
41
  mysql2 (0.2.7)
20
- rack (1.1.3)
21
- rake (0.9.2.2)
42
+ rack (1.4.1)
43
+ rack-cache (1.2)
44
+ rack (>= 0.4)
45
+ rack-test (0.6.2)
46
+ rack (>= 1.0)
47
+ rake (10.0.0)
22
48
  rdoc (3.12)
23
49
  json (~> 1.4)
24
- rspec (2.11.0)
25
- rspec-core (~> 2.11.0)
26
- rspec-expectations (~> 2.11.0)
27
- rspec-mocks (~> 2.11.0)
28
- rspec-core (2.11.1)
29
- rspec-expectations (2.11.3)
50
+ rspec (2.12.0)
51
+ rspec-core (~> 2.12.0)
52
+ rspec-expectations (~> 2.12.0)
53
+ rspec-mocks (~> 2.12.0)
54
+ rspec-core (2.12.0)
55
+ rspec-expectations (2.12.0)
30
56
  diff-lcs (~> 1.1.3)
31
- rspec-mocks (2.11.3)
57
+ rspec-mocks (2.12.0)
32
58
  simplecov (0.7.1)
33
59
  multi_json (~> 1.0)
34
60
  simplecov-html (~> 0.7.1)
35
61
  simplecov-html (0.7.1)
62
+ sprockets (2.2.1)
63
+ hike (~> 1.2)
64
+ multi_json (~> 1.0)
65
+ rack (~> 1.0)
66
+ tilt (~> 1.1, != 1.3.0)
36
67
  sqlite3 (1.3.6)
68
+ tilt (1.3.3)
69
+ tzinfo (0.3.35)
37
70
 
38
71
  PLATFORMS
39
72
  ruby
40
73
 
41
74
  DEPENDENCIES
42
- actionpack (< 3.0.0)
43
- activerecord (< 3.0.0)
75
+ actionpack (< 4.0.0)
76
+ activerecord (< 4.0.0)
77
+ awesome_print
44
78
  bundler (>= 1.0.0)
45
79
  jeweler (~> 1.8.3)
46
80
  mysql2 (= 0.2.7)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.3
1
+ 0.8.0
data/comma-heaven.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "comma-heaven"
8
- s.version = "0.7.3"
8
+ s.version = "0.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Silvano Stralla"]
12
- s.date = "2012-10-22"
12
+ s.date = "2012-11-14"
13
13
  s.description = "CommaHeaven permits easy exports of Rails models to CSV"
14
14
  s.email = "silvano.stralla@sistrall.it"
15
15
  s.extra_rdoc_files = [
@@ -56,8 +56,8 @@ Gem::Specification.new do |s|
56
56
  s.specification_version = 3
57
57
 
58
58
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
- s.add_runtime_dependency(%q<activerecord>, ["< 3.0.0"])
60
- s.add_runtime_dependency(%q<actionpack>, ["< 3.0.0"])
59
+ s.add_runtime_dependency(%q<activerecord>, ["< 4.0.0"])
60
+ s.add_runtime_dependency(%q<actionpack>, ["< 4.0.0"])
61
61
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
62
62
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
63
63
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
@@ -65,9 +65,10 @@ Gem::Specification.new do |s|
65
65
  s.add_development_dependency(%q<simplecov>, [">= 0"])
66
66
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
67
67
  s.add_development_dependency(%q<mysql2>, ["= 0.2.7"])
68
+ s.add_development_dependency(%q<awesome_print>, [">= 0"])
68
69
  else
69
- s.add_dependency(%q<activerecord>, ["< 3.0.0"])
70
- s.add_dependency(%q<actionpack>, ["< 3.0.0"])
70
+ s.add_dependency(%q<activerecord>, ["< 4.0.0"])
71
+ s.add_dependency(%q<actionpack>, ["< 4.0.0"])
71
72
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
72
73
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
73
74
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -75,10 +76,11 @@ Gem::Specification.new do |s|
75
76
  s.add_dependency(%q<simplecov>, [">= 0"])
76
77
  s.add_dependency(%q<sqlite3>, [">= 0"])
77
78
  s.add_dependency(%q<mysql2>, ["= 0.2.7"])
79
+ s.add_dependency(%q<awesome_print>, [">= 0"])
78
80
  end
79
81
  else
80
- s.add_dependency(%q<activerecord>, ["< 3.0.0"])
81
- s.add_dependency(%q<actionpack>, ["< 3.0.0"])
82
+ s.add_dependency(%q<activerecord>, ["< 4.0.0"])
83
+ s.add_dependency(%q<actionpack>, ["< 4.0.0"])
82
84
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
83
85
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
84
86
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -86,6 +88,7 @@ Gem::Specification.new do |s|
86
88
  s.add_dependency(%q<simplecov>, [">= 0"])
87
89
  s.add_dependency(%q<sqlite3>, [">= 0"])
88
90
  s.add_dependency(%q<mysql2>, ["= 0.2.7"])
91
+ s.add_dependency(%q<awesome_print>, [">= 0"])
89
92
  end
90
93
  end
91
94
 
data/lib/comma-heaven.rb CHANGED
@@ -17,4 +17,9 @@ require 'comma-heaven/sqler/belongs_to_columns'
17
17
  require 'comma-heaven/export'
18
18
 
19
19
  ActiveRecord::Base.send(:extend, CommaHeaven::Export::Implementation)
20
- ActiveRecord::Base.send(:extend, CommaHeaven::ActiveRecord::ClassMethods)
20
+
21
+ case ActiveRecord::VERSION::MAJOR
22
+ when 1 then ActiveRecord::Base.send(:extend, CommaHeaven::ActiveRecord::ClassMethods::Rails1)
23
+ when 2 then ActiveRecord::Base.send(:extend, CommaHeaven::ActiveRecord::ClassMethods::Rails2)
24
+ else ActiveRecord::Base.send(:extend, CommaHeaven::ActiveRecord::ClassMethods::Rails3)
25
+ end
@@ -1,47 +1,95 @@
1
1
  module CommaHeaven
2
2
  module ActiveRecord
3
3
  module ClassMethods
4
- def self.extended(base)
5
- base.class_eval do
6
- base.class_inheritable_accessor :comma_heaven_columns
7
- base.comma_heaven_columns = []
4
+ module Rails3
5
+ def self.extended(base)
6
+ base.class_eval do
7
+ base.class_attribute :comma_heaven_columns
8
+ base.comma_heaven_columns = []
9
+
10
+ base.class_attribute :comma_heaven_associations
11
+ base.comma_heaven_associations = []
12
+ end
13
+ end
14
+
15
+ def to_comma_heaven(options = {})
16
+ options.symbolize_keys!
17
+ options[:limit] = options[:limit].to_i if options[:limit].kind_of?(String)
18
+ options[:converter] ||= lambda { |v| v }
8
19
 
9
- base.class_inheritable_accessor :comma_heaven_associations
10
- base.comma_heaven_associations = []
20
+ FasterCSV::Table.new([]).tap do |table|
21
+ columns = CommaHeaven::Sqler::Columns.new(self, options[:export])
22
+ headers = columns.sql_as
23
+
24
+ ids = select("#{table_name}.#{primary_key}").limit(options[:limit]).all.map(&:id)
25
+
26
+ unscoped do
27
+ where(["#{columns.table_alias}.#{primary_key} IN (?)", ids]).limit(options[:limit]).joins(columns.joins).select(columns.select).all.each do |resource|
28
+ fields = columns.sql_as.inject([]) do |acc, field|
29
+ value = resource.send(field)
30
+
31
+ if options[:format]
32
+ begin
33
+ value = value.to_time.strftime(options[:format][:datetime]) if value =~ %r{^(\d{4,4})-(\d{2,2})-(\d{2,2})} && options[:format][:datetime]
34
+ rescue
35
+ end
36
+ end
37
+
38
+ acc << options[:converter].call(value)
39
+ end
40
+
41
+ table << FasterCSV::Row.new(headers, fields)
42
+ end
43
+ end
44
+ end
11
45
  end
12
46
  end
13
-
14
- def to_comma_heaven(options = {})
15
- options.symbolize_keys!
16
- options[:limit] = options[:limit].to_i if options[:limit].kind_of?(String)
17
- options[:converter] ||= lambda { |v| v }
18
-
19
- FasterCSV::Table.new([]).tap do |table|
20
- columns = CommaHeaven::Sqler::Columns.new(self, options[:export])
21
- headers = columns.sql_as
22
47
 
23
- ids = find(:all, :select => "#{table_name}.#{primary_key}", :limit => options[:limit]).map(&:id)
48
+ module Rails2
49
+ def self.extended(base)
50
+ base.class_eval do
51
+ base.class_inheritable_accessor :comma_heaven_columns
52
+ base.comma_heaven_columns = []
53
+
54
+ base.class_inheritable_accessor :comma_heaven_associations
55
+ base.comma_heaven_associations = []
56
+ end
57
+ end
58
+
59
+ def to_comma_heaven(options = {})
60
+ options.symbolize_keys!
61
+ options[:limit] = options[:limit].to_i if options[:limit].kind_of?(String)
62
+ options[:converter] ||= lambda { |v| v }
24
63
 
25
- with_exclusive_scope do
26
- find(:all, :conditions => ["#{columns.table_alias}.#{primary_key} IN (?)", ids], :limit => options[:limit], :joins => columns.joins, :select => columns.select).each do |resource|
27
- fields = columns.sql_as.inject([]) do |acc, field|
28
- value = resource.send(field)
29
-
30
- if options[:format]
31
- begin
32
- value = value.to_time.strftime(options[:format][:datetime]) if value =~ %r{^(\d{4,4})-(\d{2,2})-(\d{2,2})} && options[:format][:datetime]
33
- rescue
64
+ FasterCSV::Table.new([]).tap do |table|
65
+ columns = CommaHeaven::Sqler::Columns.new(self, options[:export])
66
+ headers = columns.sql_as
67
+
68
+ ids = find(:all, :select => "#{table_name}.#{primary_key}", :limit => options[:limit]).map(&:id)
69
+
70
+ with_exclusive_scope do
71
+ find(:all, :conditions => ["#{columns.table_alias}.#{primary_key} IN (?)", ids], :limit => options[:limit], :joins => columns.joins, :select => columns.select).each do |resource|
72
+ fields = columns.sql_as.inject([]) do |acc, field|
73
+ value = resource.send(field)
74
+
75
+ if options[:format]
76
+ begin
77
+ value = value.to_time.strftime(options[:format][:datetime]) if value =~ %r{^(\d{4,4})-(\d{2,2})-(\d{2,2})} && options[:format][:datetime]
78
+ rescue
79
+ end
34
80
  end
81
+
82
+ acc << options[:converter].call(value)
35
83
  end
36
84
 
37
- acc << options[:converter].call(value)
85
+ table << FasterCSV::Row.new(headers, fields)
38
86
  end
39
-
40
- table << FasterCSV::Row.new(headers, fields)
41
87
  end
42
88
  end
43
89
  end
44
90
  end
91
+
92
+ Rails1 = Rails2
45
93
  end
46
94
  end
47
95
  end
@@ -4,7 +4,27 @@ module CommaHeaven
4
4
  class Export
5
5
  module Implementation
6
6
  def export(options = {})
7
- Export.new(self, scope(:find), options)
7
+ Export.new(self, export_scope, options)
8
+ end
9
+
10
+ module Rails3
11
+ def export_scope
12
+ scoped
13
+ end
14
+ end
15
+
16
+ module Rails2
17
+ def export_scope
18
+ scoped(scope(:find))
19
+ end
20
+ end
21
+
22
+ Rails1 = Rails2
23
+
24
+ case ::ActiveRecord::VERSION::MAJOR
25
+ when 1 then include Rails1
26
+ when 2 then include Rails2
27
+ else include Rails3
8
28
  end
9
29
  end
10
30
 
@@ -31,7 +51,9 @@ module CommaHeaven
31
51
  csv_options = all_options.slice(*FasterCSV::DEFAULT_OPTIONS.keys)
32
52
  tch_options = all_options.except(*FasterCSV::DEFAULT_OPTIONS.keys) # TCH means To Comma Heaven
33
53
 
34
- klass.scoped(current_scope).to_comma_heaven(tch_options.symbolize_keys).to_csv(csv_options.symbolize_keys)
54
+ current_scope
55
+ .to_comma_heaven(tch_options.symbolize_keys)
56
+ .to_csv(csv_options.symbolize_keys)
35
57
  end
36
58
 
37
59
  private
@@ -12,6 +12,10 @@ module CommaHeaven
12
12
  self.index = index
13
13
  super(association.klass, export, options)
14
14
  end
15
+
16
+ def foreign_key_for(an_association)
17
+ an_association.respond_to?(:foreign_key) ? an_association.foreign_key : an_association.primary_key_name
18
+ end
15
19
  end
16
20
  end
17
21
  end
@@ -4,7 +4,7 @@ module CommaHeaven
4
4
  def join_clause
5
5
  <<-EOS
6
6
  LEFT JOIN #{quote(table)} AS #{table_alias}
7
- ON #{table_alias}.#{model.primary_key} = #{parent.table_alias}.#{association.primary_key_name}
7
+ ON #{table_alias}.#{model.primary_key} = #{parent.table_alias}.#{foreign_key_for(association)}
8
8
  EOS
9
9
  end
10
10
  end
@@ -7,14 +7,14 @@ module CommaHeaven
7
7
  join = if association.options[:through]
8
8
  <<-EOS
9
9
  LEFT JOIN #{association.through_reflection.table_name} AS _#{association.through_reflection.table_name}#{table_alias}
10
- ON #{parent.table_alias}.#{model.primary_key} = _#{association.through_reflection.table_name}#{table_alias}.#{association.primary_key_name}
10
+ ON #{parent.table_alias}.#{model.primary_key} = _#{association.through_reflection.table_name}#{table_alias}.#{foreign_key_for(association.through_reflection)}
11
11
  LEFT JOIN #{quote(table)} AS #{table_alias}
12
12
  ON _#{association.through_reflection.table_name}#{table_alias}.#{model.primary_key} = #{table_alias}.#{association.through_reflection.association_foreign_key}
13
13
  EOS
14
14
  else
15
15
  <<-EOS
16
16
  LEFT JOIN #{quote(table)} AS #{table_alias}
17
- ON #{parent.table_alias}.#{model.primary_key} = #{table_alias}.#{association.primary_key_name}
17
+ ON #{parent.table_alias}.#{model.primary_key} = #{table_alias}.#{foreign_key_for(association)}
18
18
  EOS
19
19
  end
20
20
 
@@ -25,12 +25,12 @@ module CommaHeaven
25
25
  ( SELECT #{association.quoted_table_name}.#{association.klass.primary_key}
26
26
  FROM #{association.quoted_table_name}
27
27
  JOIN #{association.through_reflection.table_name} ON #{association.quoted_table_name}.#{association.through_reflection.association_foreign_key} = #{association.through_reflection.table_name}.#{association.through_reflection.klass.primary_key}
28
- WHERE #{association.primary_key_name} = #{parent.table_alias}.#{model.primary_key}
28
+ WHERE #{foreign_key_for(association.through_reflection)} = #{parent.table_alias}.#{model.primary_key}
29
29
  LIMIT #{index}, 1 )
30
30
  EOS
31
31
  else
32
32
  <<-EOS
33
- AND #{table_alias}.#{association.klass.primary_key} = (SELECT #{association.klass.primary_key} FROM #{association.quoted_table_name} WHERE #{association.primary_key_name} = #{parent.table_alias}.#{model.primary_key} LIMIT #{index}, 1)
33
+ AND #{table_alias}.#{association.klass.primary_key} = (SELECT #{association.klass.primary_key} FROM #{association.quoted_table_name} WHERE #{foreign_key_for(association)} = #{parent.table_alias}.#{model.primary_key} LIMIT #{index}, 1)
34
34
  EOS
35
35
  end
36
36
  end
@@ -4,7 +4,7 @@ module CommaHeaven
4
4
  def join_clause
5
5
  <<-EOS
6
6
  LEFT JOIN #{quote(table)} AS #{table_alias}
7
- ON #{parent.table_alias}.#{model.primary_key} = #{table_alias}.#{association.primary_key_name}
7
+ ON #{parent.table_alias}.#{model.primary_key} = #{table_alias}.#{foreign_key_for(association)}
8
8
  EOS
9
9
  end
10
10
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require "awesome_print"
1
2
  require 'simplecov'
2
3
  SimpleCov.start
3
4
 
@@ -17,6 +18,8 @@ ActiveRecord::Base.configurations = true
17
18
 
18
19
  ActiveRecord::Schema.verbose = false
19
20
 
21
+ puts ActiveRecord::VERSION::MAJOR
22
+
20
23
  RSpec.configure do |config|
21
24
  config.before(:all) do
22
25
  ActiveRecord::Schema.define(:version => 1) do
@@ -69,10 +72,19 @@ RSpec.configure do |config|
69
72
  belongs_to :gardener
70
73
  has_many :leafs, :dependent => :destroy
71
74
  has_many :matching_o_leafs, :class_name => 'Leaf', :conditions => ['position LIKE ?', '%o%']
72
-
73
- named_scope :that_begins_with_o, {:conditions => ['name LIKE ?', 'o%']}
74
75
  end
75
76
 
77
+ case ActiveRecord::VERSION::MAJOR
78
+ when 1, 2
79
+ class Tree < ActiveRecord::Base
80
+ named_scope :that_begins_with_o, {:conditions => ['name LIKE ?', 'o%']}
81
+ end
82
+ else
83
+ class Tree < ActiveRecord::Base
84
+ scope :that_begins_with_o, {:conditions => ['name LIKE ?', 'o%']}
85
+ end
86
+ end
87
+
76
88
  class Leaf < ActiveRecord::Base
77
89
  belongs_to :tree
78
90
  has_many :cells
@@ -81,7 +93,7 @@ RSpec.configure do |config|
81
93
  class Cell < ActiveRecord::Base
82
94
  belongs_to :leaf
83
95
  end
84
-
96
+
85
97
  Gardener.destroy_all
86
98
  GardenerClone.destroy_all
87
99
  Tree.destroy_all
@@ -89,12 +101,12 @@ RSpec.configure do |config|
89
101
  Cell.destroy_all
90
102
  end
91
103
 
92
- config.after(:each) do
93
- Object.send(:remove_const, :Gardener)
94
- Object.send(:remove_const, :Tree)
95
- Object.send(:remove_const, :Leaf)
96
- Object.send(:remove_const, :Cell)
97
- end
104
+ # config.after(:each) do
105
+ # Object.send(:remove_const, :Gardener)
106
+ # Object.send(:remove_const, :Tree)
107
+ # Object.send(:remove_const, :Leaf)
108
+ # Object.send(:remove_const, :Cell)
109
+ # end
98
110
 
99
111
  config.after(:all) do
100
112
  ActiveRecord::Schema.define(:version => 2) do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: comma-heaven
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.7.3
5
+ version: 0.8.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Silvano Stralla
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-10-22 00:00:00 Z
13
+ date: 2012-11-14 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - <
21
21
  - !ruby/object:Gem::Version
22
- version: 3.0.0
22
+ version: 4.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: *id001
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - <
32
32
  - !ruby/object:Gem::Version
33
- version: 3.0.0
33
+ version: 4.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: *id002
@@ -111,6 +111,17 @@ dependencies:
111
111
  type: :development
112
112
  prerelease: false
113
113
  version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: awesome_print
116
+ requirement: &id010 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *id010
114
125
  description: CommaHeaven permits easy exports of Rails models to CSV
115
126
  email: silvano.stralla@sistrall.it
116
127
  executables: []
@@ -162,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
173
  requirements:
163
174
  - - ">="
164
175
  - !ruby/object:Gem::Version
165
- hash: 2399762168738389712
176
+ hash: -4302887848545016982
166
177
  segments:
167
178
  - 0
168
179
  version: "0"