brightbox-cli 5.0.0.rc2 → 5.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9eb6588f842b8e2bb0a2b48e1a1eece122697726faa67032b43a868f273b49cd
4
- data.tar.gz: 41e2cd7ac07f8423f5a401196710c26befa93e50740248a0d8f430a16c67ec8d
3
+ metadata.gz: 762c685461579ff25f8897f1e1dc628d8b54624aef6524d681fedfc820422593
4
+ data.tar.gz: 131247b684d91cbdc8642f5a9c01de913fd415fc98b3b5fd6c32d5f4fe90d444
5
5
  SHA512:
6
- metadata.gz: e6c6997a8f17a14293c46bc07b040b1d3b07fb3409e3fc60fe02b577e8f5cdf1bfde2fa5d5eb6ae526c680e558b114c28908c3d6614b8efa775a866e201830f3
7
- data.tar.gz: 912baa8d1adba3c050bfc5d0f0fc69cf69621d5c28da4d063dfe4a6751e42c54d5b36dec2c017286579c745b3b9ce53bff8354f30081911bc0539e923eb3ece4
6
+ metadata.gz: e150f42838b2597cfbf35778514fbc8c9dbd42fd571be5a09709bd8b4a2dde6d1957d265646f88b06213be664a1414a1f1e77f6d949899721297072055a4abb4
7
+ data.tar.gz: 7ceab3597a0ecd83bb829b8833309c20b245d2f0fb49022c52dec8c68be7b0646a17c39a65763b60e210819b35478950b2155adc465c4c65ad12b4ac309931ee
@@ -0,0 +1,50 @@
1
+ FROM mcr.microsoft.com/devcontainers/ruby:2-3.4-trixie
2
+
3
+ # Install additional OS packages
4
+ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
5
+ && apt-get -y install --no-install-recommends \
6
+ libssl-dev \
7
+ libreadline-dev \
8
+ zlib1g-dev \
9
+ libncurses-dev \
10
+ libyaml-dev \
11
+ libffi-dev \
12
+ libgdbm-dev \
13
+ && apt-get clean -y && rm -rf /var/lib/apt/lists/*
14
+
15
+ # Switch to vscode user
16
+ USER vscode
17
+
18
+ # Install OpenSSL 1.1.1w locally
19
+ RUN mkdir -p /home/vscode/.openssl_src \
20
+ && cd /home/vscode/.openssl_src \
21
+ && wget -q https://www.openssl.org/source/openssl-1.1.1w.tar.gz \
22
+ && tar -zxf openssl-1.1.1w.tar.gz \
23
+ && cd openssl-1.1.1w \
24
+ && ./config --prefix=/home/vscode/.openssl/1.1.1w --openssldir=/home/vscode/.openssl/1.1.1w \
25
+ && make \
26
+ && make install \
27
+ && cd .. \
28
+ && rm -rf /home/vscode/.openssl_src
29
+
30
+ # Link system certificates
31
+ RUN rmdir /home/vscode/.openssl/1.1.1w/certs \
32
+ && ln -s /etc/ssl/certs /home/vscode/.openssl/1.1.1w/certs \
33
+ && ln -s /etc/ssl/certs/ca-certificates.crt /home/vscode/.openssl/1.1.1w/cert.pem
34
+
35
+ # Update RVM
36
+ USER root
37
+ SHELL ["/bin/bash", "-lc"]
38
+ RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import - \
39
+ && curl -sSL https://rvm.io/pkuczynski.asc | gpg --import - \
40
+ && rvm get master
41
+
42
+ # Install Rubies
43
+ USER vscode
44
+ RUN git config --global --add safe.directory /usr/local/rvm/repos/ruby
45
+ ENV RUBY_CFLAGS="-Wno-error=implicit-function-declaration"
46
+ RUN rvm install 2.7 --disable-binary --with-openssl-dir=/home/vscode/.openssl/1.1.1w
47
+ RUN rvm install 3.0 --disable-binary --with-openssl-dir=/home/vscode/.openssl/1.1.1w
48
+ RUN rvm install 3.1.6 --disable-binary
49
+ RUN rvm install 3.2.4 --disable-binary
50
+ RUN rvm install 3.3.1 --disable-binary
@@ -0,0 +1,37 @@
1
+ // For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+ // README at: https://github.com/devcontainers/templates/tree/main/src/ruby
3
+ {
4
+ "name": "Ruby",
5
+ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+ "build": {
7
+ "dockerfile": "Dockerfile"
8
+ },
9
+
10
+ // Features to add to the dev container. More info: https://containers.dev/features.
11
+ "features": {
12
+ "ghcr.io/devcontainers-extra/features/fish-apt-get:1": {},
13
+ "ghcr.io/devcontainers-extra/features/neovim-apt-get:1": {},
14
+ "ghcr.io/devcontainers-extra/features/ripgrep:1": {},
15
+ "ghcr.io/schlich/devcontainer-features/jujutsu:0": {},
16
+ "ghcr.io/stuartleeks/dev-container-features/shell-history:0": {}
17
+ },
18
+ "customizations": {
19
+ "vscode": {
20
+ "extensions": [
21
+ "visualjj.visualjj"
22
+ ]
23
+ }
24
+ }
25
+
26
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
27
+ // "forwardPorts": [],
28
+
29
+ // Use 'postCreateCommand' to run commands after the container is created.
30
+ // "postCreateCommand": "ruby --version",
31
+
32
+ // Configure tool-specific properties.
33
+ // "customizations": {},
34
+
35
+ // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
36
+ // "remoteUser": "root"
37
+ }
@@ -21,7 +21,7 @@ jobs:
21
21
  strategy:
22
22
  fail-fast: false
23
23
  matrix:
24
- ruby: ["2.7", "3.0", "3.1", "3.2", "3.3"]
24
+ ruby: ["2.7", "3.0", "3.1", "3.2", "3.3", "head"]
25
25
  env:
26
26
  DEBUG: "true"
27
27
  steps:
data/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
- ### v5.0.0.rc1 / 2024-12-20
1
+ ### v5.1.0 / 2025-12-18
2
2
 
3
- [Full Changelog](https://github.com/brightbox/brightbox-cli/compare/v4.8.0...v5.0.0.rc1)
3
+ [Full Changelog](https://github.com/brightbox/brightbox-cli/compare/v5.0.0...v5.1.0)
4
+
5
+ Enhancements:
6
+
7
+ * Update dependencies for Ruby 4.0 support
8
+
9
+ Changes:
10
+
11
+ * Numerous dependency gems updated
12
+
13
+ Testing:
14
+
15
+ * Added development container
16
+ * CI changes
17
+
18
+ ### v5.0.0 / 2025-01-20
19
+
20
+ [Full Changelog](https://github.com/brightbox/brightbox-cli/compare/v4.8.0...v5.0.0)
4
21
 
5
22
  Backwards incompatible changes:
6
23
 
@@ -11,6 +28,8 @@ Backwards incompatible changes:
11
28
  * `show` commands require at least one argument to
12
29
  prevent an issue where the wrong, summary API was
13
30
  used resulting in missing data in tables
31
+ * `images` architecture is now its own `arch` column and no longer
32
+ combined with the name field.
14
33
 
15
34
  Enhancements:
16
35
 
@@ -60,6 +79,8 @@ Testing:
60
79
  test coverage.
61
80
  * Temporary testing config directories are removed explicitly to prevent
62
81
  config bleeding in some test scenarios
82
+ * Tests for `server activate_console` confirm support for local time and
83
+ time zones.
63
84
 
64
85
  ### v4.8.0 / 2024-10-23
65
86
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brightbox-cli (5.0.0.rc2)
4
+ brightbox-cli (5.1.0)
5
+ abbrev
6
+ base64
7
+ bigdecimal
5
8
  fog-brightbox (>= 1.12.0)
6
9
  fog-core (< 2.0)
7
10
  gli (~> 2.21)
@@ -10,13 +13,17 @@ PATH
10
13
  i18n (>= 0.6, < 1.11)
11
14
  mime-types (~> 3.0)
12
15
  multi_json (~> 1.11)
16
+ ostruct
13
17
 
14
18
  GEM
15
19
  remote: https://rubygems.org/
16
20
  specs:
21
+ abbrev (0.1.2)
17
22
  addressable (2.8.0)
18
23
  public_suffix (>= 2.0.2, < 5.0)
19
24
  ast (2.4.2)
25
+ base64 (0.3.0)
26
+ bigdecimal (3.3.1)
20
27
  builder (3.3.0)
21
28
  coderay (1.1.3)
22
29
  concurrent-ruby (1.3.4)
@@ -52,6 +59,7 @@ GEM
52
59
  mime-types-data (3.2024.1203)
53
60
  mocha (1.14.0)
54
61
  multi_json (1.15.0)
62
+ ostruct (0.6.3)
55
63
  parallel (1.22.1)
56
64
  parser (3.1.2.0)
57
65
  ast (~> 2.4.1)
@@ -65,7 +73,7 @@ GEM
65
73
  rainbow (3.1.1)
66
74
  rake (13.0.6)
67
75
  regexp_parser (2.5.0)
68
- rexml (3.3.9)
76
+ rexml (3.4.2)
69
77
  rspec (3.11.0)
70
78
  rspec-core (~> 3.11.0)
71
79
  rspec-expectations (~> 3.11.0)
data/Jenkinsfile CHANGED
@@ -4,39 +4,37 @@ pipeline {
4
4
  ansiColor('xterm')
5
5
  }
6
6
  triggers {
7
- cron('@monthly')
7
+ cron('@weekly')
8
8
  }
9
9
  stages {
10
10
  stage("Run tests") {
11
11
  parallel {
12
- stage("Ruby 2.5") {
12
+ stage("Ruby 2.7") {
13
13
  agent {
14
14
  docker {
15
- image 'ruby:2.5'
15
+ image 'ruby:2.7'
16
16
  }
17
17
  }
18
18
  steps {
19
- sh 'gem install bundler:2.1.4'
20
19
  sh 'bundle install --deployment'
21
20
  sh 'bundle exec rake spec'
22
21
  }
23
22
  }
24
- stage("Ruby 2.6") {
23
+ stage("Ruby 3.0") {
25
24
  agent {
26
25
  docker {
27
- image 'ruby:2.6'
26
+ image 'ruby:3.0'
28
27
  }
29
28
  }
30
29
  steps {
31
- sh 'gem install bundler:2.1.4'
32
30
  sh 'bundle install --deployment'
33
31
  sh 'bundle exec rake spec'
34
32
  }
35
33
  }
36
- stage("Ruby 2.7") {
34
+ stage("Ruby 3.1") {
37
35
  agent {
38
36
  docker {
39
- image 'ruby:2.7'
37
+ image 'ruby:3.1'
40
38
  }
41
39
  }
42
40
  steps {
@@ -44,10 +42,10 @@ pipeline {
44
42
  sh 'bundle exec rake spec'
45
43
  }
46
44
  }
47
- stage("Ruby 3.0") {
45
+ stage("Ruby 3.2") {
48
46
  agent {
49
47
  docker {
50
- image 'ruby:3.0'
48
+ image 'ruby:3.2'
51
49
  }
52
50
  }
53
51
  steps {
@@ -55,10 +53,10 @@ pipeline {
55
53
  sh 'bundle exec rake spec'
56
54
  }
57
55
  }
58
- stage("Ruby 3.1") {
56
+ stage("Ruby 3.3") {
59
57
  agent {
60
58
  docker {
61
- image 'ruby:3.1'
59
+ image 'ruby:3.3'
62
60
  }
63
61
  }
64
62
  steps {
@@ -21,6 +21,9 @@ Gem::Specification.new do |s|
21
21
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
22
22
  s.require_paths = ["lib"]
23
23
 
24
+ s.add_dependency "abbrev"
25
+ s.add_dependency "base64"
26
+ s.add_dependency "bigdecimal"
24
27
  s.add_dependency "fog-brightbox", ">= 1.12.0"
25
28
  s.add_dependency "fog-core", "< 2.0"
26
29
  s.add_dependency "gli", "~> 2.21"
@@ -29,6 +32,7 @@ Gem::Specification.new do |s|
29
32
  s.add_dependency "i18n", ">= 0.6", "< 1.11"
30
33
  s.add_dependency "mime-types", "~> 3.0"
31
34
  s.add_dependency "multi_json", "~> 1.11"
35
+ s.add_dependency "ostruct"
32
36
 
33
37
  s.add_development_dependency "mocha"
34
38
  s.add_development_dependency "pry-remote"
@@ -23,7 +23,11 @@ module Brightbox
23
23
  uri.query = "password=#{r['console_token']}"
24
24
 
25
25
  expires = Time.parse(r["console_token_expires"])
26
- consoles << { :url => uri.to_s, :token => r["console_token"], :expires => expires.localtime.to_s }
26
+ consoles << {
27
+ url: uri.to_s,
28
+ token: r["console_token"],
29
+ expires: expires.localtime.to_s
30
+ }
27
31
  end
28
32
 
29
33
  render_table(consoles, global_options.merge(:fields => %i[url token expires], :resize => false))
@@ -16,7 +16,7 @@ module Brightbox
16
16
  end
17
17
 
18
18
  def self.default_field_order
19
- %i[id owner type created_on status size name]
19
+ %i[id owner type created_on status size arch name]
20
20
  end
21
21
 
22
22
  # Filter out images that are not of the right type, account or status if the option is passed
@@ -84,7 +84,7 @@ module Brightbox
84
84
  locked: locked?,
85
85
  username: username,
86
86
  arch: arch,
87
- name: name.to_s + " (#{arch})",
87
+ name: name.to_s,
88
88
  owner: official ? "brightbox" : owner_id,
89
89
  type: type,
90
90
  created_at: created_at,
@@ -1,3 +1,3 @@
1
1
  module Brightbox
2
- VERSION = "5.0.0.rc2".freeze unless defined?(Brightbox::VERSION)
2
+ VERSION = "5.1.0".freeze unless defined?(Brightbox::VERSION)
3
3
  end
@@ -6,11 +6,153 @@ describe "brightbox servers" do
6
6
  let(:stdout) { output.stdout }
7
7
  let(:stderr) { output.stderr }
8
8
 
9
- context "" do
9
+ before do
10
+ WebMock.reset!
11
+
12
+ config_from_contents(API_CLIENT_CONFIG_CONTENTS)
13
+ stub_client_token_request
14
+ Brightbox.config.reauthenticate
15
+ end
16
+
17
+ context "without arguments" do
10
18
  let(:argv) { %w[servers activate_console] }
11
19
 
12
20
  it "does not error" do
13
21
  expect { output }.to_not raise_error
22
+
23
+ aggregate_failures do
24
+ expect(stderr).to match("ERROR: You must specify servers to activate the console for")
25
+ expect(stdout).to be_empty
26
+ end
27
+ end
28
+ end
29
+
30
+ context "with identifier argument" do
31
+ let(:argv) { %w[servers activate_console srv-lv426] }
32
+ let(:token_expires) { "2025-01-01T01:01:01Z" }
33
+
34
+ before do
35
+ stub_request(:get, "#{api_url}/1.0/servers/srv-lv426")
36
+ .with(query: hash_including(account_id: "acc-12345"))
37
+ .to_return(
38
+ status: 200,
39
+ body: {
40
+ id: "srv-lv426",
41
+ console_token: nil,
42
+ console_token_expires: nil,
43
+ console_url: nil,
44
+ image: {
45
+ id: "img-12345"
46
+ }
47
+ }.to_json
48
+ )
49
+
50
+ stub_request(:get, "#{api_url}/1.0/images")
51
+ .with(query: hash_including(account_id: "acc-12345"))
52
+ .to_return(
53
+ status: 200,
54
+ body: [
55
+ {
56
+ id: "img-12345"
57
+ }
58
+ ].to_json
59
+ )
60
+
61
+ stub_request(:post, "#{api_url}/1.0/servers/srv-lv426/activate_console")
62
+ .with(query: hash_including(account_id: "acc-12345"))
63
+ .to_return(
64
+ status: 202,
65
+ body: {
66
+ id: "srv-lv426",
67
+ console_token: "<test-token-placeholder>",
68
+ console_token_expires: token_expires,
69
+ console_url: "https://console.test.test/srv-lv426",
70
+ image: {
71
+ id: "img-12345"
72
+ }
73
+ }.to_json
74
+ )
75
+ end
76
+
77
+ context "when in different time zone" do
78
+ around do |example|
79
+ original_tz = ENV["TZ"]
80
+ example.run
81
+ ENV["TZ"] = original_tz
82
+ end
83
+
84
+ context "when in UTC" do
85
+ before do
86
+ ENV["TZ"] = "Europe/London"
87
+ end
88
+
89
+ context "without daylight savings" do
90
+ it "does not error" do
91
+ expect { output }.to_not raise_error
92
+
93
+ aggregate_failures do
94
+ expect(stderr).to match("")
95
+ expect(stderr).not_to match("ERROR")
96
+
97
+ expect(stdout).to match("url")
98
+ expect(stdout).to match("https://console.test.test/srv-lv426")
99
+
100
+ expect(stdout).to match("token")
101
+ expect(stdout).to match("<test-token-placeholder>")
102
+
103
+ expect(stdout).to match("expires")
104
+ expect(stdout).to match("2025-01-01T01:01")
105
+ end
106
+ end
107
+ end
108
+
109
+ context "with daylight savings (BST)" do
110
+ let(:token_expires) { "2025-07-01T01:01:01Z" }
111
+
112
+ it "does not error" do
113
+ expect { output }.to_not raise_error
114
+
115
+ aggregate_failures do
116
+ expect(stderr).to match("")
117
+ expect(stderr).not_to match("ERROR")
118
+
119
+ expect(stdout).to match("url")
120
+ expect(stdout).to match("https://console.test.test/srv-lv426")
121
+
122
+ expect(stdout).to match("token")
123
+ expect(stdout).to match("<test-token-placeholder>")
124
+
125
+ expect(stdout).to match("expires")
126
+ expect(stdout).to match("2025-07-01T02:01")
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ context "when in EST" do
133
+ around do |example|
134
+ ENV["TZ"] = "America/New_York"
135
+ example.run
136
+ end
137
+
138
+ it "does not error" do
139
+ expect { output }.to_not raise_error
140
+
141
+ aggregate_failures do
142
+ expect(stderr).to match("")
143
+ expect(stderr).not_to match("ERROR")
144
+
145
+ expect(stdout).to match("url")
146
+ expect(stdout).to match("https://console.test.test/srv-lv426")
147
+
148
+ expect(stdout).to match("token")
149
+ expect(stdout).to match("<test-token-placeholder>")
150
+
151
+ expect(stdout).to match("expires")
152
+ expect(stdout).to match("2024-12-31T20:01")
153
+ end
154
+ end
155
+ end
14
156
  end
15
157
  end
16
158
  end
data/spec/spec_helper.rb CHANGED
@@ -9,7 +9,6 @@ SimpleCov.start do
9
9
 
10
10
  # Currently just above 75% coverage - don't make it worse
11
11
  minimum_coverage 75
12
- refuse_coverage_drop
13
12
  end
14
13
 
15
14
  LIB_DIR = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
data/spec/support/vcr.rb CHANGED
@@ -1,3 +1,17 @@
1
+ # Polyfill for newer Ruby versions that remove
2
+ require "cgi"
3
+
4
+ unless CGI.respond_to?(:parse)
5
+ require "uri"
6
+ def CGI.parse(query)
7
+ params = Hash.new { |h, k| h[k] = [] }
8
+ URI.decode_www_form(query).each do |key, value|
9
+ params[key] << value
10
+ end
11
+ params
12
+ end
13
+ end
14
+
1
15
  require "vcr"
2
16
 
3
17
  VCR.configure do |vcr|
metadata CHANGED
@@ -1,15 +1,58 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brightbox-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.rc2
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Leach
8
8
  - Paul Thornthwaite
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2025-01-15 00:00:00.000000000 Z
12
+ date: 2025-12-18 00:00:00.000000000 Z
12
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: abbrev
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: base64
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bigdecimal
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
13
56
  - !ruby/object:Gem::Dependency
14
57
  name: fog-brightbox
15
58
  requirement: !ruby/object:Gem::Requirement
@@ -128,6 +171,20 @@ dependencies:
128
171
  - - "~>"
129
172
  - !ruby/object:Gem::Version
130
173
  version: '1.11'
174
+ - !ruby/object:Gem::Dependency
175
+ name: ostruct
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ type: :runtime
182
+ prerelease: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
131
188
  - !ruby/object:Gem::Dependency
132
189
  name: mocha
133
190
  requirement: !ruby/object:Gem::Requirement
@@ -278,6 +335,8 @@ executables:
278
335
  extensions: []
279
336
  extra_rdoc_files: []
280
337
  files:
338
+ - ".devcontainer/Dockerfile"
339
+ - ".devcontainer/devcontainer.json"
281
340
  - ".gitattributes"
282
341
  - ".github/workflows/ruby.yml"
283
342
  - ".gitignore"
@@ -826,6 +885,7 @@ licenses:
826
885
  - MIT
827
886
  metadata:
828
887
  rubygems_mfa_required: 'true'
888
+ post_install_message:
829
889
  rdoc_options: []
830
890
  require_paths:
831
891
  - lib
@@ -840,7 +900,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
840
900
  - !ruby/object:Gem::Version
841
901
  version: '0'
842
902
  requirements: []
843
- rubygems_version: 3.6.2
903
+ rubygems_version: 3.5.16
904
+ signing_key:
844
905
  specification_version: 4
845
906
  summary: The Brightbox cloud management system
846
907
  test_files: