report_logic 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +161 -3
- data/lib/report_logic/base.rb +10 -0
- data/report_logic.gemspec +2 -2
- data/spec/app/my_report.rb +11 -0
- data/spec/report_logic/base_spec.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cea2b2274f2df932ea10af17de0b1a67a784132
|
4
|
+
data.tar.gz: c42344ccba2cc912cb674f51fbea93d1ca4d0ad1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51970b4691bf3dd8c0b156829ea95c926bd1d4f565e74647b1a85b7f9de513be51ddb7b2b23454ec40361fe502b938440b99bc94e67ec14d4908a2909ebfa81b
|
7
|
+
data.tar.gz: d32eb19919641f367dbf782212597645f32b4c16bc1b26d719e868ca0c7b3c519a81fe0974adb5af8574acbf742d49d6f0f08920627b17fe3052d3faae3fca61
|
data/README.md
CHANGED
@@ -9,12 +9,170 @@ Using this, you can so export this report to any format you want.
|
|
9
9
|
gem install report_logic
|
10
10
|
```
|
11
11
|
|
12
|
-
Using
|
12
|
+
Using Bundler:
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
gem 'report_logic'
|
15
|
+
gem 'report_logic', '~> 0.0.2'
|
16
16
|
```
|
17
17
|
|
18
18
|
## Usage
|
19
19
|
|
20
|
-
|
20
|
+
The goal here is to provide an easy way to extract report's logic to a Plain Old
|
21
|
+
Ruby Object. With this extraction, it's easy to use the same report class to
|
22
|
+
render reports in different formats. The report is defined by doing this:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
# Create a class inheriting from ReportLogic::Base
|
26
|
+
class MyReport < ReportLogic::Base
|
27
|
+
|
28
|
+
# Override this method to define your report
|
29
|
+
def build
|
30
|
+
# Create as many sessions as you need. Sessions group fields that you can
|
31
|
+
# then display later.
|
32
|
+
session(:header) do
|
33
|
+
field 'ID' # `field` creates a ReportLogic::Field in the session,
|
34
|
+
# which `name` will be the value passed to it.
|
35
|
+
field 'Name'
|
36
|
+
end
|
37
|
+
|
38
|
+
# If you pass a collection to a session, it will become a matrix, instead of
|
39
|
+
# an array of Field. For each object in the collection, the block will be
|
40
|
+
# yielded with it so you can define what Fields will compose this matrix.
|
41
|
+
session(:row, collection) do |record|
|
42
|
+
value record.id # `value` creates a ReportLogic::Field in the session,
|
43
|
+
# which `value` will be the value passed to it.
|
44
|
+
value record.name
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
And that's the basics. Now, to show this report:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
report = MyReport.new(MyModel.all)
|
54
|
+
|
55
|
+
# Printing a title
|
56
|
+
puts 'MY REPORT'
|
57
|
+
|
58
|
+
# Printing the headers
|
59
|
+
report.each(:header) do |field|
|
60
|
+
print field.name
|
61
|
+
print ' | '
|
62
|
+
end
|
63
|
+
puts
|
64
|
+
|
65
|
+
# Printing the rows
|
66
|
+
report.each(:row) do |row|
|
67
|
+
row.each do |field|
|
68
|
+
print field.value
|
69
|
+
print ' | '
|
70
|
+
end
|
71
|
+
end
|
72
|
+
puts
|
73
|
+
```
|
74
|
+
|
75
|
+
This output sucks, but it shows how simple it is to read a report
|
76
|
+
and output it in any ways you want. You could use ERB to generate HTML or XLS
|
77
|
+
outputs in Rails, or even Prawn to generate PDF's.
|
78
|
+
|
79
|
+
## Decorators
|
80
|
+
|
81
|
+
This gem uses the Decorator pattern to allow you to modify a Field before
|
82
|
+
printing. To do so, you just need to inherit from `ReportLogic::Decorator`,
|
83
|
+
like so:
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
class MyDecorator < ReportLogic::Decorator
|
87
|
+
# This method is invoked when the report is built. Override this if you
|
88
|
+
# want to customize the whole behaviour of your decorator.
|
89
|
+
def decorate(field)
|
90
|
+
decorate_name(field)
|
91
|
+
decorate_value(field)
|
92
|
+
end
|
93
|
+
|
94
|
+
# This method is called by default from ReportLogic::Decorator, as
|
95
|
+
# you can see above. Override this if you just want to decorate the name
|
96
|
+
# attribute of your fields.
|
97
|
+
def decorate_name(field); end
|
98
|
+
|
99
|
+
# This method is called by default from ReportLogic::Decorator as well.
|
100
|
+
# Override this if you just want to decorate the value attribute of your fields.
|
101
|
+
def decorate_value(field); end
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
This sample decorator is, in fact, pretty much the same as
|
106
|
+
`ReportLogic::Decorator`. For more details, take a look at the class itself.
|
107
|
+
|
108
|
+
You can then apply a decorator in many ways:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
class MyReport < ReportLogic::Base
|
112
|
+
def build
|
113
|
+
session(:row, collection) do |record|
|
114
|
+
field 'Name', record.name
|
115
|
+
field 'Gender', record.gender
|
116
|
+
|
117
|
+
decorate_with MyDecorator.new # This decorator applies to this session
|
118
|
+
end
|
119
|
+
|
120
|
+
decorate_with AnotherDecorator.new # This decorator applies to the whole report
|
121
|
+
end
|
122
|
+
end
|
123
|
+
```
|
124
|
+
|
125
|
+
You can apply a decorator to a specific field. To do so, you need to:
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
field 'Name', record.name, decorate_with: SpecifiDecorator.new
|
129
|
+
```
|
130
|
+
|
131
|
+
## I18n Support
|
132
|
+
|
133
|
+
There is a built-in decorator that handles internationalization for you. To use
|
134
|
+
it, you need to do this:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
class MyReport < ReportLogic::Base
|
138
|
+
include ReportLogic::I18nSupport # Include de module
|
139
|
+
|
140
|
+
def build
|
141
|
+
i18n_decorate # Invoke the decorator to be added
|
142
|
+
|
143
|
+
session(:row, collection) do |record|
|
144
|
+
field 'Name', record.name
|
145
|
+
field 'Gender', record.gender
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
```
|
150
|
+
|
151
|
+
This way, your fields' names and values will be translated **if they are symbols**.
|
152
|
+
So, to make it work, you need to use symbols:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
class MyReport < ReportLogic::Base
|
156
|
+
include ReportLogic::I18nSupport
|
157
|
+
|
158
|
+
def build
|
159
|
+
i18n_decorate
|
160
|
+
|
161
|
+
session(:filter) do
|
162
|
+
field :name , 'Test' # The field's name will be translated using
|
163
|
+
# 'report.names.name'
|
164
|
+
field :gender, :male # The field's name will be translated using
|
165
|
+
# 'report.names.gender' and the value will use
|
166
|
+
# 'report.values.male'.
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
```
|
171
|
+
|
172
|
+
## Contributing
|
173
|
+
|
174
|
+
Do you have an idea or a bug fix to add to the gem? Please do!
|
175
|
+
|
176
|
+
1. Fork it
|
177
|
+
2. Make your changes and commits
|
178
|
+
3. Create a pull request
|
data/lib/report_logic/base.rb
CHANGED
@@ -17,6 +17,8 @@ module ReportLogic
|
|
17
17
|
def session(key, collection = nil, &block)
|
18
18
|
@current_session = sessions[key] ||= Session.new(key, self)
|
19
19
|
@current_session.process(collection, &block)
|
20
|
+
ensure
|
21
|
+
@current_session = nil
|
20
22
|
end
|
21
23
|
|
22
24
|
def count
|
@@ -31,6 +33,14 @@ module ReportLogic
|
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
36
|
+
def decorate_with(*args)
|
37
|
+
if @current_session
|
38
|
+
@current_session.decorate_with(*args)
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
34
44
|
protected
|
35
45
|
|
36
46
|
def ensure_built_and_decorated
|
data/report_logic.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'report_logic'
|
3
|
-
s.version = '0.0.
|
4
|
-
s.date = '2014-09-
|
3
|
+
s.version = '0.0.2'
|
4
|
+
s.date = '2014-09-18'
|
5
5
|
s.summary = "Generating report logic."
|
6
6
|
s.description = "This gem provides an easy way to generate reports' logic. "\
|
7
7
|
"Using this, you can so export this report to any format you want."
|
data/spec/app/my_report.rb
CHANGED
@@ -15,6 +15,17 @@ class MyReport < ReportLogic::Base
|
|
15
15
|
session(:test_context) do
|
16
16
|
context_value
|
17
17
|
end
|
18
|
+
|
19
|
+
session(:test_master_decorator) do
|
20
|
+
field :decorable, 2
|
21
|
+
end
|
22
|
+
|
23
|
+
session(:exclusive_decorator) do
|
24
|
+
value 2
|
25
|
+
decorate_with MyDecorator.new
|
26
|
+
end
|
27
|
+
|
28
|
+
decorate_with MyDecorator.new(key: :decorable)
|
18
29
|
end
|
19
30
|
|
20
31
|
def context_value
|
@@ -29,4 +29,12 @@ describe ReportLogic::Base do
|
|
29
29
|
it "counts records" do
|
30
30
|
expect(report.count).to eq 2
|
31
31
|
end
|
32
|
+
|
33
|
+
it "scopes decorators" do
|
34
|
+
s1 = report.each(:test_master_decorator).to_a
|
35
|
+
s2 = report.each(:exclusive_decorator ).to_a
|
36
|
+
|
37
|
+
expect(s1.first.value).to eq(3)
|
38
|
+
expect(s2.first.value).to eq(3)
|
39
|
+
end
|
32
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: report_logic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego Aguir Selzlein
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|