orchparty 0.3.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1457e581b4223905242191ad8c8c8af33a7315f0
4
- data.tar.gz: 8cdc21be1791bdd231e6b14fa80bb85e9987a1f6
3
+ metadata.gz: b2ccdea8159a378436eaf3a11787bacf9535f8ad
4
+ data.tar.gz: 3dba4a2eefd4c7939dff7a96a27b4fb3b04d19d1
5
5
  SHA512:
6
- metadata.gz: dfc51ef7fb8e5a343545c6a053ac57cda2301a4a8c3f2f897db6a08e9d32d34bc005af15953f52324f6297573bd412c69457006de35a83d1d022beae8ca97d64
7
- data.tar.gz: 776a740d2943f4ef606812c67cbaf4ccbf66d4e0cdd20c8bf1f5284e92842f1bb0c179314a0fb2dfdd8cc61457a62d61d479fb8fe3744af7a2e35fecd6b15fcc
6
+ metadata.gz: 7754f19348534203cf89552abbd3dd8288380770e1e5045e1735ec1196b4ab49caadc4c96cd7c9f93d3da302b240bd60e15e00ff19015224f9e4c2eb4a3e78bc
7
+ data.tar.gz: f770f266217b8131e7cfff17952ab49f3a1d54cf19af52465d57dd8942fbcd6710a4798cfad6222683f28d295ea407b596ce580d9916bdc0474f6af012162df0
data/.dockerignore ADDED
@@ -0,0 +1 @@
1
+ Dockerfile
data/Dockerfile ADDED
@@ -0,0 +1,14 @@
1
+ FROM ruby:2.3.1-slim
2
+ RUN apt-get update && apt-get install -y git
3
+ RUN mkdir /orchparty
4
+ WORKDIR /orchparty
5
+ ADD Gemfile .
6
+ ADD Gemfile.lock .
7
+ ADD orchparty.gemspec .
8
+ ADD lib lib
9
+ ADD .git .git
10
+ RUN bundle install --without development test
11
+ ADD . .
12
+ RUN rake install
13
+ COPY docker-entrypoint /usr/local/bin/
14
+ ENTRYPOINT ["/bin/sh", "docker-entrypoint"]
data/README.md CHANGED
@@ -83,6 +83,8 @@ Maybe for the future it is possible to run the gem in a docker container, so no
83
83
 
84
84
  ## Usage
85
85
 
86
+ ### CLI
87
+
86
88
  See the commandline usage instrucution by running:
87
89
 
88
90
  $ orchparty help
@@ -90,7 +92,41 @@ See the commandline usage instrucution by running:
90
92
  For generating eg. use:
91
93
 
92
94
 
93
- $ orchparty g stack.rb docker-compose.yml my-cool-app -g docker_compose_v2
95
+ $ orchparty generate docker_compose_v2 -f stack.rb -o docker-compose.yml -a my-cool-app
96
+
97
+ ### In your own piece of code
98
+
99
+ ```ruby
100
+ require 'orchparty'
101
+
102
+ # load the generator plugin you want to use
103
+ Orchparty.plugin :docker_compose_v1
104
+
105
+ Orchparty.generate(:docker_compose_v1,
106
+ # all options that are needed for orchparty to transform
107
+ # your input to a plain hash for generating
108
+ {filename: "path/to/input_file.rb",
109
+ application: "application_name_to_generate" },
110
+ # all options that are needed for the plugin
111
+ {output: "path/to/output_file.yml"})
112
+ ```
113
+
114
+ ### In your own piece of code
115
+
116
+ ```ruby
117
+ require 'orchparty'
118
+
119
+ # load the generator plugin you want to use
120
+ Orchparty.plugin :docker_compose_v1
121
+
122
+ Orchparty.generate(:docker_compose_v1,
123
+ # all options that are needed for orchparty to transform
124
+ # your input to a plain hash for generating
125
+ {filename: "path/to/input_file.rb",
126
+ application: "application_name_to_generate" },
127
+ # all options that are needed for the plugin
128
+ {output: "path/to/output_file.yml"})
129
+ ```
94
130
 
95
131
  ## DSL spec
96
132
 
@@ -341,6 +377,72 @@ application 'app_perf-prod' do
341
377
  end
342
378
  ```
343
379
 
380
+ ## Plugins
381
+
382
+ Orchparty allows you to write own generators via a Plugin system. Also the
383
+ buildin generators like docker_compose_v1 and docker_compose_v2 generators are
384
+ only plugins.
385
+
386
+ To build your own plugin create a ruby gem with a Plugin
387
+ configuration under lib/orchparty/plugin/#{plugin_name}.rb
388
+
389
+ ### Example Plugin:
390
+ ```ruby
391
+
392
+ module Orchparty
393
+ module Plugin
394
+ class DockerComposeV1
395
+
396
+ def self.desc
397
+ # this description is shown in the cli
398
+ "generate docker-compose v1 file"
399
+ end
400
+
401
+ def self.define_flags(c)
402
+ # give add all flags that your Generator needs
403
+ # see [davetron5000/gli](https://github.com/davetron5000/gli) for
404
+ # documentatino of flags
405
+ c.flag [:output,:o], required: true, :desc => 'Set the output file'
406
+ end
407
+
408
+ def self.generate(application, options)
409
+ # Orchparty will pass the compiled application hash and all options
410
+ # that you required in define_flags.
411
+ # Here is the place where you can write your generation logic
412
+ File.write(options[:output], output(application))
413
+ end
414
+
415
+ private
416
+ def self.output(ast)
417
+ ast.services.map do |name, service|
418
+ service = service.to_h
419
+ service.delete(:mix)
420
+ [service.delete(:name), HashUtils.deep_stringify_keys(service.to_h)]
421
+ end.to_h.to_yaml
422
+ end
423
+
424
+ end
425
+ end
426
+ end
427
+
428
+ # register your plugin
429
+ Orchparty::Plugin.register_plugin(:docker_compose_v1, Orchparty::Plugin::DockerComposeV1)
430
+ ```
431
+
432
+ ### Plugin Usage:
433
+
434
+ #### CLI
435
+ The CLI tries to load all plugins that you have installed as gem by using
436
+ Gem::Specification.
437
+
438
+
439
+ #### Code
440
+
441
+ If you use orchparty as part of a own application load a plugin via:
442
+
443
+ ```ruby
444
+ Orchparty.plugin(:docker_compose_v1)
445
+ ```
344
446
 
345
447
  ## Development
346
448
 
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
2
 
4
- RSpec::Core::RakeTask.new(:spec)
5
3
 
6
- task :default => :spec
4
+ task :upload_docker do
5
+ `docker build . `
6
+
7
+ end
data/docker-entrypoint ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ cd "/rootfs${ROOT_PWD}" && orchparty $@
data/exe/orchparty CHANGED
@@ -1,15 +1,2 @@
1
1
  #!/usr/bin/env ruby
2
- require "thor"
3
- require "orchparty"
4
-
5
- class OrchPartyCommand < Thor
6
- desc "generate INPUT_FILE OUTPUT_FILE APPLICATION_NAME", "generates a configuration file for an application"
7
- method_option :generator, :aliases => "-g", default: "docker_compose_v1", :desc => "Which generator to take"
8
- method_option :aliases => "g"
9
- def generate(input_file, output_file, application_name)
10
- generator = options[:generator] || "docker_compose_v1"
11
- File.write(output_file, Orchparty.send(generator.to_sym, input_file, application_name))
12
- end
13
- end
14
-
15
- OrchPartyCommand.start
2
+ require "orchparty/cli"
@@ -0,0 +1,33 @@
1
+ require 'orchparty'
2
+ require 'gli'
3
+
4
+ Orchparty.load_all_available_plugins
5
+
6
+ class OrchPartyApp
7
+ extend GLI::App
8
+
9
+ program_desc 'Write your orchestration configuration with a Ruby DSL that allows you to have mixins, imports and variables.'
10
+ version Orchparty::VERSION
11
+
12
+ subcommand_option_handling :normal
13
+
14
+ desc "Compiles a Orchparty input file to a orchestration framework configuration"
15
+ command :generate do |com|
16
+ Orchparty.plugins.each do |name, plugin|
17
+ com.desc plugin.desc
18
+ com.command(name) do |plugin_command|
19
+ plugin_command.flag [:filename,:f,'file-name'], required: true, :desc => 'The Orchparty input file'
20
+ plugin_command.flag [:application,:a], required: true, :desc => 'The application that should be compiled'
21
+ plugin.define_flags(plugin_command)
22
+ plugin_command.action do |global_options,plugin_options,args|
23
+ options = plugin_options.delete(GLI::Command::PARENT)
24
+ options[:application] = plugin_options[:application]
25
+ options[:filename] = plugin_options[:filename]
26
+ Orchparty.generate(name, options, plugin_options)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ exit OrchPartyApp.run(ARGV)
@@ -0,0 +1,24 @@
1
+ module Orchparty
2
+ module Plugin
3
+ @plugins = {}
4
+
5
+ def self.load_plugin(name)
6
+ begin
7
+ require "orchparty/plugins/#{name}"
8
+ raise "Plugin didn't correctly register itself" unless @plugins[name]
9
+ @plugins[name]
10
+ rescue LoadError
11
+ puts "could not load the plugin #{name}, you might install it as a gem or you need to write it by your self ;)"
12
+ false
13
+ end
14
+ end
15
+
16
+ def self.plugins
17
+ @plugins
18
+ end
19
+
20
+ def self.register_plugin(name, mod)
21
+ @plugins[name] = mod
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ module Orchparty
2
+ module Plugin
3
+ class DockerComposeV1
4
+
5
+ def self.desc
6
+ "generate docker-compose v1 file"
7
+ end
8
+
9
+ def self.define_flags(c)
10
+ c.flag [:output,:o], :desc => 'Set the output file'
11
+ end
12
+
13
+ def self.generate(ast, options)
14
+ output = output(ast)
15
+ if options[:output]
16
+ File.write(options[:output], output)
17
+ else
18
+ puts output
19
+ end
20
+ end
21
+
22
+ def self.output(ast)
23
+ ast.services.map do |name, service|
24
+ service = service.to_h
25
+ service.delete(:mix)
26
+ [service.delete(:name), HashUtils.deep_stringify_keys(service.to_h)]
27
+ end.to_h.to_yaml
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+
34
+ Orchparty::Plugin.register_plugin(:docker_compose_v1, Orchparty::Plugin::DockerComposeV1)
@@ -1,19 +1,31 @@
1
1
  require 'yaml'
2
2
  module Orchparty
3
- module Generators
4
- class DockerComposeV2
5
- attr_reader :ast
6
- def initialize(ast)
7
- @ast = ast
3
+ module Plugin
4
+ module DockerComposeV2
5
+
6
+ def self.desc
7
+ "generate docker-compose v2 file"
8
+ end
9
+
10
+ def self.define_flags(c)
11
+ c.flag [:output,:o], :desc => 'Set the output file'
8
12
  end
9
13
 
10
- def transform_to_yaml(hash)
14
+ def self.generate(ast, options)
15
+ output = output(ast)
16
+ if options[:output]
17
+ File.write(options[:output], output)
18
+ else
19
+ puts output
20
+ end
21
+ end
22
+
23
+ def self.transform_to_yaml(hash)
11
24
  hash = hash.deep_transform_values{|v| v.is_a?(Hash) ? v.to_h : v }
12
25
  HashUtils.deep_stringify_keys(hash)
13
26
  end
14
27
 
15
- def output(application_name)
16
- application = ast.applications[application_name]
28
+ def self.output(application)
17
29
  {"version" => "2",
18
30
  "services" =>
19
31
  application.services.map do |name,service|
@@ -24,7 +36,8 @@ module Orchparty
24
36
  "networks" => transform_to_yaml(application.networks),
25
37
  }.to_yaml
26
38
  end
27
-
28
39
  end
29
40
  end
30
41
  end
42
+
43
+ Orchparty::Plugin.register_plugin(:docker_compose_v2, Orchparty::Plugin::DockerComposeV2)
@@ -1,3 +1,3 @@
1
1
  module Orchparty
2
- VERSION = "0.3.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/orchparty.rb CHANGED
@@ -3,22 +3,31 @@ require "orchparty/version"
3
3
  require "orchparty/ast"
4
4
  require "orchparty/context"
5
5
  require "orchparty/transformations"
6
- require "orchparty/generators"
7
6
  require "orchparty/dsl_parser"
7
+ require "orchparty/plugin"
8
8
  require "hash"
9
9
 
10
10
  module Orchparty
11
11
 
12
+ def self.load_all_available_plugins
13
+ Gem::Specification.map {|f| f.matches_for_glob("orchparty/plugins/*.rb") }.flatten.map{|file_name| File.basename(file_name, ".*").to_sym }.each do |plugin_name|
14
+ plugin(plugin_name)
15
+ end
16
+ end
17
+
18
+ def self.plugins
19
+ Orchparty::Plugin.plugins
20
+ end
12
21
 
13
- def self.ast(input_file)
14
- Transformations.transform(Orchparty::DSLParser.new(input_file).parse)
22
+ def self.plugin(name)
23
+ Orchparty::Plugin.load_plugin(name)
15
24
  end
16
25
 
17
- def self.docker_compose_v1(input_file, application_name)
18
- Orchparty::Generators::DockerComposeV1.new(ast(input_file)).output(application_name)
26
+ def self.ast(filename: , application:)
27
+ Transformations.transform(Orchparty::DSLParser.new(filename).parse).applications[application]
19
28
  end
20
29
 
21
- def self.docker_compose_v2(input_file, application_name)
22
- Orchparty::Generators::DockerComposeV2.new(ast(input_file)).output(application_name)
30
+ def self.generate(plugin_name, options, plugin_options)
31
+ plugins[plugin_name].generate(ast(filename: options[:filename], application: options[:application]), plugin_options)
23
32
  end
24
33
  end
data/orchparty.gemspec CHANGED
@@ -25,8 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ["lib"]
26
26
 
27
27
  spec.add_dependency "hashie", "~> 3.5.6"
28
- spec.add_dependency "thor", "~> 0.19.4"
29
- spec.add_dependency 'psych', '~> 2.2', '>= 2.2.4'
28
+ spec.add_dependency "gli", "~> 2.16.0"
30
29
  spec.add_development_dependency "bundler", "~> 1.13"
31
30
  spec.add_development_dependency "rake", "~> 10.0"
32
31
  spec.add_development_dependency "rspec", "~> 3.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orchparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jannis Huebl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-04 00:00:00.000000000 Z
11
+ date: 2017-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -25,39 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.5.6
27
27
  - !ruby/object:Gem::Dependency
28
- name: thor
28
+ name: gli
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.19.4
33
+ version: 2.16.0
34
34
  type: :runtime
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.19.4
41
- - !ruby/object:Gem::Dependency
42
- name: psych
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '2.2'
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 2.2.4
51
- type: :runtime
52
- prerelease: false
53
- version_requirements: !ruby/object:Gem::Requirement
54
- requirements:
55
- - - "~>"
56
- - !ruby/object:Gem::Version
57
- version: '2.2'
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: 2.2.4
40
+ version: 2.16.0
61
41
  - !ruby/object:Gem::Dependency
62
42
  name: bundler
63
43
  requirement: !ruby/object:Gem::Requirement
@@ -110,11 +90,13 @@ executables:
110
90
  extensions: []
111
91
  extra_rdoc_files: []
112
92
  files:
93
+ - ".dockerignore"
113
94
  - ".gitignore"
114
95
  - ".rspec"
115
96
  - ".travis.yml"
116
97
  - CNAME
117
98
  - CODE_OF_CONDUCT.md
99
+ - Dockerfile
118
100
  - Gemfile
119
101
  - LICENSE
120
102
  - README.md
@@ -122,16 +104,18 @@ files:
122
104
  - _config.yml
123
105
  - bin/console
124
106
  - bin/setup
107
+ - docker-entrypoint
125
108
  - exe/orchparty
126
109
  - lib/deep_merge.rb
127
110
  - lib/hash.rb
128
111
  - lib/orchparty.rb
129
112
  - lib/orchparty/ast.rb
113
+ - lib/orchparty/cli.rb
130
114
  - lib/orchparty/context.rb
131
115
  - lib/orchparty/dsl_parser.rb
132
- - lib/orchparty/generators.rb
133
- - lib/orchparty/generators/docker_compose_v1.rb
134
- - lib/orchparty/generators/docker_compose_v2.rb
116
+ - lib/orchparty/plugin.rb
117
+ - lib/orchparty/plugins/docker_compose_v1.rb
118
+ - lib/orchparty/plugins/docker_compose_v2.rb
135
119
  - lib/orchparty/transformations.rb
136
120
  - lib/orchparty/transformations/all.rb
137
121
  - lib/orchparty/transformations/mixin.rb
@@ -1,20 +0,0 @@
1
- require 'psych'
2
- module Orchparty
3
- module Generators
4
- class DockerComposeV1
5
- attr_reader :ast
6
- def initialize(ast)
7
- @ast = ast
8
- end
9
-
10
- def output(application_name)
11
- Psych.dump(ast.applications[application_name].services.map do |name, service|
12
- service = service.to_h
13
- service.delete(:mix)
14
- [service.delete(:name), HashUtils.deep_stringify_keys(service.to_h)]
15
- end.to_h)
16
- end
17
-
18
- end
19
- end
20
- end
@@ -1,7 +0,0 @@
1
- require 'orchparty/generators/docker_compose_v1'
2
- require 'orchparty/generators/docker_compose_v2'
3
-
4
- module Orchparty
5
- module Generators
6
- end
7
- end