version_compare 0.1.1 → 0.2.0

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.
Files changed (53) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +11 -0
  3. data/.travis.yml +21 -0
  4. data/CHANGELOG.md +10 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +51 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +84 -63
  9. data/Rakefile +6 -28
  10. data/bin/console +15 -0
  11. data/bin/setup +8 -0
  12. data/lib/version_compare.rb +3 -3
  13. data/lib/version_compare/comparable_version.rb +66 -55
  14. data/lib/version_compare/conversions.rb +34 -32
  15. data/lib/version_compare/version.rb +3 -0
  16. data/version_compare.gemspec +40 -0
  17. metadata +108 -98
  18. data/MIT-LICENSE +0 -20
  19. data/test/comparable_version_test.rb +0 -188
  20. data/test/conversions_test.rb +0 -82
  21. data/test/dummy/README.rdoc +0 -28
  22. data/test/dummy/Rakefile +0 -6
  23. data/test/dummy/app/assets/javascripts/application.js +0 -13
  24. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  25. data/test/dummy/app/controllers/application_controller.rb +0 -5
  26. data/test/dummy/app/helpers/application_helper.rb +0 -2
  27. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  28. data/test/dummy/bin/bundle +0 -3
  29. data/test/dummy/bin/rails +0 -4
  30. data/test/dummy/bin/rake +0 -4
  31. data/test/dummy/config.ru +0 -4
  32. data/test/dummy/config/application.rb +0 -29
  33. data/test/dummy/config/boot.rb +0 -5
  34. data/test/dummy/config/database.yml +0 -25
  35. data/test/dummy/config/environment.rb +0 -5
  36. data/test/dummy/config/environments/development.rb +0 -29
  37. data/test/dummy/config/environments/production.rb +0 -80
  38. data/test/dummy/config/environments/test.rb +0 -36
  39. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  40. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  41. data/test/dummy/config/initializers/inflections.rb +0 -16
  42. data/test/dummy/config/initializers/mime_types.rb +0 -5
  43. data/test/dummy/config/initializers/secret_token.rb +0 -12
  44. data/test/dummy/config/initializers/session_store.rb +0 -3
  45. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  46. data/test/dummy/config/locales/en.yml +0 -23
  47. data/test/dummy/config/routes.rb +0 -56
  48. data/test/dummy/log/test.log +0 -0
  49. data/test/dummy/public/404.html +0 -58
  50. data/test/dummy/public/422.html +0 -58
  51. data/test/dummy/public/500.html +0 -57
  52. data/test/dummy/public/favicon.ico +0 -0
  53. data/test/test_helper.rb +0 -13
@@ -1,5 +1,5 @@
1
- require "version_compare/conversions"
2
-
3
1
  module VersionCompare
4
- autoload :ComparableVersion, "version_compare/comparable_version"
5
2
  end
3
+
4
+ require "version_compare/conversions"
5
+ require "version_compare/comparable_version"
@@ -1,71 +1,82 @@
1
- class ComparableVersion
2
- DEFAULT_SEPARATOR = ".".freeze
1
+ module VersionCompare
2
+ # VersionCompare::ComparableVersion objects compare themselves with other
3
+ # VersionCompare::ComparableVersion objects.
4
+ #
5
+ # @attr value [#to_comparable_version, #to_ary, #to_s] the Version object
6
+ class ComparableVersion
7
+ DEFAULT_SEPARATOR = ".".freeze
8
+ NAMES = %i[major minor tiny patch].freeze
3
9
 
4
- include Comparable
10
+ include Comparable
5
11
 
6
- # ComparableVersion component names
7
- NAMES = [:major, :minor, :tiny, :patch].freeze
12
+ attr_accessor(*NAMES)
13
+ attr_reader :separator
8
14
 
9
- attr_accessor *NAMES
10
- attr_reader :separator
15
+ def initialize(value, separator: DEFAULT_SEPARATOR)
16
+ @separator = separator
11
17
 
12
- def initialize(value, options = {})
13
- @separator = options.fetch(:separator) { DEFAULT_SEPARATOR }
18
+ @major, @minor, @tiny, @patch =
19
+ if value.respond_to?(:to_comparable_version)
20
+ value.to_comparable_version.to_a
21
+ elsif value.respond_to?(:to_ary)
22
+ value.to_ary.map(&:to_i)
23
+ else
24
+ value.to_s.split(separator).map(&:to_i)
25
+ end
26
+ end
14
27
 
15
- @major, @minor, @tiny, @patch =
16
- if value.respond_to?(:to_comparable_version)
17
- value.to_comparable_version.to_a
18
- elsif value.respond_to?(:to_ary)
19
- value.to_ary.map(&:to_i)
20
- else
21
- value.to_s.split(separator).map(&:to_i)
22
- end
23
- end
28
+ def inspect
29
+ "<#{identification}>"
30
+ end
24
31
 
25
- def inspect
26
- "<#{identification}>"
27
- end
32
+ # Implicit conversion method.
33
+ #
34
+ # @return [VersionCompare::ComparableVersion] self
35
+ def to_comparable_version
36
+ self
37
+ end
28
38
 
29
- # Implicit conversion method
30
- def to_comparable_version
31
- self
32
- end
39
+ # @return [String] a String representation of the version
40
+ def to_s
41
+ NAMES.map { |name| public_send(name) }.compact.join(separator)
42
+ end
43
+ alias :to_str :to_s
33
44
 
34
- def to_s
35
- NAMES.map { |name| public_send(name) }.compact.join(separator)
36
- end
37
- alias :to_str :to_s
45
+ # @return [Array] an Array representation of the version's parts
46
+ def to_a
47
+ NAMES.map { |name| public_send(name) }.compact
48
+ end
49
+ alias :to_ary :to_a
38
50
 
39
- def to_a
40
- NAMES.map { |name| public_send(name) }.compact
41
- end
42
- alias :to_ary :to_a
51
+ # ComparableVersion components comparison method. Uses Comparable to assess
52
+ # whether this ComparableVersion's component value or the other
53
+ # ComparableVersion's component value is greater or lesser. The first value
54
+ # to be found as greater or lesser determines which ComparableVersion
55
+ # object is greater or lesser.
56
+ #
57
+ # Missing ComparableVersion components are treated as 0 values, which
58
+ # effectively gives them no weight in the comparison.
59
+ #
60
+ # @params [ComparableVersion] other the other ComparableVersion object we
61
+ # are comparing with
62
+ def <=>(other)
63
+ NAMES.each do |name|
64
+ result = send(name).to_i <=> other.send(name).to_i
65
+ return result unless result.zero?
66
+ end
43
67
 
44
- # ComparableVersion components comparison method. Uses Comparable to assess whether
45
- # This ComparableVersion's component value or the other ComparableVersion's component value is
46
- # greater or lesser. The first value to be found as greater or lesser
47
- # determines which ComparableVersion object is greater or lesser.
48
- #
49
- # Missing ComparableVersion components are treated as 0 values, which effectively gives
50
- # them no weight in the comparison.
51
- #
52
- # @params [ComparableVersion] other the other ComparableVersion object we are comparing with
53
- def <=>(other)
54
- NAMES.each do |name|
55
- result = send(name).to_i <=> other.send(name).to_i
56
- return result unless result.zero?
68
+ 0
57
69
  end
58
70
 
59
- 0
60
- end
71
+ private
61
72
 
62
- private
73
+ def identification
74
+ version_identifiers =
75
+ NAMES.map { |name|
76
+ "#{name}:#{send(name)}" if send(name)
77
+ }.compact.join(", ")
63
78
 
64
- def identification
65
- version_identifiers =
66
- NAMES.map { |name| "#{name}:#{send(name)}" if send(name).present? }
67
- .compact
68
- .join(", ")
69
- "#{self.class}[#{version_identifiers}]"
79
+ "#{self.class}[#{version_identifiers}]"
80
+ end
70
81
  end
71
82
  end
@@ -1,38 +1,40 @@
1
- # Conversions is meant to be a common module used to define standard conversion
2
- # methods. Anytime one of the standard conversion methods are needed, the
3
- # Conversions module can be included and then used freely.
4
- module Conversions
5
- require_relative "comparable_version"
1
+ module VersionCompare
2
+ # Conversions is meant to be a common module used to define standard
3
+ # conversion methods. Anytime one of the standard conversion methods are
4
+ # needed, the Conversions module can be included and then used freely.
5
+ module Conversions
6
6
 
7
- # The `ComparableVersion()` conversion method is defined as a module_function so that it
8
- # may also be called directly without needing to include the Conversions module
9
- # if so desired.
10
- #
11
- # @example
12
- # Conversions.ComparableVersion(1.2).to_s # => "1.2"
13
7
  module_function
14
8
 
15
- # Strict conversion method for creating a `ComparableVersion` object out of anything
16
- # that sensibly is a ComparableVersion.
17
- #
18
- # @param [Object] value the object to be converted
19
- #
20
- # @example
21
- # ComparableVersion(1) # => #<ComparableVersion:0x007fd8144ea658 @major=1, @minor=nil, @tiny=nil, @patch=nil>
22
- # ComparableVersion(1.2) # => #<ComparableVersion:0x007fd8144ea658 @major=1, @minor=2, @tiny=nil, @patch=nil>
23
- # ComparableVersion("1.2.3") # => #<ComparableVersion:0x007fd8144ea658 @major=1, @minor=2, @tiny=3, @patch=nil>
24
- # ComparableVersion(["1", "2", "3", "4"]) # => #<ComparableVersion:0x007fd8144f98b0 @major=1, @minor=2, @tiny=3, @patch=4>
25
- def ComparableVersion(value)
26
- case value
27
- when String,
28
- Integer,
29
- Float,
30
- -> val { val.respond_to?(:to_ary) }
31
- ComparableVersion.new(value)
32
- when -> val { val.respond_to?(:to_comparable_version) }
33
- value.to_comparable_version
34
- else
35
- raise TypeError, "Cannot convert #{value.inspect} to ComparableVersion"
9
+ # Strict conversion method for creating a `ComparableVersion` object out of
10
+ # anything that can be interpreted is a ComparableVersion.
11
+ #
12
+ # @param [Object] value the object to be converted
13
+ #
14
+ # @example
15
+ # ComparableVersion(1)
16
+ # # => #<ComparableVersion @major=1, @minor=nil, @tiny=nil, @patch=nil>
17
+ #
18
+ # ComparableVersion(1.2)
19
+ # # => #<ComparableVersion @major=1, @minor=2, @tiny=nil, @patch=nil>
20
+ #
21
+ # ComparableVersion("1.2.3")
22
+ # # => #<ComparableVersion @major=1, @minor=2, @tiny=3, @patch=nil>
23
+ #
24
+ # ComparableVersion(["1", "2", "3", "4"])
25
+ # # => #<ComparableVersion @major=1, @minor=2, @tiny=3, @patch=4>
26
+ def ComparableVersion(value)
27
+ case value
28
+ when String,
29
+ Integer,
30
+ Float,
31
+ -> val { val.respond_to?(:to_ary) }
32
+ ComparableVersion.new(value)
33
+ when -> val { val.respond_to?(:to_comparable_version) }
34
+ value.to_comparable_version
35
+ else
36
+ raise TypeError, "Cannot convert #{value.inspect} to ComparableVersion"
37
+ end
36
38
  end
37
39
  end
38
40
  end
@@ -0,0 +1,3 @@
1
+ module VersionCompare
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,40 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "version_compare/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "version_compare"
7
+ spec.version = VersionCompare::VERSION
8
+ spec.authors = ["Paul Dobbins"]
9
+ spec.email = ["paul.dobbins@icloud.com"]
10
+
11
+ spec.summary = %q{VersionCompare simplifies comparison of version numbers with other version numbers.}
12
+ spec.description = %q{VersionCompare simplifies comparison of version numbers with other version numbers. It aims to be as light and flexible as possible. Inputs can be a String, Integer, Float, Array, or any object that defines `#to_comparable_version`.}
13
+ spec.homepage = "https://github.com/pdobb/version_compare"
14
+ spec.license = "MIT"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ # if spec.respond_to?(:metadata)
19
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
+ # else
21
+ # raise "RubyGems 2.0 or newer is required to protect against " \
22
+ # "public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.16"
33
+ spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "minitest", "~> 5.0"
35
+ spec.add_development_dependency "minitest-reporters", "~> 1.2"
36
+ spec.add_development_dependency "simplecov", "~> 0.16"
37
+ spec.add_development_dependency "byebug", "~> 10.0"
38
+ spec.add_development_dependency "pry", "~> 0.11"
39
+ spec.add_development_dependency "pry-byebug", "~> 3.6"
40
+ end
metadata CHANGED
@@ -1,106 +1,151 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: version_compare
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Dobbins
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-04 00:00:00.000000000 Z
11
+ date: 2018-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
19
+ version: '1.16'
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
- version: 3.0.0
26
+ version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sqlite3
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest-rails
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '5.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
55
- description: Version Compare allows you to easily compare if one Version is >, >=,
56
- ==, !=, <, or <= to another Version.
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.16'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.16'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.11'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.11'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.6'
125
+ description: VersionCompare simplifies comparison of version numbers with other version
126
+ numbers. It aims to be as light and flexible as possible. Inputs can be a String,
127
+ Integer, Float, Array, or any object that defines `#to_comparable_version`.
57
128
  email:
58
- - pdobbins@gmail.com
129
+ - paul.dobbins@icloud.com
59
130
  executables: []
60
131
  extensions: []
61
132
  extra_rdoc_files: []
62
133
  files:
63
- - MIT-LICENSE
134
+ - ".gitignore"
135
+ - ".travis.yml"
136
+ - CHANGELOG.md
137
+ - Gemfile
138
+ - Gemfile.lock
139
+ - LICENSE.txt
64
140
  - README.md
65
141
  - Rakefile
142
+ - bin/console
143
+ - bin/setup
66
144
  - lib/version_compare.rb
67
145
  - lib/version_compare/comparable_version.rb
68
146
  - lib/version_compare/conversions.rb
69
- - test/comparable_version_test.rb
70
- - test/conversions_test.rb
71
- - test/dummy/README.rdoc
72
- - test/dummy/Rakefile
73
- - test/dummy/app/assets/javascripts/application.js
74
- - test/dummy/app/assets/stylesheets/application.css
75
- - test/dummy/app/controllers/application_controller.rb
76
- - test/dummy/app/helpers/application_helper.rb
77
- - test/dummy/app/views/layouts/application.html.erb
78
- - test/dummy/bin/bundle
79
- - test/dummy/bin/rails
80
- - test/dummy/bin/rake
81
- - test/dummy/config.ru
82
- - test/dummy/config/application.rb
83
- - test/dummy/config/boot.rb
84
- - test/dummy/config/database.yml
85
- - test/dummy/config/environment.rb
86
- - test/dummy/config/environments/development.rb
87
- - test/dummy/config/environments/production.rb
88
- - test/dummy/config/environments/test.rb
89
- - test/dummy/config/initializers/backtrace_silencers.rb
90
- - test/dummy/config/initializers/filter_parameter_logging.rb
91
- - test/dummy/config/initializers/inflections.rb
92
- - test/dummy/config/initializers/mime_types.rb
93
- - test/dummy/config/initializers/secret_token.rb
94
- - test/dummy/config/initializers/session_store.rb
95
- - test/dummy/config/initializers/wrap_parameters.rb
96
- - test/dummy/config/locales/en.yml
97
- - test/dummy/config/routes.rb
98
- - test/dummy/log/test.log
99
- - test/dummy/public/404.html
100
- - test/dummy/public/422.html
101
- - test/dummy/public/500.html
102
- - test/dummy/public/favicon.ico
103
- - test/test_helper.rb
147
+ - lib/version_compare/version.rb
148
+ - version_compare.gemspec
104
149
  homepage: https://github.com/pdobb/version_compare
105
150
  licenses:
106
151
  - MIT
@@ -111,54 +156,19 @@ require_paths:
111
156
  - lib
112
157
  required_ruby_version: !ruby/object:Gem::Requirement
113
158
  requirements:
114
- - - ! '>='
159
+ - - ">="
115
160
  - !ruby/object:Gem::Version
116
161
  version: '0'
117
162
  required_rubygems_version: !ruby/object:Gem::Requirement
118
163
  requirements:
119
- - - ! '>='
164
+ - - ">="
120
165
  - !ruby/object:Gem::Version
121
166
  version: '0'
122
167
  requirements: []
123
168
  rubyforge_project:
124
- rubygems_version: 2.4.8
169
+ rubygems_version: 2.7.6
125
170
  signing_key:
126
171
  specification_version: 4
127
- summary: Compare versions
128
- test_files:
129
- - test/comparable_version_test.rb
130
- - test/conversions_test.rb
131
- - test/dummy/app/assets/javascripts/application.js
132
- - test/dummy/app/assets/stylesheets/application.css
133
- - test/dummy/app/controllers/application_controller.rb
134
- - test/dummy/app/helpers/application_helper.rb
135
- - test/dummy/app/views/layouts/application.html.erb
136
- - test/dummy/bin/bundle
137
- - test/dummy/bin/rails
138
- - test/dummy/bin/rake
139
- - test/dummy/config/application.rb
140
- - test/dummy/config/boot.rb
141
- - test/dummy/config/database.yml
142
- - test/dummy/config/environment.rb
143
- - test/dummy/config/environments/development.rb
144
- - test/dummy/config/environments/production.rb
145
- - test/dummy/config/environments/test.rb
146
- - test/dummy/config/initializers/backtrace_silencers.rb
147
- - test/dummy/config/initializers/filter_parameter_logging.rb
148
- - test/dummy/config/initializers/inflections.rb
149
- - test/dummy/config/initializers/mime_types.rb
150
- - test/dummy/config/initializers/secret_token.rb
151
- - test/dummy/config/initializers/session_store.rb
152
- - test/dummy/config/initializers/wrap_parameters.rb
153
- - test/dummy/config/locales/en.yml
154
- - test/dummy/config/routes.rb
155
- - test/dummy/config.ru
156
- - test/dummy/log/test.log
157
- - test/dummy/public/404.html
158
- - test/dummy/public/422.html
159
- - test/dummy/public/500.html
160
- - test/dummy/public/favicon.ico
161
- - test/dummy/Rakefile
162
- - test/dummy/README.rdoc
163
- - test/test_helper.rb
164
- has_rdoc:
172
+ summary: VersionCompare simplifies comparison of version numbers with other version
173
+ numbers.
174
+ test_files: []