bq_coaster 0.2.0
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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +36 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bq_coaster.gemspec +30 -0
- data/exe/coaster +8 -0
- data/lib/bq_coaster/cli.rb +33 -0
- data/lib/bq_coaster/ext/string.rb +7 -0
- data/lib/bq_coaster/generators/base.rb +24 -0
- data/lib/bq_coaster/generators/dataflow_converter/class.erb +18 -0
- data/lib/bq_coaster/generators/dataflow_converter/context.rb +52 -0
- data/lib/bq_coaster/generators/dataflow_converter/converter.erb +9 -0
- data/lib/bq_coaster/generators/dataflow_converter/converter_renderer.rb +35 -0
- data/lib/bq_coaster/generators/dataflow_converter.rb +40 -0
- data/lib/bq_coaster/generators/java_class/class.erb +21 -0
- data/lib/bq_coaster/generators/java_class/class_context.rb +65 -0
- data/lib/bq_coaster/generators/java_class/class_renderer.rb +38 -0
- data/lib/bq_coaster/generators/java_class/java_class.erb +10 -0
- data/lib/bq_coaster/generators/java_class.rb +47 -0
- data/lib/bq_coaster/generators/schema.rb +37 -0
- data/lib/bq_coaster/renderer.rb +25 -0
- data/lib/bq_coaster/version.rb +3 -0
- data/lib/bq_coaster.rb +16 -0
- metadata +155 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 93e8bfd289547d0ead44a5d5f70558fbf5bfee9a
|
4
|
+
data.tar.gz: 6fb3ce3da647d07e3de0dd2cb989914aecd0e31f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 21a70ff50d50f2b5c4f9de5aaad4d4619df2cc01875df40101191d49d0e1b72757c328074b6f1ecdf976e9046e0df7a6d19c6030dd2609384a02dcedd2d5b143
|
7
|
+
data.tar.gz: 9c84a9d70a5505bc39281700b17c5565b8edfe9d7bf2ca16437720ec9ca5687625a480690f59e0c677487c55426f73a81d9315ca422f8b5b64f808fd7181c5ec
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# BqCoaster
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/bq_coaster`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'bq_coaster'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install bq_coaster
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
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.
|
30
|
+
|
31
|
+
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).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/bq_coaster.
|
36
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "bq_coaster"
|
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(__FILE__)
|
data/bin/setup
ADDED
data/bq_coaster.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'bq_coaster/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "bq_coaster"
|
9
|
+
spec.version = BqCoaster::VERSION
|
10
|
+
spec.authors = ["nownabe"]
|
11
|
+
spec.email = ["nownabe@gmail.com"]
|
12
|
+
|
13
|
+
spec.summary = %q{Automation Tools for BigQuery / Dataflow}
|
14
|
+
spec.homepage = "https://github.com/nownabe/bq_coaster"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features)/})
|
18
|
+
end
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_dependency "erubis"
|
24
|
+
spec.add_dependency "thor"
|
25
|
+
spec.add_dependency "hashie"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
30
|
+
end
|
data/exe/coaster
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "thor"
|
4
|
+
require "bq_coaster/ext/string"
|
5
|
+
|
6
|
+
module BqCoaster
|
7
|
+
class Cli < Thor
|
8
|
+
desc "schema <definition_file>", "Generate BigQuery schema JSON"
|
9
|
+
def schema(definition_file)
|
10
|
+
require "bq_coaster/generators/schema"
|
11
|
+
puts Generators::Schema.new(definition_file, options).generate
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "java_class <definition_file>", "Generate Java class"
|
15
|
+
option :dataflow, type: :boolean, desc: "with Dataflow coder"
|
16
|
+
option :class_name, type: :string, desc: "Java class name"
|
17
|
+
option :package, type: :string, desc: "Java package name"
|
18
|
+
def java_class(definition_file)
|
19
|
+
require "bq_coaster/generators/java_class"
|
20
|
+
puts Generators::JavaClass.new(definition_file, options).generate
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "dataflow_converter <definition_file>",
|
24
|
+
"Generate Java class that converts POJO generated by BqCoaster to TableRow class for Dataflow"
|
25
|
+
option :class_name, type: :string, desc: "Java class name"
|
26
|
+
option :source_class, type: :string, desc: "POJO class name"
|
27
|
+
option :package, type: :string, desc: "Java package name"
|
28
|
+
def dataflow_converter(definition_file)
|
29
|
+
require "bq_coaster/generators/dataflow_converter"
|
30
|
+
puts Generators::DataflowConverter.new(definition_file, options).generate
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
require "hashie/mash"
|
5
|
+
|
6
|
+
module BqCoaster
|
7
|
+
module Generators
|
8
|
+
class Base
|
9
|
+
attr_reader :definition_file, :options
|
10
|
+
|
11
|
+
def initialize(definition_file, options)
|
12
|
+
@definition_file = definition_file
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def definitions
|
19
|
+
@definitions ||=
|
20
|
+
Hashie::Mash.new(YAML.load_file(definition_file))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%- if package %>
|
2
|
+
package <%= package %>;
|
3
|
+
|
4
|
+
<%- end %>
|
5
|
+
import com.google.api.services.bigquery.model.TableRow;
|
6
|
+
import org.apache.beam.sdk.transforms.SimpleFunction;
|
7
|
+
|
8
|
+
public class <%= class_name %>
|
9
|
+
extends SimpleFunction<<%= source_class %>, TableRow> {
|
10
|
+
|
11
|
+
@Override
|
12
|
+
public TableRow apply(<%= source_class %> src) {
|
13
|
+
TableRow row = new TableRow();
|
14
|
+
|
15
|
+
<%= converter %>
|
16
|
+
return row;
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster"
|
4
|
+
require "bq_coaster/generators/dataflow_converter/converter_renderer"
|
5
|
+
|
6
|
+
module BqCoaster
|
7
|
+
module Generators
|
8
|
+
class DataflowConverter < Base
|
9
|
+
class Context
|
10
|
+
attr_reader :renderer
|
11
|
+
|
12
|
+
def initialize(renderer)
|
13
|
+
@renderer = renderer
|
14
|
+
end
|
15
|
+
|
16
|
+
def definitions
|
17
|
+
renderer.definitions
|
18
|
+
end
|
19
|
+
|
20
|
+
def field_name(name)
|
21
|
+
"#{prefix}.#{name}".sub(/src\./, "").gsub(/\./, "_")
|
22
|
+
end
|
23
|
+
|
24
|
+
def nested?(definition)
|
25
|
+
!(
|
26
|
+
definition.nil? || BqCoaster.edge_properties.any? { |c| definition.include?(c) }
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def prefix
|
31
|
+
renderer.prefix
|
32
|
+
end
|
33
|
+
|
34
|
+
def render_converter(name, definition)
|
35
|
+
ConverterRenderer.new(
|
36
|
+
definition,
|
37
|
+
prefix: "#{prefix}.#{name}",
|
38
|
+
indent: 1
|
39
|
+
).render
|
40
|
+
end
|
41
|
+
|
42
|
+
def value(name, definition)
|
43
|
+
if definition&.key?(:_convert)
|
44
|
+
definition._convert % ["#{prefix}.#{name}"]
|
45
|
+
else
|
46
|
+
"#{prefix}.#{name}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%- definitions.each do |name, definition| %>
|
2
|
+
if (<%= prefix %>.<%= name %> != null) {
|
3
|
+
<%- if nested?(definition) %>
|
4
|
+
<%= render_converter(name, definition) %>
|
5
|
+
<%- else %>
|
6
|
+
row.set("<%= field_name(name) %>", <%= value(name, definition) %>);
|
7
|
+
<%- end %>
|
8
|
+
}
|
9
|
+
<%- end %>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster/generators/dataflow_converter/context"
|
4
|
+
|
5
|
+
module BqCoaster
|
6
|
+
module Generators
|
7
|
+
class DataflowConverter < Base
|
8
|
+
class ConverterRenderer
|
9
|
+
include Renderer
|
10
|
+
|
11
|
+
attr_reader :definitions, :prefix, :indent
|
12
|
+
|
13
|
+
def initialize(definitions, prefix: "", indent: 0)
|
14
|
+
@definitions = definitions
|
15
|
+
@prefix = prefix
|
16
|
+
@indent = indent
|
17
|
+
end
|
18
|
+
|
19
|
+
def render
|
20
|
+
evaluate.gsub(/^/, " " * 4 * indent)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def context
|
26
|
+
Context.new(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
def template_path
|
30
|
+
File.expand_path("../converter.erb", __FILE__)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster/renderer"
|
4
|
+
require "bq_coaster/generators/base"
|
5
|
+
require "bq_coaster/generators/dataflow_converter/converter_renderer"
|
6
|
+
|
7
|
+
module BqCoaster
|
8
|
+
module Generators
|
9
|
+
class DataflowConverter < Base
|
10
|
+
include Renderer
|
11
|
+
|
12
|
+
def generate
|
13
|
+
result
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def attributes
|
19
|
+
{
|
20
|
+
class_name: options[:class_name],
|
21
|
+
converter: converter,
|
22
|
+
source_class: options[:source_class],
|
23
|
+
package: options[:package]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def converter
|
28
|
+
ConverterRenderer.new(
|
29
|
+
definitions,
|
30
|
+
prefix: "src",
|
31
|
+
indent: 2
|
32
|
+
).render.gsub(/^\s*\n/, "")
|
33
|
+
end
|
34
|
+
|
35
|
+
def template_path
|
36
|
+
File.expand_path("../dataflow_converter/class.erb", __FILE__)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
<% if dataflow? %>@DefaultCoder(AvroCoder.class)<% end %>
|
3
|
+
<%= static? ? "static" : "public" %> class <%= class_name %> {
|
4
|
+
<%- definitions.each do |name, definition| %>
|
5
|
+
<%= dataflow? ? "@Nullable " : "" %>public <%= nested?(definition) ? name.camelize : type(definition) %> <%= name %>;
|
6
|
+
<%- if nested?(definition) %>
|
7
|
+
<%= render_class(name.camelize, definition) %>
|
8
|
+
<%- end %>
|
9
|
+
<%- end %>
|
10
|
+
|
11
|
+
public <%= class_name %>(
|
12
|
+
<%= definitions.map do |name, definition|
|
13
|
+
type = nested?(definition) ? name.camelize : type(definition)
|
14
|
+
" #{type} #{name}"
|
15
|
+
end.join(",\n") %>
|
16
|
+
) {
|
17
|
+
<%- definitions.each do |name, definition| %>
|
18
|
+
this.<%= name %> = <%= name %>;
|
19
|
+
<%- end %>
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster"
|
4
|
+
require "bq_coaster/generators/java_class/class_renderer"
|
5
|
+
|
6
|
+
module BqCoaster
|
7
|
+
module Generators
|
8
|
+
class JavaClass < Base
|
9
|
+
class ClassContext
|
10
|
+
attr_reader :renderer
|
11
|
+
|
12
|
+
def initialize(renderer)
|
13
|
+
@renderer = renderer
|
14
|
+
end
|
15
|
+
|
16
|
+
def class_name
|
17
|
+
renderer.class_name
|
18
|
+
end
|
19
|
+
|
20
|
+
def definitions
|
21
|
+
renderer.definitions
|
22
|
+
end
|
23
|
+
|
24
|
+
def dataflow?
|
25
|
+
!!renderer.dataflow
|
26
|
+
end
|
27
|
+
|
28
|
+
def nested?(definition)
|
29
|
+
!(
|
30
|
+
definition.nil? || BqCoaster.edge_properties.any? { |c| definition.key?(c) }
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def render_class(class_name, definitions)
|
35
|
+
ClassRenderer.new(
|
36
|
+
class_name,
|
37
|
+
definitions,
|
38
|
+
dataflow: renderer.dataflow,
|
39
|
+
static: true,
|
40
|
+
indent: 1
|
41
|
+
).render
|
42
|
+
end
|
43
|
+
|
44
|
+
def static?
|
45
|
+
!!renderer.static
|
46
|
+
end
|
47
|
+
|
48
|
+
def type(definition)
|
49
|
+
return "String" unless definition
|
50
|
+
return definition[:_original_type] if definition[:_original_type]
|
51
|
+
case definition[:_type]
|
52
|
+
when "integer"
|
53
|
+
"Long"
|
54
|
+
when "float"
|
55
|
+
"Double"
|
56
|
+
when "timestamp"
|
57
|
+
"Long"
|
58
|
+
else
|
59
|
+
"String"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster/renderer"
|
4
|
+
require "bq_coaster/generators/java_class/class_context"
|
5
|
+
|
6
|
+
module BqCoaster
|
7
|
+
module Generators
|
8
|
+
class JavaClass < Base
|
9
|
+
class ClassRenderer
|
10
|
+
include Renderer
|
11
|
+
|
12
|
+
attr_reader :class_name, :definitions, :dataflow, :static, :indent
|
13
|
+
|
14
|
+
def initialize(class_name, definitions, dataflow: true, static: false, indent: 0)
|
15
|
+
@class_name = class_name
|
16
|
+
@definitions = definitions
|
17
|
+
@dataflow = dataflow
|
18
|
+
@static = static
|
19
|
+
@indent = indent
|
20
|
+
end
|
21
|
+
|
22
|
+
def render
|
23
|
+
evaluate.gsub(/^/, " " * 4 * indent).gsub(/^\s*$/, "").gsub(/\n{3,}/, "\n\n")
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def context
|
29
|
+
ClassContext.new(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def template_path
|
33
|
+
File.expand_path("../class.erb", __FILE__)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bq_coaster/renderer"
|
4
|
+
require "bq_coaster/generators/base"
|
5
|
+
require "bq_coaster/generators/java_class/class_renderer"
|
6
|
+
|
7
|
+
module BqCoaster
|
8
|
+
module Generators
|
9
|
+
class JavaClass < Base
|
10
|
+
include Renderer
|
11
|
+
|
12
|
+
def generate
|
13
|
+
result
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def attributes
|
19
|
+
{
|
20
|
+
dataflow: options[:dataflow],
|
21
|
+
java_class: java_class,
|
22
|
+
package: options[:package]
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def class_name
|
27
|
+
options[:class_name] || default_class_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_class_name
|
31
|
+
File.basename(definition_file, ".*").camelize
|
32
|
+
end
|
33
|
+
|
34
|
+
def java_class
|
35
|
+
ClassRenderer.new(
|
36
|
+
class_name,
|
37
|
+
definitions,
|
38
|
+
dataflow: options[:dataflow]
|
39
|
+
).render
|
40
|
+
end
|
41
|
+
|
42
|
+
def template_path
|
43
|
+
File.expand_path("../java_class/java_class.erb", __FILE__)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
require "bq_coaster"
|
5
|
+
require "bq_coaster/generators/base"
|
6
|
+
|
7
|
+
module BqCoaster
|
8
|
+
module Generators
|
9
|
+
class Schema < Base
|
10
|
+
def generate
|
11
|
+
JSON.pretty_generate(
|
12
|
+
definitions.map { |n, d| parse(n, d) }.flatten
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def nested?(definition)
|
19
|
+
!(
|
20
|
+
definition.nil? || BqCoaster.edge_properties.any? { |c| definition.key?(c) }
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse(name, definition, prefix = "")
|
25
|
+
if nested?(definition)
|
26
|
+
definition.map { |n, d| parse(n, d, "#{prefix}#{name}_") }
|
27
|
+
else
|
28
|
+
{
|
29
|
+
name: "#{prefix}#{name}",
|
30
|
+
type: (definition&._type || "string").upcase,
|
31
|
+
mode: (definition&._mode || "nullable").upcase
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "erubis"
|
4
|
+
|
5
|
+
module BqCoaster
|
6
|
+
module Renderer
|
7
|
+
private
|
8
|
+
|
9
|
+
def evaluate
|
10
|
+
renderer.evaluate(context)
|
11
|
+
end
|
12
|
+
|
13
|
+
def renderer
|
14
|
+
Erubis::Eruby.new(template)
|
15
|
+
end
|
16
|
+
|
17
|
+
def result
|
18
|
+
renderer.result(attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def template
|
22
|
+
File.read(template_path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/bq_coaster.rb
ADDED
metadata
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bq_coaster
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- nownabe
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: erubis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
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: hashie
|
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: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.14'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.14'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- nownabe@gmail.com
|
100
|
+
executables:
|
101
|
+
- coaster
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- ".travis.yml"
|
108
|
+
- Gemfile
|
109
|
+
- README.md
|
110
|
+
- Rakefile
|
111
|
+
- bin/console
|
112
|
+
- bin/setup
|
113
|
+
- bq_coaster.gemspec
|
114
|
+
- exe/coaster
|
115
|
+
- lib/bq_coaster.rb
|
116
|
+
- lib/bq_coaster/cli.rb
|
117
|
+
- lib/bq_coaster/ext/string.rb
|
118
|
+
- lib/bq_coaster/generators/base.rb
|
119
|
+
- lib/bq_coaster/generators/dataflow_converter.rb
|
120
|
+
- lib/bq_coaster/generators/dataflow_converter/class.erb
|
121
|
+
- lib/bq_coaster/generators/dataflow_converter/context.rb
|
122
|
+
- lib/bq_coaster/generators/dataflow_converter/converter.erb
|
123
|
+
- lib/bq_coaster/generators/dataflow_converter/converter_renderer.rb
|
124
|
+
- lib/bq_coaster/generators/java_class.rb
|
125
|
+
- lib/bq_coaster/generators/java_class/class.erb
|
126
|
+
- lib/bq_coaster/generators/java_class/class_context.rb
|
127
|
+
- lib/bq_coaster/generators/java_class/class_renderer.rb
|
128
|
+
- lib/bq_coaster/generators/java_class/java_class.erb
|
129
|
+
- lib/bq_coaster/generators/schema.rb
|
130
|
+
- lib/bq_coaster/renderer.rb
|
131
|
+
- lib/bq_coaster/version.rb
|
132
|
+
homepage: https://github.com/nownabe/bq_coaster
|
133
|
+
licenses: []
|
134
|
+
metadata: {}
|
135
|
+
post_install_message:
|
136
|
+
rdoc_options: []
|
137
|
+
require_paths:
|
138
|
+
- lib
|
139
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
149
|
+
requirements: []
|
150
|
+
rubyforge_project:
|
151
|
+
rubygems_version: 2.6.8
|
152
|
+
signing_key:
|
153
|
+
specification_version: 4
|
154
|
+
summary: Automation Tools for BigQuery / Dataflow
|
155
|
+
test_files: []
|