albanpeignier-gepetto 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -7,6 +7,7 @@ app_generators/gepetto/gepetto_generator.rb
7
7
  app_generators/gepetto/templates/Rakefile
8
8
  app_generators/gepetto/templates/config/fileserver.conf
9
9
  app_generators/gepetto/templates/config/puppet.conf
10
+ app_generators/gepetto/templates/manifests/classes/empty.pp
10
11
  app_generators/gepetto/templates/manifests/defaults.pp
11
12
  app_generators/gepetto/templates/manifests/nodes.pp
12
13
  app_generators/gepetto/templates/manifests/site.pp
@@ -18,7 +19,6 @@ app_generators/gepetto/templates/script/puppetrun
18
19
  bin/gepetto
19
20
  gepetto.gemspec
20
21
  lib/gepetto.rb
21
- lib/gepetto/module.rb
22
22
  lib/gepetto/tasks.rb
23
23
  puppet_generators/module/USAGE
24
24
  puppet_generators/module/module_generator.rb
data/Rakefile CHANGED
@@ -1,27 +1,24 @@
1
- %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+
2
6
  require File.dirname(__FILE__) + '/lib/gepetto'
3
7
 
8
+ Hoe.plugin :newgem
9
+
4
10
  # Generate all the Rake tasks
5
11
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
- $hoe = Hoe.new('gepetto', Gepetto::VERSION) do |p|
7
- p.developer('Alban Peignier', 'alban.peignier@free.fr')
8
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
- p.rubyforge_name = p.name # TODO this is default value
10
- p.extra_deps = [
11
- ['rubigen',">= #{RubiGen::VERSION}"],
12
- ['echoe',">= 3.0.2"],
13
- ['cucumber',">= 0.1.8"],
14
- ['hoe',">= 1.8.0"],
15
- ['newgem', ">= #{::Newgem::VERSION}"]
16
- ]
17
- # p.extra_dev_deps = [
18
- # ['newgem', ">= #{::Newgem::VERSION}"]
19
- # ]
12
+ $hoe = Hoe.spec 'gepetto' do
13
+ self.version = Gepetto::VERSION
14
+ self.developer('Alban Peignier', 'alban.peignier@free.fr')
15
+ self.changes = self.paragraphs_of("History.txt", 0..1).join("\n\n")
16
+ self.rubyforge_name = self.name # TODO this is default value
20
17
 
21
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
22
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
23
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
24
- p.rsync_args = '-av --delete --ignore-errors'
18
+ self.clean_globs |= %w[**/.DS_Store tmp *.log]
19
+ path = (self.rubyforge_name == self.name) ? self.rubyforge_name : "\#{self.rubyforge_name}/\#{self.name}"
20
+ self.remote_rdoc_dir = File.join(path.gsub(/^#{self.rubyforge_name}\/?/,''), 'rdoc')
21
+ self.rsync_args = '-av --delete --ignore-errors'
25
22
  end
26
23
 
27
24
  require 'newgem/tasks' # load /tasks/*.rake
@@ -15,7 +15,7 @@ Sandbox.new do |s|
15
15
  # d.mirror = 'http://ftp.fr.debian.org/debian'
16
16
 
17
17
  # Use a local apt-proxy
18
- # d.mirror = 'http://localhost:9999/debian'
18
+ # d.mirror = 'http://127.0.0.1:9999/debian'
19
19
  end
20
20
 
21
21
  # s.disk_size = '1G'
@@ -0,0 +1 @@
1
+ # Remove me when your first classes are defined
@@ -0,0 +1,12 @@
1
+ # Some useful defaults
2
+
3
+ Exec { path => "/usr/bin:/usr/sbin/:/bin:/sbin:/usr/local/bin:/usr/local/sbin" }
4
+
5
+ File {
6
+ ignore => ['.svn', '.git', 'CVS' ],
7
+ checksum => md5,
8
+ owner => root, group => root,
9
+ backup => server
10
+ }
11
+
12
+ filebucket { server: server => puppet }
@@ -6,7 +6,7 @@
6
6
  # change working directories
7
7
  OPTIONS="--logdir=$PWD/log --vardir=$PWD/tmp/lib --rundir=$PWD/tmp/run --ssldir=$PWD/tmp/ssl"
8
8
  # use local files
9
- OPTIONS="$OPTIONS --templatedir=$PWD/templates --manifestdir=$PWD/manifests --modulepath=$PWD/modules"
9
+ OPTIONS="$OPTIONS --templatedir=$PWD/templates --manifestdir=$PWD/manifests --modulepath=$PWD/modules --confdir=$PWD/config"
10
10
 
11
11
  OPTIONS="$OPTIONS --certname=puppet --logdest=console"
12
12
 
data/gepetto.gemspec CHANGED
@@ -2,50 +2,36 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{gepetto}
5
- s.version = "0.0.5"
5
+ s.version = "0.0.6"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Alban Peignier"]
9
- s.date = %q{2009-02-03}
9
+ s.date = %q{2009-07-22}
10
10
  s.default_executable = %q{gepetto}
11
- s.description = %q{A helper suite for Puppet projects to create, manage and help daily development More information about Puppet: http://reductivelabs.com/trac/puppet/}
11
+ s.description = %q{A helper suite for Puppet projects to create, manage and help daily development
12
+
13
+ More information about Puppet: http://reductivelabs.com/trac/puppet/}
12
14
  s.email = ["alban.peignier@free.fr"]
13
15
  s.executables = ["gepetto"]
14
- s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
15
- s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "app_generators/gepetto/USAGE", "app_generators/gepetto/gepetto_generator.rb", "app_generators/gepetto/templates/Rakefile", "app_generators/gepetto/templates/config/fileserver.conf", "app_generators/gepetto/templates/config/puppet.conf", "app_generators/gepetto/templates/manifests/nodes.pp", "app_generators/gepetto/templates/manifests/site.pp", "app_generators/gepetto/templates/manifests/templates.pp", "app_generators/gepetto/templates/script/module", "app_generators/gepetto/templates/script/puppetca", "app_generators/gepetto/templates/script/puppetmasterd", "app_generators/gepetto/templates/script/puppetrun", "bin/gepetto", "gepetto.gemspec", "lib/gepetto.rb", "lib/gepetto/module.rb", "lib/gepetto/tasks.rb", "puppet_generators/module/USAGE", "puppet_generators/module/module_generator.rb", "puppet_generators/module/templates/README", "puppet_generators/module/templates/manifests/init.pp", "script/destroy", "script/generate", "tasks/host.pp", "tasks/log.rake", "tasks/puppet.rake", "tasks/sandbox.pp", "tasks/sandbox.rake", "tasks/tmp.rake", "tasks/utils.rake"]
16
- s.has_rdoc = true
16
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
17
+ s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "app_generators/gepetto/USAGE", "app_generators/gepetto/gepetto_generator.rb", "app_generators/gepetto/templates/Rakefile", "app_generators/gepetto/templates/config/fileserver.conf", "app_generators/gepetto/templates/config/puppet.conf", "app_generators/gepetto/templates/manifests/classes/empty.pp", "app_generators/gepetto/templates/manifests/defaults.pp", "app_generators/gepetto/templates/manifests/nodes.pp", "app_generators/gepetto/templates/manifests/site.pp", "app_generators/gepetto/templates/manifests/templates.pp", "app_generators/gepetto/templates/script/module", "app_generators/gepetto/templates/script/puppetca", "app_generators/gepetto/templates/script/puppetmasterd", "app_generators/gepetto/templates/script/puppetrun", "bin/gepetto", "gepetto.gemspec", "lib/gepetto.rb", "lib/gepetto/tasks.rb", "puppet_generators/module/USAGE", "puppet_generators/module/module_generator.rb", "puppet_generators/module/templates/README", "puppet_generators/module/templates/manifests/init.pp", "script/destroy", "script/generate", "tasks/host.pp", "tasks/log.rake", "tasks/puppet.rake", "tasks/sandbox.pp", "tasks/sandbox.rake", "tasks/tmp.rake", "tasks/utils.rake"]
17
18
  s.homepage = %q{http://github.com/albanpeignier/gepetto/}
18
19
  s.rdoc_options = ["--main", "README.rdoc"]
19
20
  s.require_paths = ["lib"]
20
21
  s.rubyforge_project = %q{gepetto}
21
- s.rubygems_version = %q{1.3.1}
22
+ s.rubygems_version = %q{1.3.4}
22
23
  s.summary = %q{A helper suite for Puppet projects to create, manage and help daily development More information about Puppet: http://reductivelabs.com/trac/puppet/}
23
24
 
24
25
  if s.respond_to? :specification_version then
25
26
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
- s.specification_version = 2
27
+ s.specification_version = 3
27
28
 
28
29
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
- s.add_runtime_dependency(%q<rubigen>, [">= 1.5.2"])
30
- s.add_runtime_dependency(%q<echoe>, [">= 3.0.2"])
31
- s.add_runtime_dependency(%q<cucumber>, [">= 0.1.8"])
32
- s.add_runtime_dependency(%q<hoe>, [">= 1.8.0"])
33
- s.add_runtime_dependency(%q<newgem>, [">= 1.2.3"])
34
- s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
30
+ s.add_development_dependency(%q<hoe>, [">= 2.3.2"])
35
31
  else
36
- s.add_dependency(%q<rubigen>, [">= 1.5.2"])
37
- s.add_dependency(%q<echoe>, [">= 3.0.2"])
38
- s.add_dependency(%q<cucumber>, [">= 0.1.8"])
39
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
40
- s.add_dependency(%q<newgem>, [">= 1.2.3"])
41
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
32
+ s.add_dependency(%q<hoe>, [">= 2.3.2"])
42
33
  end
43
34
  else
44
- s.add_dependency(%q<rubigen>, [">= 1.5.2"])
45
- s.add_dependency(%q<echoe>, [">= 3.0.2"])
46
- s.add_dependency(%q<cucumber>, [">= 0.1.8"])
47
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
48
- s.add_dependency(%q<newgem>, [">= 1.2.3"])
49
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
35
+ s.add_dependency(%q<hoe>, [">= 2.3.2"])
50
36
  end
51
37
  end
data/lib/gepetto.rb CHANGED
@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  module Gepetto
5
- VERSION = '0.0.5'
5
+ VERSION = '0.0.6'
6
6
  end
data/tasks/host.pp CHANGED
@@ -3,7 +3,10 @@ Exec { path => "/usr/bin:/usr/sbin/:/bin:/sbin" }
3
3
  # install qemu
4
4
 
5
5
  package { qemu:
6
- ensure => "0.9.1+svn20090104-1"
6
+ ensure => $operatingsystem ? {
7
+ debian => "0.9.1+svn20090104-1",
8
+ ubuntu => "latest"
9
+ }
7
10
  }
8
11
 
9
12
  case $operatingsystem {
@@ -28,7 +31,10 @@ case $operatingsystem {
28
31
  # compile kqemu module
29
32
 
30
33
  package { kqemu-source:
31
- ensure => "1.4.0~pre1-1",
34
+ ensure => $operatingsystem ? {
35
+ debian => "1.4.0~pre1-1",
36
+ ubuntu => "present"
37
+ },
32
38
  require => Package[qemu]
33
39
  }
34
40
 
data/tasks/sandbox.rake CHANGED
@@ -84,10 +84,51 @@ class Sandbox < Rake::TaskLib
84
84
  end
85
85
 
86
86
  task :kernel do
87
- # TODO : install a kernel and a boot loader grub
88
- # mount do
89
- # sudo "chroot #{mount_point} sh -c \"echo 'do_initrd = Yes' >> /etc/kernel-img.conf && DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes grub linux-image-2.6-686\""
90
- # end
87
+ mount do
88
+ chroot_sh "echo 'do_initrd = Yes' >> /etc/kernel-img.conf"
89
+
90
+ kernel_packages = {
91
+ 'etch' => 'linux-image-2.6-686',
92
+ 'lenny' => 'linux-image-2.6-686',
93
+ 'hardy' => 'linux-image-2.6.24-16-generic',
94
+ 'intrepid' => 'linux-image-generic'
95
+ }
96
+ kernel_package = kernel_packages[self.bootstraper.version]
97
+
98
+ chroot_sh "DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes #{kernel_package}"
99
+ end
100
+ end
101
+
102
+ task :grub do
103
+ mount do
104
+ chroot_sh "DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes grub"
105
+
106
+ grub_dir = "#{mount_point}/boot/grub"
107
+ chroot_sh "mkdir /boot/grub" unless File.exists?(grub_dir)
108
+
109
+ stage_files = Dir["#{mount_point}/usr/lib/grub/**/stage?", "#{mount_point}/usr/lib/grub/**/e2fs_stage1_5"]
110
+ sudo "cp #{stage_files.join(' ')} #{grub_dir}"
111
+
112
+ Tempfile.open('menu_lst') do |f|
113
+ f.write(['default 0',
114
+ 'timeout 0',
115
+ 'title Linux',
116
+ 'root (hd0,0)',
117
+ 'kernel /vmlinuz root=/dev/hda1 ro',
118
+ 'initrd /initrd.img'].join("\n"))
119
+ f.close
120
+ sudo "cp #{f.path} #{grub_dir}"
121
+ end
122
+ end
123
+
124
+ Tempfile.open('grub_input') do |f|
125
+ f.write(["device (hd0) #{disk_image}",
126
+ "root (hd0,0)",
127
+ "setup (hd0)",
128
+ "quit"].join("\n"))
129
+ f.close
130
+ sudo "grub --device-map=/dev/null < #{f.path}"
131
+ end
91
132
  end
92
133
 
93
134
  task :config do
@@ -118,7 +159,7 @@ class Sandbox < Rake::TaskLib
118
159
  end
119
160
 
120
161
  desc "Create a fresh image for sandbox"
121
- task :create => [ 'clean', 'create:image', 'create:fs', 'create:system', 'create:kernel', 'create:config', 'create:snapshot' ]
162
+ task :create => [ 'clean', 'create:image', 'create:fs', 'create:system', 'create:kernel', 'create:grub', 'create:config', 'create:snapshot' ]
122
163
 
123
164
  desc "Destroy sandbox images"
124
165
  task :destroy => 'clean' do
@@ -194,10 +235,7 @@ class Sandbox < Rake::TaskLib
194
235
  :daemonize => true,
195
236
  :snapshot => ENV['SNAPSHOT'],
196
237
  :hda => disk_image,
197
- :initrd => '/initrd.img',
198
- :kernel => '/vmlinuz',
199
- :append => 'console=ttyS0 root=/dev/hda1 ro',
200
- :nographic => true,
238
+ :nographic => false,
201
239
  :m => memory_size,
202
240
  :net => ["nic", "tap,ifname=#{tap_device}"]
203
241
  }.update(options)
@@ -225,7 +263,15 @@ class Sandbox < Rake::TaskLib
225
263
  end
226
264
  end.compact.join(' ')
227
265
 
228
- sh "qemu #{options_as_string}"
266
+ qemu_command =
267
+ case PLATFORM
268
+ when /x86_64/
269
+ "qemu-system-x86_64"
270
+ else
271
+ "qemu"
272
+ end
273
+
274
+ sh "#{qemu_command} #{options_as_string}"
229
275
  end
230
276
 
231
277
  def snapshot(name)
@@ -297,33 +343,64 @@ class Sandbox < Rake::TaskLib
297
343
  puts self.inspect
298
344
  end
299
345
 
346
+ def chroot_sh(cmd)
347
+ sudo "chroot #{mount_point} sh -c \"#{cmd}\""
348
+ end
349
+
300
350
  end
301
351
 
302
352
  class DebianBoostraper
303
353
 
304
- attr_accessor :version, :mirror
354
+ attr_accessor :version, :mirror, :include, :exclude, :architecture
305
355
 
306
356
  def initialize(&block)
357
+ default_attributes
358
+
359
+ @include = %w{puppet ssh udev resolvconf}
360
+ @exclude = %w{syslinux at exim mailx libstdc++2.10-glibc2.2 mbr setserial fdutils info ipchains iptables lilo pcmcia-cs ppp pppoe pppoeconf pppconfig telnet exim4 exim4-base exim4-config exim4-daemon-light pciutils modconf tasksel console-common console-tools console-data base-config man-db manpages}
361
+
362
+ yield self if block_given?
363
+ end
364
+
365
+ def default_attributes
307
366
  @version = 'lenny'
308
367
  @mirror = 'http://ftp.debian.org/debian'
309
368
 
310
- yield self if block_given?
369
+ @architecture =
370
+ case PLATFORM
371
+ when /x86_64/
372
+ "amd64"
373
+ else
374
+ "i386"
375
+ end
311
376
  end
312
377
 
313
378
  def bootstrap(root)
314
- options = {
315
- :arch => 'i386',
316
- :exclude => debootstrap_excludes,
317
- :include => %w{puppet ssh udev resolvconf}
318
- }
319
-
320
379
  options_as_string = options.collect{|k,v| "--#{k} #{Array(v).join(',')}"}.join(' ')
321
380
  sudo "debootstrap #{options_as_string} #{version} #{root} #{mirror}"
322
381
  end
323
382
 
324
- def debootstrap_excludes
325
- # excluded by qemu-make-debian-root
326
- %w{syslinux at exim mailx libstdc++2.10-glibc2.2 mbr setserial fdutils info ipchains iptables lilo pcmcia-cs ppp pppoe pppoeconf pppconfig telnet exim4 exim4-base exim4-config exim4-daemon-light pciutils modconf tasksel console-common console-tools console-data base-config man-db manpages}
383
+ def options
384
+ {
385
+ :arch => architecture,
386
+ :exclude => @exclude,
387
+ :include => @include
388
+ }
389
+ end
390
+
391
+ end
392
+
393
+ class UbuntuBoostraper < DebianBoostraper
394
+
395
+ def default_attributes
396
+ super
397
+
398
+ @version = 'intrepid'
399
+ @mirror = 'http://archive.ubuntu.com/ubuntu/'
400
+ end
401
+
402
+ def options
403
+ super.update :components => 'main,universe'
327
404
  end
328
405
 
329
406
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: albanpeignier-gepetto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alban Peignier
@@ -9,62 +9,18 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-03 00:00:00 -08:00
12
+ date: 2009-07-22 00:00:00 -07:00
13
13
  default_executable: gepetto
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rubigen
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.5.2
23
- version:
24
- - !ruby/object:Gem::Dependency
25
- name: echoe
26
- version_requirement:
27
- version_requirements: !ruby/object:Gem::Requirement
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- version: 3.0.2
32
- version:
33
- - !ruby/object:Gem::Dependency
34
- name: cucumber
35
- version_requirement:
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 0.1.8
41
- version:
42
- - !ruby/object:Gem::Dependency
43
- name: hoe
44
- version_requirement:
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 1.8.0
50
- version:
51
- - !ruby/object:Gem::Dependency
52
- name: newgem
53
- version_requirement:
54
- version_requirements: !ruby/object:Gem::Requirement
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: 1.2.3
59
- version:
60
15
  - !ruby/object:Gem::Dependency
61
16
  name: hoe
17
+ type: :development
62
18
  version_requirement:
63
19
  version_requirements: !ruby/object:Gem::Requirement
64
20
  requirements:
65
21
  - - ">="
66
22
  - !ruby/object:Gem::Version
67
- version: 1.8.0
23
+ version: 2.3.2
68
24
  version:
69
25
  description: "A helper suite for Puppet projects to create, manage and help daily development More information about Puppet: http://reductivelabs.com/trac/puppet/"
70
26
  email:
@@ -76,7 +32,6 @@ extensions: []
76
32
  extra_rdoc_files:
77
33
  - History.txt
78
34
  - Manifest.txt
79
- - README.rdoc
80
35
  files:
81
36
  - History.txt
82
37
  - Manifest.txt
@@ -87,6 +42,8 @@ files:
87
42
  - app_generators/gepetto/templates/Rakefile
88
43
  - app_generators/gepetto/templates/config/fileserver.conf
89
44
  - app_generators/gepetto/templates/config/puppet.conf
45
+ - app_generators/gepetto/templates/manifests/classes/empty.pp
46
+ - app_generators/gepetto/templates/manifests/defaults.pp
90
47
  - app_generators/gepetto/templates/manifests/nodes.pp
91
48
  - app_generators/gepetto/templates/manifests/site.pp
92
49
  - app_generators/gepetto/templates/manifests/templates.pp
@@ -97,7 +54,6 @@ files:
97
54
  - bin/gepetto
98
55
  - gepetto.gemspec
99
56
  - lib/gepetto.rb
100
- - lib/gepetto/module.rb
101
57
  - lib/gepetto/tasks.rb
102
58
  - puppet_generators/module/USAGE
103
59
  - puppet_generators/module/module_generator.rb
@@ -112,7 +68,7 @@ files:
112
68
  - tasks/sandbox.rake
113
69
  - tasks/tmp.rake
114
70
  - tasks/utils.rake
115
- has_rdoc: true
71
+ has_rdoc: false
116
72
  homepage: http://github.com/albanpeignier/gepetto/
117
73
  post_install_message:
118
74
  rdoc_options:
@@ -137,7 +93,7 @@ requirements: []
137
93
  rubyforge_project: gepetto
138
94
  rubygems_version: 1.2.0
139
95
  signing_key:
140
- specification_version: 2
96
+ specification_version: 3
141
97
  summary: "A helper suite for Puppet projects to create, manage and help daily development More information about Puppet: http://reductivelabs.com/trac/puppet/"
142
98
  test_files: []
143
99