report_logic 0.0.1
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/.rspec +1 -0
- data/.ruby-version +1 -0
- data/README.md +20 -0
- data/lib/report_logic/base.rb +59 -0
- data/lib/report_logic/decorable.rb +17 -0
- data/lib/report_logic/decorator.rb +26 -0
- data/lib/report_logic/field.rb +35 -0
- data/lib/report_logic/i18n_decorator.rb +13 -0
- data/lib/report_logic/i18n_helper.rb +14 -0
- data/lib/report_logic/i18n_support.rb +7 -0
- data/lib/report_logic/session.rb +51 -0
- data/lib/report_logic.rb +10 -0
- data/report_logic.gemspec +18 -0
- data/spec/app/my_decorator.rb +5 -0
- data/spec/app/my_i18n_report.rb +12 -0
- data/spec/app/my_report.rb +23 -0
- data/spec/report_logic/base_spec.rb +32 -0
- data/spec/report_logic/decorator_spec.rb +49 -0
- data/spec/report_logic/i18n_support_spec.rb +27 -0
- data/spec/report_logic/session_spec.rb +73 -0
- data/spec/spec_helper.rb +9 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5e25770ff6e1144dbbdba31d2cd5ce7c18b754fc
|
4
|
+
data.tar.gz: 01b93068112f0428369d7bf05f7c595cfc483e71
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e7cc1c97d098b1595c8799f45c1d69954976b6628655c9868e30eff3038c1ba33a9680b41ba919a71c50256e0c49b455ec9dc2391214b3d507589b5476ff5ed4
|
7
|
+
data.tar.gz: fff161688583ee20d397030165b647b15e3b419ee196d81892e311b717fb0b38b264975a05f645394053bf0e190ac784ed2898734d04140e54b981838b4f4c5a
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# ReportLogic
|
2
|
+
|
3
|
+
This gem provides an easy way to generate reports' logic.
|
4
|
+
Using this, you can so export this report to any format you want.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
```bash
|
9
|
+
gem install report_logic
|
10
|
+
```
|
11
|
+
|
12
|
+
Using bundler:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'report_logic'
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
Building...
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
class Base
|
3
|
+
include Decorable
|
4
|
+
|
5
|
+
attr_reader :collection
|
6
|
+
|
7
|
+
def initialize(collection = nil)
|
8
|
+
@collection = collection
|
9
|
+
end
|
10
|
+
|
11
|
+
def each(key)
|
12
|
+
return to_enum(__callee__, key) unless block_given?
|
13
|
+
ensure_built_and_decorated
|
14
|
+
sessions[key] and sessions[key].fields.each { |field| yield field }
|
15
|
+
end
|
16
|
+
|
17
|
+
def session(key, collection = nil, &block)
|
18
|
+
@current_session = sessions[key] ||= Session.new(key, self)
|
19
|
+
@current_session.process(collection, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def count
|
23
|
+
@collection.size
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(method_name, *args, &block)
|
27
|
+
if @current_session && @current_session.public_methods.include?(method_name)
|
28
|
+
@current_session.public_send(method_name, *args, &block)
|
29
|
+
else
|
30
|
+
super
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def ensure_built_and_decorated
|
37
|
+
build unless @built
|
38
|
+
decorate unless @decorated
|
39
|
+
@built = true
|
40
|
+
@decorated = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def build
|
44
|
+
raise NotImplementedError
|
45
|
+
end
|
46
|
+
|
47
|
+
def decorate
|
48
|
+
sessions.values.each do |sess|
|
49
|
+
sess.decorate(@decorators)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def sessions
|
56
|
+
@sessions ||= {}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
module Decorable
|
3
|
+
def decorators
|
4
|
+
@decorators ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def decorate_with(dec)
|
8
|
+
if dec
|
9
|
+
if dec.respond_to?(:each)
|
10
|
+
dec.each { |dec| decorators << dec }
|
11
|
+
else
|
12
|
+
decorators << dec
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
class Decorator
|
3
|
+
attr_accessor :key
|
4
|
+
|
5
|
+
def initialize(key: nil)
|
6
|
+
@key = key
|
7
|
+
end
|
8
|
+
|
9
|
+
def decorate(field)
|
10
|
+
decorate_name(field)
|
11
|
+
decorate_value(field)
|
12
|
+
end
|
13
|
+
|
14
|
+
def decorate_name(field); end
|
15
|
+
|
16
|
+
def decorate_value(field); end
|
17
|
+
|
18
|
+
def decorate_if_matches(field)
|
19
|
+
decorate(field) if matches?(field)
|
20
|
+
end
|
21
|
+
|
22
|
+
def matches?(field)
|
23
|
+
key.nil? || key == field.key || Array === key && key.include?(field.key)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
class Field
|
3
|
+
include Decorable
|
4
|
+
|
5
|
+
attr_accessor :key, :value, :type, :name
|
6
|
+
|
7
|
+
def initialize(name, value=nil, type: nil, key: nil, decorate_with: nil)
|
8
|
+
@name = name
|
9
|
+
@value = value
|
10
|
+
@type = type
|
11
|
+
@key = key || (name.is_a?(Symbol) ? name : nil)
|
12
|
+
self.decorate_with(decorate_with)
|
13
|
+
end
|
14
|
+
|
15
|
+
def type
|
16
|
+
@type ||= guess_type
|
17
|
+
end
|
18
|
+
|
19
|
+
def guess_type
|
20
|
+
@value.class
|
21
|
+
end
|
22
|
+
|
23
|
+
def decorate(master_decorators = nil)
|
24
|
+
apply_decorators(master_decorators) if master_decorators
|
25
|
+
apply_decorators(decorators)
|
26
|
+
end
|
27
|
+
|
28
|
+
def apply_decorators(decorators)
|
29
|
+
decorators.each do |dec|
|
30
|
+
dec.decorate_if_matches(self)
|
31
|
+
end
|
32
|
+
self
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
class I18nDecorator < Decorator
|
3
|
+
include I18nHelper
|
4
|
+
|
5
|
+
def decorate_name(field, name=field.name, **options)
|
6
|
+
field.name = i18n_lookup(:names , name, **options) if Symbol === name
|
7
|
+
end
|
8
|
+
|
9
|
+
def decorate_value(field, value=field.value, **options)
|
10
|
+
field.value = i18n_lookup(:values , value, **options) if Symbol === value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module ReportLogic
|
4
|
+
module I18nHelper
|
5
|
+
def i18n_lookup(scope, key, default: key.to_sym, resource_class: nil, **options)
|
6
|
+
lookup = if resource_class
|
7
|
+
:"#{resource_class.to_s.downcase.underscore}.#{key}"
|
8
|
+
else
|
9
|
+
key
|
10
|
+
end
|
11
|
+
I18n.t(lookup, scope: [:report, scope], default: default, **options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
class Session
|
3
|
+
include Decorable
|
4
|
+
|
5
|
+
attr_accessor :key, :report
|
6
|
+
|
7
|
+
def initialize(key = nil, report = nil)
|
8
|
+
@key, @report = key, report
|
9
|
+
end
|
10
|
+
|
11
|
+
def fields
|
12
|
+
@fields ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
def current_row
|
16
|
+
@current_row ||= fields
|
17
|
+
end
|
18
|
+
|
19
|
+
def field(name, value = nil, **options)
|
20
|
+
current_row << Field.new(name, value, **options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def value(val, **options)
|
24
|
+
field(nil, val, **options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(collection = nil)
|
28
|
+
if collection.respond_to?(:each)
|
29
|
+
collection.each do |record|
|
30
|
+
@current_row = []
|
31
|
+
yield record
|
32
|
+
fields.push current_row
|
33
|
+
@current_row = nil
|
34
|
+
end
|
35
|
+
else
|
36
|
+
yield
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def decorate(master_decorators = nil)
|
41
|
+
master_decorators ||= []
|
42
|
+
fields.each do |field_or_row|
|
43
|
+
if field_or_row.respond_to?(:each)
|
44
|
+
field_or_row.each { |f| f.decorate(master_decorators + decorators) }
|
45
|
+
else
|
46
|
+
field_or_row.decorate(master_decorators + decorators)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/report_logic.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module ReportLogic
|
2
|
+
autoload :Base , 'report_logic/base'
|
3
|
+
autoload :Decorable , 'report_logic/decorable'
|
4
|
+
autoload :Decorator , 'report_logic/decorator'
|
5
|
+
autoload :Field , 'report_logic/field'
|
6
|
+
autoload :Session , 'report_logic/session'
|
7
|
+
autoload :I18nDecorator, 'report_logic/i18n_decorator'
|
8
|
+
autoload :I18nSupport , 'report_logic/i18n_support'
|
9
|
+
autoload :I18nHelper , 'report_logic/i18n_helper'
|
10
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'report_logic'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.date = '2014-09-17'
|
5
|
+
s.summary = "Generating report logic."
|
6
|
+
s.description = "This gem provides an easy way to generate reports' logic. "\
|
7
|
+
"Using this, you can so export this report to any format you want."
|
8
|
+
s.authors = ["Diego Aguir Selzlein"]
|
9
|
+
s.email = 'diegoselzlein@gmail.com'
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
|
14
|
+
s.homepage = 'https://github.com/nerde/report_logic'
|
15
|
+
s.license = 'MIT'
|
16
|
+
|
17
|
+
s.add_dependency('i18n', '~> 0')
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Record = Struct.new(:id, :name)
|
2
|
+
|
3
|
+
class MyReport < ReportLogic::Base
|
4
|
+
def build
|
5
|
+
session(:header) do
|
6
|
+
field 'ID'
|
7
|
+
field 'Name'
|
8
|
+
end
|
9
|
+
|
10
|
+
session(:rows, collection) do |record|
|
11
|
+
value record.id
|
12
|
+
value record.name
|
13
|
+
end
|
14
|
+
|
15
|
+
session(:test_context) do
|
16
|
+
context_value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def context_value
|
21
|
+
'A'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ReportLogic::Base do
|
4
|
+
let(:rec1) { Record.new(1, 'Diego') }
|
5
|
+
let(:rec2) { Record.new(2, 'Andressa') }
|
6
|
+
|
7
|
+
let(:report) { MyReport.new([rec1, rec2]) }
|
8
|
+
|
9
|
+
let(:headers) { report.each(:header) }
|
10
|
+
let(:rows) { report.each(:rows) }
|
11
|
+
|
12
|
+
it "generates grouped fields" do
|
13
|
+
expect(headers.count ).to eql(2)
|
14
|
+
expect(headers.next.name).to eql('ID')
|
15
|
+
expect(headers.next.name).to eql('Name')
|
16
|
+
|
17
|
+
|
18
|
+
expect(rows.count ).to eql(2)
|
19
|
+
|
20
|
+
first_row = rows.next
|
21
|
+
expect(first_row.first.value).to eql(1)
|
22
|
+
expect(first_row.last.value ).to eql('Diego')
|
23
|
+
|
24
|
+
last_row = rows.next
|
25
|
+
expect(last_row.first.value ).to eql(2)
|
26
|
+
expect(last_row.last.value ).to eql('Andressa')
|
27
|
+
end
|
28
|
+
|
29
|
+
it "counts records" do
|
30
|
+
expect(report.count).to eq 2
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ReportLogic::Decorator do
|
4
|
+
let(:decorator) { MyDecorator.new }
|
5
|
+
let(:field) { ReportLogic::Field.new(1, 2, key: :first) }
|
6
|
+
|
7
|
+
describe "#decorate_if_matches" do
|
8
|
+
|
9
|
+
it "decorates object" do
|
10
|
+
decorator.decorate_if_matches(field)
|
11
|
+
|
12
|
+
expect(field.value).to eql(3)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "decorator does not match" do
|
16
|
+
it "doesn't decorate" do
|
17
|
+
decorator.stub(:matches?).and_return(false)
|
18
|
+
|
19
|
+
decorator.decorate_if_matches(field)
|
20
|
+
|
21
|
+
expect(field.value).to eql(2)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "key doesn't match" do
|
26
|
+
let(:decorator) { ReportLogic::Decorator.new key: :second }
|
27
|
+
|
28
|
+
it "doesn't decorate" do
|
29
|
+
decorator.decorate_if_matches(field)
|
30
|
+
|
31
|
+
expect(field.value).to eql(2)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "key is an array" do
|
36
|
+
let(:decorator) { MyDecorator.new key: [:second] }
|
37
|
+
|
38
|
+
it "checks inclusion" do
|
39
|
+
f2 = ReportLogic::Field.new(1, 2, key: :second)
|
40
|
+
|
41
|
+
decorator.decorate_if_matches(field)
|
42
|
+
decorator.decorate_if_matches(f2)
|
43
|
+
|
44
|
+
expect(field.value).to eql(2)
|
45
|
+
expect(f2 .value).to eql(3)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'i18n'
|
3
|
+
|
4
|
+
describe ReportLogic::I18nSupport do
|
5
|
+
let(:report) { MyI18nReport.new }
|
6
|
+
|
7
|
+
let(:headers) { report.each(:header).to_a }
|
8
|
+
|
9
|
+
before(:all) do
|
10
|
+
I18n.enforce_available_locales = false
|
11
|
+
I18n.backend.store_translations(:es, report: { names: { name: 'Nombre' },
|
12
|
+
values: { test: 'This is translated too' } })
|
13
|
+
I18n.default_locale = :es
|
14
|
+
end
|
15
|
+
|
16
|
+
after(:all) do
|
17
|
+
I18n.backend = nil
|
18
|
+
I18n.default_locale = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it "translates key fields" do
|
22
|
+
expect(headers.size ).to eql(2)
|
23
|
+
expect(headers.first.name).to eql('ID')
|
24
|
+
expect(headers.last .name).to eql('Nombre')
|
25
|
+
expect(headers.last.value).to eql('This is translated too')
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ReportLogic::Session do
|
4
|
+
let(:session) { ReportLogic::Session.new }
|
5
|
+
let(:fields) { session.fields }
|
6
|
+
let(:field) { session.fields.first }
|
7
|
+
|
8
|
+
it "generates fields with name" do
|
9
|
+
session.field 'Test Field'
|
10
|
+
|
11
|
+
expect(fields.size).to eq(1)
|
12
|
+
expect(field.key ).to be_nil
|
13
|
+
expect(field.name ).to eq('Test Field')
|
14
|
+
expect(field.value).to be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "generates fields with value" do
|
18
|
+
session.value 'Test Field'
|
19
|
+
|
20
|
+
expect(fields.size).to eq(1)
|
21
|
+
expect(field.key ).to be_nil
|
22
|
+
expect(field.name ).to be_nil
|
23
|
+
expect(field.value).to eq('Test Field')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "generates fields with name and value" do
|
27
|
+
session.field 'Test Field', 'Value'
|
28
|
+
|
29
|
+
expect(fields.size).to eq(1)
|
30
|
+
expect(field.key ).to be_nil
|
31
|
+
expect(field.name ).to eq('Test Field')
|
32
|
+
expect(field.value).to eq('Value')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "generates fields with key" do
|
36
|
+
session.field 'Test Field', 'Value', key: :sparta
|
37
|
+
|
38
|
+
expect(fields.size).to eq(1)
|
39
|
+
expect(field.key ).to eq(:sparta)
|
40
|
+
expect(field.name ).to eq('Test Field')
|
41
|
+
expect(field.value).to eq('Value')
|
42
|
+
end
|
43
|
+
|
44
|
+
it "uses name as key when it's a symbol" do
|
45
|
+
session.field :name
|
46
|
+
|
47
|
+
expect(fields.size).to eq(1)
|
48
|
+
expect(field.key ).to eq(:name)
|
49
|
+
expect(field.name ).to eq(:name)
|
50
|
+
expect(field.value).to be_nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it "decorates fields" do
|
54
|
+
session.field 'First Field' , 1
|
55
|
+
session.field 'Second Field', 2
|
56
|
+
session.decorate_with MyDecorator.new
|
57
|
+
|
58
|
+
session.decorate
|
59
|
+
|
60
|
+
expect(fields.first.value).to eq(3)
|
61
|
+
expect(fields.last .value).to eq(3)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can decorate a single field" do
|
65
|
+
session.field 'First Field' , 1
|
66
|
+
session.field 'Second Field', 2, decorate_with: MyDecorator.new
|
67
|
+
|
68
|
+
session.decorate
|
69
|
+
|
70
|
+
expect(fields.first.value).to eq(1)
|
71
|
+
expect(fields.last .value).to eq(3)
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require File.expand_path('../../lib/report_logic', __FILE__)
|
2
|
+
|
3
|
+
Dir[File.expand_path('../app/*.rb', __FILE__)].each { |f| require f }
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.order = "random"
|
7
|
+
config.before(:each) { GC.disable }
|
8
|
+
config.after(:each) { GC.enable }
|
9
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: report_logic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Diego Aguir Selzlein
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: i18n
|
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
|
+
description: This gem provides an easy way to generate reports' logic. Using this,
|
28
|
+
you can so export this report to any format you want.
|
29
|
+
email: diegoselzlein@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rspec"
|
35
|
+
- ".ruby-version"
|
36
|
+
- README.md
|
37
|
+
- lib/report_logic.rb
|
38
|
+
- lib/report_logic/base.rb
|
39
|
+
- lib/report_logic/decorable.rb
|
40
|
+
- lib/report_logic/decorator.rb
|
41
|
+
- lib/report_logic/field.rb
|
42
|
+
- lib/report_logic/i18n_decorator.rb
|
43
|
+
- lib/report_logic/i18n_helper.rb
|
44
|
+
- lib/report_logic/i18n_support.rb
|
45
|
+
- lib/report_logic/session.rb
|
46
|
+
- report_logic.gemspec
|
47
|
+
- spec/app/my_decorator.rb
|
48
|
+
- spec/app/my_i18n_report.rb
|
49
|
+
- spec/app/my_report.rb
|
50
|
+
- spec/report_logic/base_spec.rb
|
51
|
+
- spec/report_logic/decorator_spec.rb
|
52
|
+
- spec/report_logic/i18n_support_spec.rb
|
53
|
+
- spec/report_logic/session_spec.rb
|
54
|
+
- spec/spec_helper.rb
|
55
|
+
homepage: https://github.com/nerde/report_logic
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.2.2
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Generating report logic.
|
79
|
+
test_files: []
|