indocker 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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