report_generator 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +37 -0
- data/LICENSE +21 -0
- data/README.md +14 -0
- data/lib/report_generator/definers/report_definer.rb +11 -0
- data/lib/report_generator/definers/section_definer.rb +11 -0
- data/lib/report_generator/factories/attrs_factory.rb +16 -0
- data/lib/report_generator/factories/report_factory.rb +35 -0
- data/lib/report_generator/factories/report_field_factory.rb +29 -0
- data/lib/report_generator/factories/section_factory.rb +76 -0
- data/lib/report_generator/helpers/query_builder.rb +13 -0
- data/lib/report_generator/models/report.rb +87 -0
- data/lib/report_generator/models/report_field.rb +7 -0
- data/lib/report_generator/models/section.rb +38 -0
- data/lib/report_generator/version.rb +3 -0
- data/lib/report_generator.rb +58 -0
- data/report_generator.gemspec +23 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ab28fc424c43db604151cd53025498f9c51d61be
|
4
|
+
data.tar.gz: 19a761e6dfbe01353bee0f1e012988cb7e225b23
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7527c29a2e1cc669c3a90e19f4bd34a8a9b1910aed795f2df1e1a0bc6cd36f523d47cba4606c4de06c3ed9f840d93805d0a1e1cd286f9c9a6aa2c3c07db15e1b
|
7
|
+
data.tar.gz: 6f79bcbb9ee6182a8f7025bc5d8ffaa9ca583d8afdda5bcc3c65789504fc34d2681ca7f018c5756044771ceb37c642da4e6b48853760a62a2ade9b06e1ee5ea9
|
data/.gitignore
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
*.rbc
|
2
|
+
capybara-*.html
|
3
|
+
.rspec
|
4
|
+
/log
|
5
|
+
/tmp
|
6
|
+
/db/*.sqlite3
|
7
|
+
/db/*.sqlite3-journal
|
8
|
+
/public/system
|
9
|
+
/coverage/
|
10
|
+
/spec/tmp
|
11
|
+
**.orig
|
12
|
+
rerun.txt
|
13
|
+
pickle-email-*.html
|
14
|
+
|
15
|
+
# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
|
16
|
+
config/initializers/secret_token.rb
|
17
|
+
config/secrets.yml
|
18
|
+
|
19
|
+
## Environment normalization:
|
20
|
+
/.bundle
|
21
|
+
/vendor/bundle
|
22
|
+
|
23
|
+
# these should all be checked in to normalize the environment:
|
24
|
+
# Gemfile.lock, .ruby-version, .ruby-gemset
|
25
|
+
|
26
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
27
|
+
.rvmrc
|
28
|
+
.ruby-version
|
29
|
+
.ruby-gemset
|
30
|
+
|
31
|
+
# if using bower-rails ignore default bower_components path bower.json files
|
32
|
+
/vendor/assets/bower_components
|
33
|
+
*.bowerrc
|
34
|
+
bower.json
|
35
|
+
|
36
|
+
# Ignore pow environment settings
|
37
|
+
.powenv
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Evan Chiu
|
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 all
|
13
|
+
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 THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# report_generator [![Gem Version](https://badge.fury.io/rb/report_generator.png)](http://badge.fury.io/rb/report_generator)
|
2
|
+
|
3
|
+
A simple Ruby Internal DSL for creating Count Report which save data from MySQL to MySQL.
|
4
|
+
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this to your Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem "report_generator"
|
12
|
+
```
|
13
|
+
|
14
|
+
and run `bundle install`.
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Definers
|
3
|
+
class ReportDefiner
|
4
|
+
def report name, &block
|
5
|
+
report_factory = ReportGenerator::Factories::ReportFactory.new
|
6
|
+
report_factory.instance_eval(&block) if block_given?
|
7
|
+
ReportGenerator.report_factories[name] = report_factory
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Definers
|
3
|
+
class SectionDefiner
|
4
|
+
def section name, &block
|
5
|
+
section_factory = ReportGenerator::Factories::SectionFactory.new
|
6
|
+
section_factory.instance_eval(&block) if block_given?
|
7
|
+
ReportGenerator.section_factories[name] = section_factory
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Factories
|
3
|
+
class ReportFactory
|
4
|
+
attr_reader :attributes
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@attributes = {}
|
8
|
+
@attributes[:initialize_fields] = {}
|
9
|
+
@attributes[:report_fields] = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize_fields *args, &block
|
13
|
+
if args.present?
|
14
|
+
args.each{|x| @attributes[:initialize_fields][x]}
|
15
|
+
end
|
16
|
+
if block_given?
|
17
|
+
attrs_factory = AttrsFactory.new
|
18
|
+
attrs_factory.instance_eval(&block)
|
19
|
+
@attributes[:initialize_fields].merge!(attrs_factory.attributes)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def field *names, &block
|
24
|
+
field_factory = ReportGenerator::Factories::ReportFieldFactory.new
|
25
|
+
field_factory.instance_eval(&block) if block_given?
|
26
|
+
@attributes[:report_fields][names] = field_factory.attributes
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name, *args, &block)
|
30
|
+
@attributes[name] = args[0]
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Factories
|
3
|
+
class ReportFieldFactory
|
4
|
+
attr_reader :attributes
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@attributes = {}
|
8
|
+
@attributes[:section_columns] = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def section name
|
12
|
+
@attributes[:section] = name
|
13
|
+
end
|
14
|
+
|
15
|
+
def column column_name
|
16
|
+
@attributes[:section_columns] << column_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def columns *args
|
20
|
+
@attributes[:section_columns] += args
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_missing(name, *args, &block)
|
24
|
+
@attributes[name] = args
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Factories
|
3
|
+
class SectionFactory
|
4
|
+
attr_reader :attributes
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@attributes = {}
|
8
|
+
@attributes[:select_columns] = []
|
9
|
+
@attributes[:conditions] = []
|
10
|
+
@attributes[:group_columns] = []
|
11
|
+
@attributes[:sum_groups] = {}
|
12
|
+
@attributes[:joins] = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def mixin section_name, options = {}
|
16
|
+
tmp_sf_attrs = ReportGenerator.section_factories[section_name].attributes.dup
|
17
|
+
except_items = options[:except]
|
18
|
+
if except_items
|
19
|
+
tmp_except_items = except_items.is_a?(Array) ? except_items : [except_items]
|
20
|
+
tmp_except_items.each{|x| tmp_sf_attrs.delete(x)}
|
21
|
+
end
|
22
|
+
@attributes.merge!(tmp_sf_attrs)
|
23
|
+
end
|
24
|
+
|
25
|
+
def data_source kclass
|
26
|
+
@attributes[:data_source] = kclass
|
27
|
+
end
|
28
|
+
|
29
|
+
def select *cols
|
30
|
+
@attributes[:select_columns] += cols
|
31
|
+
end
|
32
|
+
|
33
|
+
def count *cols
|
34
|
+
@attributes[:select_columns] += cols.collect do |x|
|
35
|
+
"COUNT(#{x}) count_#{x.to_s.gsub('.', '_')}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def distinct_count *cols
|
40
|
+
@attributes[:select_columns] += cols.collect do |x|
|
41
|
+
"COUNT(DISTINCT #{x}) count_distinct_#{x.to_s.gsub('.', '_')}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def sum *cols
|
46
|
+
@attributes[:select_columns] += cols.collect{|x| "SUM(#{x})"}
|
47
|
+
end
|
48
|
+
|
49
|
+
def condition *arg, &block
|
50
|
+
@attributes[:conditions] += arg
|
51
|
+
if block_given?
|
52
|
+
attrs_factory = AttrsFactory.new
|
53
|
+
attrs_factory.instance_eval(&block)
|
54
|
+
@attributes[:conditions] << attrs_factory.attributes
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def group *arg
|
59
|
+
@attributes[:select_columns] += arg
|
60
|
+
@attributes[:group_columns] += arg
|
61
|
+
end
|
62
|
+
|
63
|
+
def sum_group col, manager = nil
|
64
|
+
@attributes[:sum_groups][col] = manager
|
65
|
+
end
|
66
|
+
|
67
|
+
def join join_clause
|
68
|
+
@attributes[:joins] << join_clause
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing(name, *args, &block)
|
72
|
+
@attributes[name] = args[0]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Helpers
|
3
|
+
module QueryBuilder
|
4
|
+
def query data_source, select_columns, joins, conditions, group_columns
|
5
|
+
result = data_source
|
6
|
+
result = data_source.select(select_columns) if select_columns.present?
|
7
|
+
joins.each{|x| result = result.joins(x)}
|
8
|
+
conditions.each{|x| result = result.where(x)}
|
9
|
+
result.group(group_columns)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Models
|
3
|
+
class Report
|
4
|
+
attr_accessor :name, :initialize_fields, :report_fields, :blank_init_fields, :fields_maps
|
5
|
+
|
6
|
+
def perform
|
7
|
+
prepare
|
8
|
+
integration_records = integrate_sections
|
9
|
+
grouped_records = gen_grouped_records(integration_records)
|
10
|
+
merged_records = merge_grouped_records(grouped_records)
|
11
|
+
save(merged_records)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def report_class
|
16
|
+
@name
|
17
|
+
end
|
18
|
+
|
19
|
+
def gen_initialize_fields report_field_name, record
|
20
|
+
result = @initialize_fields.dup
|
21
|
+
result.tap do |x|
|
22
|
+
@blank_init_fields.each_with_index do |blank_field_name, idx|
|
23
|
+
x[blank_field_name] = record.send(@fields_maps[report_field_name][blank_field_name])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def init_blank_init_fields
|
29
|
+
@blank_init_fields = @initialize_fields.collect{|k,v| k if v.blank?}.compact
|
30
|
+
end
|
31
|
+
|
32
|
+
def init_fields_maps
|
33
|
+
@fields_maps = {}.tap do |x|
|
34
|
+
@report_fields.each do |report_field_name, report_field_attrs|
|
35
|
+
tmp_report_fields = @blank_init_fields + report_field_name
|
36
|
+
x[report_field_name] = {}
|
37
|
+
tmp_report_fields.each_with_index do |field_name, idx|
|
38
|
+
x[report_field_name][field_name] = report_field_attrs[:section_columns][idx]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def prepare
|
45
|
+
init_blank_init_fields
|
46
|
+
init_fields_maps
|
47
|
+
end
|
48
|
+
|
49
|
+
def gen_grouped_records records
|
50
|
+
records.group_by{|r| r[:init_fields]}
|
51
|
+
end
|
52
|
+
|
53
|
+
def merge_grouped_records grouped_records
|
54
|
+
{}.tap do |x|
|
55
|
+
grouped_records.each do |group_key, records|
|
56
|
+
tmp_records = records.each{|x| x.delete(:init_fields)}
|
57
|
+
x[group_key]=tmp_records.inject(&:merge)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def integrate_sections
|
63
|
+
@report_fields.collect do |field_name, field_attrs|
|
64
|
+
section = ReportGenerator.build(ReportGenerator::Models::Section, field_attrs[:section])
|
65
|
+
records = section.perform
|
66
|
+
records.collect do |record|
|
67
|
+
r = {}.tap do |x|
|
68
|
+
x[:init_fields] = gen_initialize_fields(field_name, record)
|
69
|
+
field_name.each{|fn| x[fn] = record.send(@fields_maps[field_name][fn])}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end.flatten
|
73
|
+
end
|
74
|
+
|
75
|
+
def save records
|
76
|
+
ActiveRecord::Base.transaction do
|
77
|
+
records.each do |init_fields, record_attrs|
|
78
|
+
r = report_class.find_or_initialize_by(init_fields)
|
79
|
+
record_attrs.each{|k,v| r.send("#{k}=",v) }
|
80
|
+
r.save
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ReportGenerator
|
2
|
+
module Models
|
3
|
+
class Section
|
4
|
+
include ReportGenerator::Helpers::QueryBuilder
|
5
|
+
attr_accessor :name, :data_source, :select_columns, :joins, :conditions, :group_columns, :sum_groups
|
6
|
+
|
7
|
+
def perform
|
8
|
+
p "current_section: #{name}"
|
9
|
+
records = query(data_source, select_columns, joins, conditions, group_columns)
|
10
|
+
if sum_groups.present?
|
11
|
+
sum_records = sum_groups.collect do |sum_col, distributer|
|
12
|
+
tmp_sum_col = sum_col.to_s.split('.').last
|
13
|
+
sum_group_items = distributer.distribute(records.map(&tmp_sum_col.to_sym).uniq.compact)
|
14
|
+
tmp_group_columns,tmp_select_columns = group_columns.dup, select_columns.dup
|
15
|
+
tmp_group_columns.delete(sum_col)
|
16
|
+
tmp_select_columns.delete(sum_col)
|
17
|
+
sum_group_items.collect do |sum_group_item|
|
18
|
+
tmp_conditions = []
|
19
|
+
tmp_conditions = conditions.dup
|
20
|
+
group_name = sum_group_item.shift
|
21
|
+
tmp_conditions << {sum_col => sum_group_item} if sum_group_item.compact.present?
|
22
|
+
result = query(data_source, tmp_select_columns, joins, tmp_conditions,tmp_group_columns)
|
23
|
+
result.tap do |x|
|
24
|
+
x.collect! do|r|
|
25
|
+
tmp_attrs = r.attributes.dup
|
26
|
+
tmp_attrs[tmp_sum_col] = group_name
|
27
|
+
OpenStruct.new(tmp_attrs)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end # group_items
|
31
|
+
end # sum_groups
|
32
|
+
records += sum_records.flatten
|
33
|
+
end
|
34
|
+
records
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
require 'report_generator/helpers/query_builder'
|
4
|
+
require 'report_generator/factories/attrs_factory'
|
5
|
+
require 'report_generator/factories/report_field_factory'
|
6
|
+
require 'report_generator/factories/section_factory'
|
7
|
+
require 'report_generator/factories/report_factory'
|
8
|
+
require 'report_generator/definers/section_definer'
|
9
|
+
require 'report_generator/definers/report_definer'
|
10
|
+
require 'report_generator/models/report'
|
11
|
+
require 'report_generator/models/report_field'
|
12
|
+
require 'report_generator/models/section'
|
13
|
+
require 'report_generator/version'
|
14
|
+
|
15
|
+
module ReportGenerator
|
16
|
+
@factories = {
|
17
|
+
ReportGenerator::Models::Section => {},
|
18
|
+
ReportGenerator::Models::Report => {}
|
19
|
+
}
|
20
|
+
class << self
|
21
|
+
def section_factories
|
22
|
+
@factories[ReportGenerator::Models::Section]
|
23
|
+
end
|
24
|
+
|
25
|
+
def report_factories
|
26
|
+
@factories[ReportGenerator::Models::Report]
|
27
|
+
end
|
28
|
+
|
29
|
+
def configure &block
|
30
|
+
class_eval(&block) if block_given?
|
31
|
+
end
|
32
|
+
|
33
|
+
def define_section &block
|
34
|
+
section_definer = ReportGenerator::Definers::SectionDefiner.new
|
35
|
+
section_definer.instance_eval(&block) if block_given?
|
36
|
+
end
|
37
|
+
|
38
|
+
def define_report &block
|
39
|
+
generator_definer = ReportGenerator::Definers::ReportDefiner.new
|
40
|
+
generator_definer.instance_eval(&block) if block_given?
|
41
|
+
end
|
42
|
+
|
43
|
+
def build model_class, name, attributes = {}
|
44
|
+
tmp_factory_attributes = @factories[model_class][name].attributes
|
45
|
+
if attributes.present?
|
46
|
+
tmp_factory_attributes.merge!(attributes)
|
47
|
+
end
|
48
|
+
tmp_model = model_class.new
|
49
|
+
tmp_model.tap do |x|
|
50
|
+
x.name = name
|
51
|
+
tmp_factory_attributes.each do |k,v|
|
52
|
+
x.send("#{k}=", v)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'report_generator/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "report_generator"
|
8
|
+
spec.version = ReportGenerator::VERSION
|
9
|
+
spec.authors = ["Evan Chiu"]
|
10
|
+
spec.email = ["bjevanchiu@gmail.com"]
|
11
|
+
spec.description = %q{A simple Ruby Internal DSL for creating Count Report which save data from MySQL to MySQL.}
|
12
|
+
spec.summary = %q{A simple Ruby Internal DSL for creating Count Report which save data from MySQL to MySQL.}
|
13
|
+
spec.homepage = "https://github.com/bjevanchiu/report_generator"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: report_generator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Evan Chiu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A simple Ruby Internal DSL for creating Count Report which save data
|
42
|
+
from MySQL to MySQL.
|
43
|
+
email:
|
44
|
+
- bjevanchiu@gmail.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- lib/report_generator.rb
|
53
|
+
- lib/report_generator/definers/report_definer.rb
|
54
|
+
- lib/report_generator/definers/section_definer.rb
|
55
|
+
- lib/report_generator/factories/attrs_factory.rb
|
56
|
+
- lib/report_generator/factories/report_factory.rb
|
57
|
+
- lib/report_generator/factories/report_field_factory.rb
|
58
|
+
- lib/report_generator/factories/section_factory.rb
|
59
|
+
- lib/report_generator/helpers/query_builder.rb
|
60
|
+
- lib/report_generator/models/report.rb
|
61
|
+
- lib/report_generator/models/report_field.rb
|
62
|
+
- lib/report_generator/models/section.rb
|
63
|
+
- lib/report_generator/version.rb
|
64
|
+
- report_generator.gemspec
|
65
|
+
homepage: https://github.com/bjevanchiu/report_generator
|
66
|
+
licenses:
|
67
|
+
- MIT
|
68
|
+
metadata: {}
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.3.1
|
83
|
+
requirements: []
|
84
|
+
rubyforge_project:
|
85
|
+
rubygems_version: 2.5.1
|
86
|
+
signing_key:
|
87
|
+
specification_version: 4
|
88
|
+
summary: A simple Ruby Internal DSL for creating Count Report which save data from
|
89
|
+
MySQL to MySQL.
|
90
|
+
test_files: []
|