indocker 0.0.0 → 0.0.1

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rspec +1 -0
  4. data/Gemfile.lock +12 -0
  5. data/bin/indocker +9 -0
  6. data/indocker.gemspec +7 -2
  7. data/lib/indocker/application_initializer.rb +30 -0
  8. data/lib/indocker/cli.rb +17 -0
  9. data/lib/indocker/configs/config.rb +76 -0
  10. data/lib/indocker/configs/config_factory.rb +36 -0
  11. data/lib/indocker/configs/locator.rb +23 -0
  12. data/lib/indocker/container/container_dsl.rb +60 -0
  13. data/lib/indocker/container/container_evaluator.rb +13 -0
  14. data/lib/indocker/container/container_manager.rb +111 -0
  15. data/lib/indocker/container/container_metadata.rb +107 -0
  16. data/lib/indocker/container/container_metadata_factory.rb +27 -0
  17. data/lib/indocker/container/container_metadata_repository.rb +27 -0
  18. data/lib/indocker/directives/base.rb +21 -0
  19. data/lib/indocker/directives/container_directives/base.rb +19 -0
  20. data/lib/indocker/directives/container_directives/depends_on.rb +7 -0
  21. data/lib/indocker/directives/container_directives/env_file.rb +7 -0
  22. data/lib/indocker/directives/container_directives/expose.rb +7 -0
  23. data/lib/indocker/directives/container_directives/from.rb +12 -0
  24. data/lib/indocker/directives/container_directives/network.rb +12 -0
  25. data/lib/indocker/directives/container_directives/ports.rb +8 -0
  26. data/lib/indocker/directives/container_directives/ready.rb +16 -0
  27. data/lib/indocker/directives/container_directives_runner.rb +46 -0
  28. data/lib/indocker/directives/docker_directives/base.rb +15 -0
  29. data/lib/indocker/directives/docker_directives/cmd.rb +15 -0
  30. data/lib/indocker/directives/docker_directives/copy.rb +27 -0
  31. data/lib/indocker/directives/docker_directives/entrypoint.rb +15 -0
  32. data/lib/indocker/directives/docker_directives/env.rb +5 -0
  33. data/lib/indocker/directives/docker_directives/from.rb +30 -0
  34. data/lib/indocker/directives/docker_directives/run.rb +5 -0
  35. data/lib/indocker/directives/docker_directives/workdir.rb +5 -0
  36. data/lib/indocker/directives/image_directives_runner.rb +120 -0
  37. data/lib/indocker/directives/partial.rb +13 -0
  38. data/lib/indocker/directives/prepare_directives/base.rb +6 -0
  39. data/lib/indocker/directives/prepare_directives/docker_cp.rb +16 -0
  40. data/lib/indocker/docker_api.rb +180 -0
  41. data/lib/indocker/dsl_context.rb +17 -0
  42. data/lib/indocker/envs/env_metadata.rb +35 -0
  43. data/lib/indocker/envs/loader.rb +19 -0
  44. data/lib/indocker/envs/manager.rb +30 -0
  45. data/lib/indocker/errors.rb +17 -0
  46. data/lib/indocker/handlers/base.rb +13 -0
  47. data/lib/indocker/handlers/run_container.rb +29 -0
  48. data/lib/indocker/image/image_builder.rb +39 -0
  49. data/lib/indocker/image/image_dependencies_manager.rb +43 -0
  50. data/lib/indocker/image/image_dsl.rb +69 -0
  51. data/lib/indocker/image/image_evaluator.rb +21 -0
  52. data/lib/indocker/image/image_metadata.rb +50 -0
  53. data/lib/indocker/image/image_metadata_factory.rb +30 -0
  54. data/lib/indocker/image/image_metadata_repository.rb +30 -0
  55. data/lib/indocker/networks/network_metadata.rb +9 -0
  56. data/lib/indocker/networks/network_metadata_factory.rb +9 -0
  57. data/lib/indocker/networks/network_metadata_repository.rb +34 -0
  58. data/lib/indocker/partial/partial_metadata.rb +8 -0
  59. data/lib/indocker/partial/partial_metadata_repository.rb +26 -0
  60. data/lib/indocker/utils/ioc_container.rb +17 -0
  61. data/lib/indocker/utils/logger.rb +62 -0
  62. data/lib/indocker/utils/logger_factory.rb +12 -0
  63. data/lib/indocker/utils/registry_authenticator.rb +19 -0
  64. data/lib/indocker/utils/render_namespace.rb +11 -0
  65. data/lib/indocker/utils/render_util.rb +15 -0
  66. data/lib/indocker/utils/string_utils.rb +11 -0
  67. data/lib/indocker/utils/tar_helper.rb +40 -0
  68. data/lib/indocker/utils/test_logger_factory.rb +9 -0
  69. data/lib/indocker/version.rb +2 -2
  70. data/lib/indocker.rb +123 -1
  71. data/spec/example/.indocker/config.rb +23 -0
  72. data/spec/example/.indocker/images_and_containers.rb +25 -0
  73. data/spec/example/assets/index.css +1 -0
  74. data/spec/example/assets/index.js +1 -0
  75. data/spec/indocker/configs/config_factory_spec.rb +18 -0
  76. data/spec/indocker/configs/config_spec.rb +37 -0
  77. data/spec/indocker/container/container_manager_spec.rb +230 -0
  78. data/spec/indocker/directives/image_directives_runner_spec.rb +121 -0
  79. data/spec/indocker/handlers/run_container_spec.rb +107 -0
  80. data/spec/indocker/image/image_builder_spec.rb +115 -0
  81. data/spec/indocker/image/image_evaluator_spec.rb +65 -0
  82. data/spec/indocker/utils/docker_api_spec.rb +87 -0
  83. data/spec/spec_helper.rb +46 -0
  84. data/spec/tmp/indocker_list_container_files/deeper/example3.txt +1 -0
  85. data/spec/tmp/indocker_list_container_files/deeper/example4.txt +1 -0
  86. data/spec/tmp/indocker_list_container_files/example1.txt +1 -0
  87. data/spec/tmp/indocker_list_container_files/example2.txt +1 -0
  88. metadata +159 -6
  89. data/spec/.gitkeep +0 -0
@@ -0,0 +1,13 @@
1
+ module Indocker::Handlers
2
+ class Base
3
+ def perform(options)
4
+ env = options.delete(:env)
5
+
6
+ application_initializer.init_app(options[:current_path], env: env)
7
+
8
+ self.method(:handle).call(options)
9
+ rescue Docker::Error::ClientError => e
10
+ logger.error(e.message)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ class Indocker::Handlers::RunContainer < Indocker::Handlers::Base
2
+ include SmartIoC::Iocify
3
+
4
+ bean :run_container_handler
5
+
6
+ inject :container_manager
7
+ inject :container_metadata_repository
8
+ inject :image_builder
9
+ inject :application_initializer
10
+ inject :docker_api
11
+ inject :logger
12
+
13
+ def handle(name:, current_path:)
14
+ name = name.to_s
15
+
16
+ container_metadata = container_metadata_repository.get_by_name(name)
17
+
18
+ if docker_api.container_exists?(name)
19
+ container_manager.stop(name)
20
+ container_manager.delete(name)
21
+ end
22
+
23
+ image_builder.build(container_metadata.repo, tag: container_metadata.tag)
24
+
25
+ container_manager.create(name)
26
+
27
+ container_manager.start(name)
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ class Indocker::ImageBuilder
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_builder
5
+
6
+ inject :image_metadata_repository
7
+ inject :image_dependencies_manager
8
+ inject :image_directives_runner
9
+ inject :image_evaluator
10
+ inject :docker_api
11
+ inject :logger
12
+
13
+ def build(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
14
+ image_metadata = image_metadata_repository.find_by_repo(repo, tag: tag)
15
+
16
+ FileUtils.mkdir_p(image_metadata.build_dir)
17
+
18
+ image_dependencies_manager.get_dependencies!(image_metadata).each do |dependency_metadata|
19
+ build(dependency_metadata.repo, tag: dependency_metadata.tag)
20
+ end
21
+
22
+ image_directives_runner.run_all(image_metadata.prepare_directives)
23
+
24
+ File.open(File.join(image_metadata.build_dir, Indocker::DOCKERFILE_NAME), 'w') do |f|
25
+ f.puts image_metadata.build_directives.map(&:to_s)
26
+ image_metadata.build_directives.map(&:to_s).each {|d| logger.debug d}
27
+ end
28
+
29
+ docker_api.build_from_dir(
30
+ repo: image_metadata.repo,
31
+ tag: image_metadata.tag,
32
+ build_dir: image_metadata.build_dir.to_s
33
+ ) { |log| logger.info(log) }
34
+ ensure
35
+ image_metadata = image_metadata_repository.find_by_repo(repo, tag: tag)
36
+
37
+ FileUtils.rm_rf(image_metadata.build_dir)
38
+ end
39
+ end
@@ -0,0 +1,43 @@
1
+ class Indocker::ImageDependenciesManager
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_dependencies_manager
5
+
6
+ inject :image_metadata_repository
7
+ inject :container_metadata_repository
8
+ inject :image_evaluator
9
+
10
+ def get_dependencies!(image_metadata)
11
+ check_circular_dependencies!(image_metadata)
12
+
13
+ get_dependencies(image_metadata)
14
+ end
15
+
16
+ private
17
+
18
+ def check_circular_dependencies!(image_metadata, used_images = [])
19
+ raise Indocker::Errors::CircularImageDependency if used_images.include?(image_metadata.full_name)
20
+
21
+ used_images.push(image_metadata.full_name)
22
+
23
+ get_dependencies(image_metadata).each do |dependency|
24
+ check_circular_dependencies!(dependency, used_images)
25
+ end
26
+
27
+ nil
28
+ end
29
+
30
+ def get_dependencies(image_metadata)
31
+ container_dependencies = image_metadata.docker_cp_directives.map do |c|
32
+ container = container_metadata_repository.get_by_name(c.container_name)
33
+
34
+ image_metadata_repository.find_by_repo(container.repo, tag: container.tag)
35
+ end
36
+
37
+ return container_dependencies if image_metadata.dockerhub_image?
38
+
39
+ from_image_dependency = image_metadata_repository.find_by_repo(image_metadata.from_repo, tag: image_metadata.from_tag)
40
+
41
+ container_dependencies.push from_image_dependency
42
+ end
43
+ end
@@ -0,0 +1,69 @@
1
+ class Indocker::ImageDSL
2
+ attr_reader :directives
3
+
4
+ def initialize(context)
5
+ @context = context
6
+ @directives = []
7
+ end
8
+
9
+ def method_missing(method, *args)
10
+ @context.send(method)
11
+ rescue
12
+ super
13
+ end
14
+
15
+ def set_arg(key, value)
16
+ @context.set_value(key, value)
17
+ end
18
+
19
+ def partial(name, opts = {})
20
+ @directives << Indocker::Directives::Partial.new(name, @context, opts)
21
+ end
22
+
23
+ def from(*args)
24
+ @directives << Indocker::DockerDirectives::From.new(*args)
25
+ end
26
+
27
+ def workdir(*args)
28
+ @directives << Indocker::DockerDirectives::Workdir.new(*args)
29
+ end
30
+
31
+ def run(*args)
32
+ @directives << Indocker::DockerDirectives::Run.new(*args)
33
+ end
34
+
35
+ def cmd(*args)
36
+ @directives << Indocker::DockerDirectives::Cmd.new(*args)
37
+ end
38
+
39
+ def copy(copy_actions)
40
+ @directives << Indocker::DockerDirectives::Copy.new(
41
+ context: @context,
42
+ copy_actions: copy_actions
43
+ )
44
+ end
45
+
46
+ def copy_compile(copy_actions)
47
+ @directives << Indocker::DockerDirectives::Copy.new(
48
+ context: @context,
49
+ copy_actions: copy_actions,
50
+ compile: true
51
+ )
52
+ end
53
+
54
+ def entrypoint(*args)
55
+ @directives << Indocker::DockerDirectives::Entrypoint.new(*args)
56
+ end
57
+
58
+ def env(*args)
59
+ @directives << Indocker::DockerDirectives::Env.new(args)
60
+ end
61
+
62
+ def before_build(&block)
63
+ instance_exec &block
64
+ end
65
+
66
+ def docker_cp(container_name, &block)
67
+ @directives << Indocker::PrepareDirectives::DockerCp.new(container_name, @context.build_dir, &block)
68
+ end
69
+ end
@@ -0,0 +1,21 @@
1
+ class Indocker::ImageEvaluator
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_evaluator
5
+ inject :partial_metadata_repository
6
+
7
+ def evaluate(context, &block)
8
+ image_dsl = Indocker::ImageDSL.new(context)
9
+
10
+ image_dsl.instance_eval(&block)
11
+
12
+ image_dsl.directives
13
+ .map do |directive|
14
+ next directive if !directive.partial?
15
+
16
+ partial = partial_metadata_repository.find_by_name(directive.name)
17
+ evaluate(directive.context, &partial.definition)
18
+ end
19
+ .flatten
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ class Indocker::ImageMetadata
2
+ DEFAULT_TAG = 'latest'
3
+
4
+ attr_reader :repo, :tag, :directives, :build_dir
5
+
6
+ def initialize(repo:, tag:, directives:, build_dir:)
7
+ @repo = repo
8
+ @tag = tag
9
+ @directives = directives
10
+ @build_dir = build_dir
11
+ end
12
+
13
+ def full_name
14
+ "#{repo}:#{tag}"
15
+ end
16
+
17
+ def full_name_with_registry
18
+ "#{Indocker.config.registry}/#{local_full_name}"
19
+ end
20
+
21
+ def prepare_directives
22
+ directives.select {|d| d.prepare_directive?}
23
+ end
24
+
25
+ def build_directives
26
+ directives.select {|d| d.build_directive?}
27
+ end
28
+
29
+ def docker_cp_directives
30
+ directives.select {|d| d.is_a?(Indocker::PrepareDirectives::DockerCp)}
31
+ end
32
+
33
+ def from_repo
34
+ from_directive.repo
35
+ end
36
+
37
+ def from_tag
38
+ from_directive.tag
39
+ end
40
+
41
+ def dockerhub_image?
42
+ from_directive.dockerhub_image?
43
+ end
44
+
45
+ private
46
+
47
+ def from_directive
48
+ @directives.detect {|c| c.instance_of?(Indocker::DockerDirectives::From)}
49
+ end
50
+ end
@@ -0,0 +1,30 @@
1
+ class Indocker::ImageMetadataFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_metadata_factory
5
+
6
+ inject :image_evaluator
7
+ inject :docker_api
8
+ inject :config
9
+
10
+ def create(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG, &definition)
11
+ context = Indocker::DSLContext.new(
12
+ build_dir: build_dir(repo),
13
+ root_dir: config.root
14
+ )
15
+ directives = image_evaluator.evaluate(context, &definition)
16
+
17
+ Indocker::ImageMetadata.new(
18
+ repo: repo.intern,
19
+ tag: tag.intern,
20
+ directives: directives,
21
+ build_dir: build_dir(repo)
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def build_dir(name)
28
+ Pathname.new File.join(config.root, Indocker::BUILD_DIR, name.to_s)
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ class Indocker::ImageMetadataRepository
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_metadata_repository
5
+
6
+ def put(image_metadata)
7
+ all.push(image_metadata)
8
+ end
9
+
10
+ def find_by_repo(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
11
+ image_metadata = all.detect { |im| im.repo == repo.intern and im.tag == tag.intern }
12
+ raise Indocker::Errors::ImageIsNotDefined, "#{repo}:#{tag}" if image_metadata.nil?
13
+
14
+ image_metadata
15
+ end
16
+
17
+ def clear
18
+ @all = []
19
+ end
20
+
21
+ def all
22
+ @all ||= []
23
+ end
24
+
25
+ def method_missing(method, **args)
26
+ tag = args[:tag] || Indocker::ImageMetadata::DEFAULT_TAG
27
+
28
+ find_by_repo(method, tag: tag)
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module Indocker::Networks
2
+ class NetworkMetadata
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Indocker::Networks::NetworkMetadataFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :network_metadata_factory
5
+
6
+ def create(name)
7
+ Indocker::Networks::NetworkMetadata.new(name.to_s)
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ class Indocker::Networks::NetworkMetadataRepository
2
+ include SmartIoC::Iocify
3
+
4
+ bean :network_metadata_repository
5
+
6
+ def put(network_metadata)
7
+ if all.any? {|n| n.name == network_metadata.name}
8
+ raise Indocker::Errors::NetworkAlreadyDefined, network_metadata.name
9
+ end
10
+
11
+ all.push(network_metadata)
12
+ end
13
+
14
+ def find_by_name(name)
15
+ network_metadata = @all.detect {|network| network.name == name.to_s}
16
+ raise Indocker::Errors::NetworkIsNotDefined unless network_metadata
17
+
18
+ network_metadata
19
+ end
20
+
21
+ def clear
22
+ @all = []
23
+ end
24
+
25
+ def all
26
+ @all ||= []
27
+ end
28
+
29
+ def method_missing(method)
30
+ find_by_name(method)
31
+ rescue
32
+ super
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ class Indocker::PartialMetadata
2
+ attr_reader :name, :definition
3
+
4
+ def initialize(name, &definition)
5
+ @name = name
6
+ @definition = definition
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ class Indocker::PartialMetadataRepository
2
+ include SmartIoC::Iocify
3
+
4
+ bean :partial_metadata_repository
5
+
6
+ def put(partial_metadata)
7
+ all.push(partial_metadata)
8
+ end
9
+
10
+ def find_by_name(name)
11
+ partial = all.detect do |p|
12
+ p.name == name
13
+ end
14
+ raise Indocker::Errors::PartialIsNotDefined, name if partial.nil?
15
+
16
+ partial
17
+ end
18
+
19
+ def clear
20
+ @all = []
21
+ end
22
+
23
+ def all
24
+ @all ||= []
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ require 'smart_ioc'
2
+
3
+ class IocContainer
4
+ class << self
5
+ def [](meth, *args)
6
+ SmartIoC::Container.get_instance.get_bean(meth, *args)
7
+ end
8
+ end
9
+
10
+ def self.method_missing(meth, *args, &block)
11
+ SmartIoC::Container.get_instance.get_bean(meth, *args)
12
+ end
13
+ end
14
+
15
+ def ioc
16
+ IocContainer
17
+ end
@@ -0,0 +1,62 @@
1
+ require 'logger'
2
+ require 'colorize'
3
+
4
+ class Indocker::Logger < Logger
5
+ def initialize(*)
6
+ super
7
+ @formatter = IndockerLoggerFormatter.new
8
+ end
9
+
10
+ def clear
11
+ # do nothing
12
+ end
13
+ end
14
+
15
+
16
+ class Indocker::TestLogger < Indocker::Logger
17
+ attr_reader :strio
18
+
19
+ def initialize
20
+ @strio = StringIO.new
21
+ super(@strio)
22
+ end
23
+
24
+ def messages
25
+ @strio.string.split("\n")
26
+ end
27
+
28
+ def clear
29
+ @strio.string.clear
30
+ end
31
+ end
32
+
33
+ class IndockerLoggerFormatter
34
+ DEBUG = 'DEBUG'
35
+ ERROR = 'ERROR'
36
+ FATAL = 'FATAL'
37
+ WARN = 'WARN'
38
+ INFO = 'INFO'
39
+
40
+ def call(severity, datetime, progname, msg)
41
+ "#{colorize_log_level(severity)}: #{msg}\n"
42
+ end
43
+
44
+ private
45
+
46
+ def colorize_log_level(severity)
47
+ case severity
48
+ when DEBUG
49
+ severity.colorize(:grey)
50
+ when ERROR
51
+ severity.colorize(:red)
52
+ when FATAL
53
+ severity.colorize(:dark_red)
54
+ when WARN
55
+ severity.colorize(:white)
56
+ when INFO
57
+ severity.colorize(:green)
58
+ else
59
+ severity.colorize(:white)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,12 @@
1
+ class Indocker::LoggerFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :logger, factory_method: :build
5
+
6
+ def build
7
+ Indocker::Logger.new(STDOUT)
8
+ end
9
+ end
10
+
11
+
12
+
@@ -0,0 +1,19 @@
1
+ class Indocker::RegistryAvaliabilityChecker
2
+ include SmartIoC::Iocify
3
+
4
+ bean :registry_authenticator
5
+
6
+ inject :config
7
+ inject :docker_api
8
+
9
+ def authenticate!
10
+ docker_api.authenticate!(
11
+ serveraddress: config.docker.registry,
12
+ username: config.docker.username,
13
+ email: config.docker.email,
14
+ password: config.docker.password
15
+ )
16
+ rescue Docker::Error::AuthenticationError
17
+ raise Indocker::Errors::DockerRegistryAuthenticationError
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ class Indocker::Utils::RenderNamespace
2
+ def initialize(hash)
3
+ hash.each do |key, value|
4
+ singleton_class.send(:define_method, key) { value }
5
+ end
6
+ end
7
+
8
+ def get_binding
9
+ binding
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'erb'
2
+
3
+ module Indocker::Utils
4
+ class RenderUtil
5
+ include SmartIoC::Iocify
6
+
7
+ bean :render_util
8
+
9
+ def render(template, locals)
10
+ namespace = Indocker::Utils::RenderNamespace.new(locals)
11
+
12
+ ERB.new(template).result(namespace.get_binding)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ class Indocker::StringUtils
2
+ def self.underscore(word)
3
+ word = word.dup
4
+ word.gsub!(/::/, '/')
5
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
6
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
7
+ word.tr!("-", "_")
8
+ word.downcase!
9
+ word
10
+ end
11
+ end
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'rubygems/package'
3
+ require 'zlib'
4
+ require 'fileutils'
5
+
6
+ class Indocker::TarHelper
7
+ include SmartIoC::Iocify
8
+
9
+ bean :tar_helper
10
+
11
+ def untar(io:, destination:, ignore_wrap_directory: false)
12
+ files_list = []
13
+
14
+ Gem::Package::TarReader.new io do |tar|
15
+ tar.each do |tarfile|
16
+ if ignore_wrap_directory
17
+ tarfile_full_name = tarfile.full_name.split('/')[1..-1].join('/')
18
+ else
19
+ tarfile_full_name = tarfile.full_name
20
+ end
21
+
22
+ destination_file = File.join destination, tarfile_full_name
23
+
24
+ if tarfile.directory?
25
+ FileUtils.mkdir_p destination_file
26
+ else
27
+ files_list.push(tarfile_full_name)
28
+
29
+ destination_directory = File.dirname(destination_file)
30
+ FileUtils.mkdir_p destination_directory unless File.directory?(destination_directory)
31
+ File.open destination_file, "wb" do |f|
32
+ f.print tarfile.read
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ files_list
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ class Indocker::TestLoggerFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :logger, context: :test, factory_method: :build
5
+
6
+ def build
7
+ Indocker::TestLogger.new
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
- module InDocker
2
- VERSION = '0.0.0'.freeze
1
+ module Indocker
2
+ VERSION = '0.0.1'.freeze
3
3
  end