pipe_fitter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b23b1fe9578e816dd779dc1a5cb44995d1290c1
4
+ data.tar.gz: b5035699203388bfc31654839cf84d2d44cb3644
5
+ SHA512:
6
+ metadata.gz: bfb1784675d8dfa25567adcc5ace6f5828387c2aaef3d107daa5d7055978bf19332ab2adbf128b42f9d9871b069c10c7f12a1abc4e6e0ed878e76b445cbfa546
7
+ data.tar.gz: 44fa120401769db6b94bf3b59c5ef1ca0c537462aa9cf2ecd0f65d76cd55d9df1c84a669229de78da7fc68716cf4683bd548692a73ea83580ec9bf7331f83a15
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pipe_fitter.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 masa21kik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # PipeFitter
2
+
3
+ PipeFitter is a tool for AWS Data Pipeline.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'pipe_fitter'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install pipe_fitter
20
+
21
+ ## Usage
22
+
23
+ Register pipeline.
24
+
25
+ ```
26
+ pipe_fitter register <pipeline name>
27
+ ```
28
+
29
+ Show difference.
30
+
31
+ ```
32
+ pipe_fitter diff <pipeline name>
33
+ ```
34
+
35
+ ## Development
36
+
37
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
38
+
39
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
40
+
41
+ ## Contributing
42
+
43
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/pipe_fitter.
44
+
45
+
46
+ ## License
47
+
48
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
49
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ desc "Run test_unit based test"
5
+ Rake::TestTask.new do |t|
6
+ # To run test for only one file (or file path pattern)
7
+ # $ bundle exec rake test TEST=test/test_specified_path.rb
8
+ t.libs << "test"
9
+ t.test_files = Dir["test/**/test_*.rb"]
10
+ t.verbose = true
11
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "pipe_fitter"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require "pry"
11
+ Pry.start
12
+
13
+ # require "irb"
14
+ # IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/pipe_filter ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "pipe_fitter/cli"
4
+ PipeFitter::Cli.start
@@ -0,0 +1,7 @@
1
+ require "pipe_fitter/version"
2
+ require "pipe_fitter/pipeline"
3
+ require "pipe_fitter/yaml_loader"
4
+ require "pipe_fitter/data_pipeline_client"
5
+
6
+ module PipeFitter
7
+ end
@@ -0,0 +1,50 @@
1
+ require "pipe_fitter"
2
+ require "thor"
3
+
4
+ module PipeFitter
5
+ class Cli < Thor
6
+ class_option :region, type: :string
7
+ class_option :profile, type: :string
8
+
9
+ desc "export", "Export pipeline definition"
10
+ option :pipeline_id, type: :string, required: true, aliases: "i"
11
+ def export
12
+ puts client.definition(options[:pipeline_id]).to_yaml
13
+ end
14
+
15
+ desc "register DEFINITION_FILE", "Register pipeline"
16
+ def register(definition_file)
17
+ id, res = client.register(definition_file)
18
+ puts id, JSON.pretty_generate(res)
19
+ end
20
+
21
+ desc "diff DEFINITION_FILE", "Show pipeline difference"
22
+ option :pipeline_id, type: :string, required: true, aliases: "i"
23
+ option :format, type: :string, default: "color", aliases: "f"
24
+ def diff(definition_file)
25
+ puts client.diff(options[:pipeline_id], definition_file, options[:format])
26
+ end
27
+
28
+ desc "update DEFINITION_FILE", "Update pipeline definition"
29
+ option :pipeline_id, type: :string, required: true, aliases: "i"
30
+ def update(definition_file)
31
+ res = client.update(options[:pipeline_id], definition_file)
32
+ puts JSON.pretty_generate(res)
33
+ end
34
+
35
+ desc "activate pipeline", "Activate pipeline"
36
+ option :pipeline_id, type: :string, required: true, aliases: "i"
37
+ option :parameter_values, type: :hash, required: false, aliases: "p"
38
+ option :start_timestamp, type: :string, required: false, aliases: "t"
39
+ def activate
40
+ t = options[:start_timestamp] ? Time.parse(options[:start_timestamp]) : nil
41
+ puts client.activate(options[:pipeline_id], options[:parameter_values], t)
42
+ end
43
+
44
+ private
45
+
46
+ def client
47
+ @client ||= DataPipelineClient.new(options)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,77 @@
1
+ require "aws-sdk"
2
+
3
+ module PipeFitter
4
+ class NoSuchPipelineError < StandardError; end
5
+
6
+ class DataPipelineClient
7
+ def initialize(options)
8
+ @options = options.map { |k, v| [k.to_sym, v] }.to_h
9
+ end
10
+
11
+ def register(definition_file)
12
+ p = Pipeline.load_yaml(definition_file)
13
+ create(p)
14
+ end
15
+
16
+ def diff(pipeline_id, definition_file, format = :color)
17
+ p = Pipeline.load_yaml(definition_file)
18
+ definition(pipeline_id).diff(p, format.to_sym)
19
+ end
20
+
21
+ def update(pipeline_id, definition_file)
22
+ p = Pipeline.load_yaml(definition_file)
23
+ put_definition(pipeline_id, p)
24
+ end
25
+
26
+ def definition(pipeline_id)
27
+ res = exec(:get_pipeline_definition, pipeline_id: pipeline_id)
28
+ desc = description(pipeline_id)
29
+ Pipeline.new(res.to_h, desc.to_h)
30
+ end
31
+
32
+ def put_definition(pipeline_id, pipeline)
33
+ sync_tags(pipeline_id, pipeline)
34
+ exec(:put_pipeline_definition, pipeline.put_definition_opts(pipeline_id)).to_h
35
+ end
36
+
37
+ def create(pipeline)
38
+ res = exec(:create_pipeline, pipeline.create_opts)
39
+ [res.pipeline_id, put_definition(res.pipeline_id, pipeline)]
40
+ end
41
+
42
+ def activate(pipeline_id, parameter_values, start_timestamp)
43
+ p = Pipeline.new({}, { pipeline_id: pipeline_id })
44
+ exec(:activate_pipeline, p.activate_opts(parameter_values, start_timestamp))
45
+ end
46
+
47
+ private
48
+
49
+ def description(pipeline_id)
50
+ desc = exec(:describe_pipelines, pipeline_ids: [pipeline_id]).pipeline_description_list.first
51
+ raise NoSuchPipelineError, pipeline_id if desc.nil?
52
+ desc
53
+ end
54
+
55
+ def sync_tags(pipeline_id, pipeline)
56
+ p = definition(pipeline_id)
57
+ return if p.tags == pipeline.tags
58
+ exec(:remove_tags, p.remove_tags_opts) unless p.tags.empty?
59
+ exec(:add_tags, pipeline.add_tags_opts(pipeline_id)) unless pipeline.tags.empty?
60
+ end
61
+
62
+ def exec(method, *args)
63
+ client.send(method, *args)
64
+ rescue Aws::DataPipeline::Errors::PipelineNotFoundException, Aws::DataPipeline::Errors::PipelineDeletedException => e
65
+ raise NoSuchPipelineError, args.unshift(e.class)
66
+ end
67
+
68
+ def client
69
+ @client ||= Aws::DataPipeline::Client.new(sdk_opts)
70
+ end
71
+
72
+ def sdk_opts
73
+ keys = %i(region profile).freeze
74
+ @options.select { |k, _| keys.include?(k) }
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,112 @@
1
+ require "yaml"
2
+ require "hashie"
3
+ require "diffy"
4
+ require "pathname"
5
+
6
+ module PipeFitter
7
+ class Pipeline
8
+ class << self
9
+ def load_yaml(filename)
10
+ filepath = Pathname.new(filename)
11
+ desc = YamlLoader.load(filepath)
12
+ definition = desc.delete("definition")
13
+ Pipeline.new(definition, desc)
14
+ end
15
+ end
16
+
17
+ DESCRIPTION_KEYS = %w(name tags unique_id description).freeze
18
+ Diffy::Diff.default_options.merge!(diff: "-u", include_diff_info: true)
19
+
20
+ def initialize(definition, description = {})
21
+ @definition = Hashie::Mash.new(definition)
22
+ @full_description = Hashie::Mash.new(description).tap do |h|
23
+ if (fs = h[:fields]) && (f = fs.find { |e| e[:key] == "uniqueId" }) && f.key?(:string_value)
24
+ h.unique_id ||= f[:string_value]
25
+ end
26
+ end
27
+ @description = Hashie::Mash.new(@full_description.select { |k, v| DESCRIPTION_KEYS.include?(k) && !v.nil? })
28
+ end
29
+
30
+ def to_yaml
31
+ stringify_keys(@description.merge("definition" => sorted_definition)).to_yaml
32
+ end
33
+
34
+ def create_opts
35
+ symbolize_keys(@description)
36
+ end
37
+
38
+ def put_definition_opts(id = nil)
39
+ base = { pipeline_id: id || pipeline_id }
40
+ base.merge(symbolize_keys(@definition))
41
+ end
42
+
43
+ def add_tags_opts(id = nil)
44
+ { pipeline_id: id || pipeline_id, tags: @full_description.tags }
45
+ end
46
+
47
+ def remove_tags_opts(id = nil)
48
+ { pipeline_id: id || pipeline_id, tag_keys: @full_description.tags.map { |e| e["key"] } }
49
+ end
50
+
51
+ def activate_opts(parameter_values, start_timestamp = nil, id = nil)
52
+ pv = (parameter_values || {}).map { |k, v| { "id" => k.to_s, "string_value" => v.to_s } }
53
+ { pipeline_id: id || pipeline_id, parameter_values: pv, start_timestamp: start_timestamp }.select { |_, v| !v.nil? }
54
+ end
55
+
56
+ def pipeline_id
57
+ @full_description.pipeline_id
58
+ end
59
+
60
+ def name
61
+ @full_description.name
62
+ end
63
+
64
+ def tags
65
+ @full_description.tags
66
+ end
67
+
68
+ def diff(other, format = nil)
69
+ Diffy::Diff.new(self.to_yaml, other.to_yaml).to_s(format)
70
+ end
71
+
72
+ private
73
+
74
+ def sorted_definition
75
+ top_keys = %w(pipeline_objects parameter_objects parameter_values).freeze
76
+ obj_keys = %w(id name fields).freeze
77
+ field_keys = %w(key string_value ref_value).freeze
78
+
79
+ d = @definition.sort_by { |k, _| [top_keys.index(k) || top_keys.size, k] }.to_h
80
+ top_keys.each do |k|
81
+ next if !d[k].is_a?(Array) || d[k].empty?
82
+ d[k] = d[k].sort_by { |e| e["id"] }
83
+ d[k].map! do |v|
84
+ v["fields"] = v["fields"].sort_by { |e| e["key"] }
85
+ v["fields"].map! { |vv| vv.sort_by { |kk, _| field_keys.index(kk) }.to_h }
86
+ v.sort_by { |kk, _| obj_keys.index(kk) }.to_h
87
+ end
88
+ end
89
+ d
90
+ end
91
+
92
+ def stringify_keys(val)
93
+ modify_keys_recursively(val, __method__)
94
+ end
95
+
96
+ def symbolize_keys(val)
97
+ modify_keys_recursively(val, __method__)
98
+ end
99
+
100
+ def modify_keys_recursively(val, method)
101
+ return val unless val.is_a?(Hash)
102
+ h = Hashie.send(method, val.to_h)
103
+ h.each do |k, v|
104
+ case v
105
+ when Array then h[k].map! { |e| self.send(method, e) }
106
+ when Hash then h[k] = self.send(method, v)
107
+ end
108
+ end
109
+ h
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,3 @@
1
+ module PipeFitter
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,24 @@
1
+ require "yaml"
2
+ require "erb"
3
+
4
+ module PipeFitter
5
+ class YamlLoader
6
+ class << self
7
+ def load(filename, context_filename = nil)
8
+ context = context_filename.nil? ? nil : YAML.load_file(context_filename)
9
+ YAML.load(eval_erb(filename, context)) || {}
10
+ end
11
+
12
+ def include_yaml(filepath, indent = 1)
13
+ load(filepath).to_yaml.chomp.gsub("---", "").gsub("\n", "\n" + " " * indent)
14
+ end
15
+
16
+ private
17
+
18
+ def eval_erb(filename, context = nil)
19
+ context ||= {}
20
+ ERB.new(File.read(filename)).result(binding)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pipe_fitter/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pipe_fitter"
8
+ spec.version = PipeFitter::VERSION
9
+ spec.authors = ["masa21kik"]
10
+ spec.email = ["masa21kik@gmail.com"]
11
+
12
+ spec.summary = %q{PipeFitter is a tool for AWS Data Pipeline.}
13
+ spec.description = %q{PipeFitter is a tool for AWS Data Pipeline.}
14
+ spec.homepage = "https://github.com/masa21kik/pipe_fitter"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency "aws-sdk", "~> 2"
23
+ spec.add_runtime_dependency "diffy"
24
+ spec.add_runtime_dependency "thor"
25
+ spec.add_runtime_dependency "hashie"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.11"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "simplecov"
30
+ spec.add_development_dependency "test-unit"
31
+ spec.add_development_dependency "test-unit-rr"
32
+ spec.add_development_dependency "pry-byebug"
33
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pipe_fitter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - masa21kik
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: diffy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hashie
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.11'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: test-unit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: test-unit-rr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-byebug
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: PipeFitter is a tool for AWS Data Pipeline.
154
+ email:
155
+ - masa21kik@gmail.com
156
+ executables:
157
+ - pipe_filter
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - ".travis.yml"
163
+ - Gemfile
164
+ - LICENSE.txt
165
+ - README.md
166
+ - Rakefile
167
+ - bin/console
168
+ - bin/setup
169
+ - exe/pipe_filter
170
+ - lib/pipe_fitter.rb
171
+ - lib/pipe_fitter/cli.rb
172
+ - lib/pipe_fitter/data_pipeline_client.rb
173
+ - lib/pipe_fitter/pipeline.rb
174
+ - lib/pipe_fitter/version.rb
175
+ - lib/pipe_fitter/yaml_loader.rb
176
+ - pipe_fitter.gemspec
177
+ homepage: https://github.com/masa21kik/pipe_fitter
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.5.1
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: PipeFitter is a tool for AWS Data Pipeline.
201
+ test_files: []