proforma 1.0.0.pre.alpha

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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +8 -0
  3. data/.gitignore +4 -0
  4. data/.rubocop.yml +11 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +20 -0
  7. data/CHANGELOG.md +7 -0
  8. data/Gemfile +5 -0
  9. data/Gemfile.lock +105 -0
  10. data/Guardfile +16 -0
  11. data/LICENSE +7 -0
  12. data/README.md +328 -0
  13. data/bin/console +11 -0
  14. data/bin/render +68 -0
  15. data/lib/proforma.rb +38 -0
  16. data/lib/proforma/compiling.rb +12 -0
  17. data/lib/proforma/compiling/aggregation.rb +62 -0
  18. data/lib/proforma/compiling/compilable.rb +21 -0
  19. data/lib/proforma/compiling/counter.rb +35 -0
  20. data/lib/proforma/core_ext/hash.rb +21 -0
  21. data/lib/proforma/document.rb +38 -0
  22. data/lib/proforma/hash_evaluator.rb +40 -0
  23. data/lib/proforma/model_factory.rb +38 -0
  24. data/lib/proforma/modeling.rb +21 -0
  25. data/lib/proforma/modeling/banner.rb +64 -0
  26. data/lib/proforma/modeling/collection.rb +34 -0
  27. data/lib/proforma/modeling/data_table.rb +117 -0
  28. data/lib/proforma/modeling/data_table/aggregator.rb +43 -0
  29. data/lib/proforma/modeling/data_table/column.rb +94 -0
  30. data/lib/proforma/modeling/generic_container.rb +57 -0
  31. data/lib/proforma/modeling/grouping.rb +40 -0
  32. data/lib/proforma/modeling/header.rb +18 -0
  33. data/lib/proforma/modeling/pane.rb +40 -0
  34. data/lib/proforma/modeling/pane/column.rb +68 -0
  35. data/lib/proforma/modeling/pane/line.rb +42 -0
  36. data/lib/proforma/modeling/separator.rb +19 -0
  37. data/lib/proforma/modeling/spacer.rb +19 -0
  38. data/lib/proforma/modeling/table.rb +52 -0
  39. data/lib/proforma/modeling/table/cell.rb +49 -0
  40. data/lib/proforma/modeling/table/row.rb +24 -0
  41. data/lib/proforma/modeling/table/section.rb +23 -0
  42. data/lib/proforma/modeling/text.rb +37 -0
  43. data/lib/proforma/modeling/types.rb +10 -0
  44. data/lib/proforma/modeling/types/align.rb +22 -0
  45. data/lib/proforma/plain_text_renderer.rb +106 -0
  46. data/lib/proforma/prototype.rb +28 -0
  47. data/lib/proforma/template.rb +65 -0
  48. data/lib/proforma/type_factory.rb +44 -0
  49. data/lib/proforma/version.rb +12 -0
  50. data/proforma.gemspec +34 -0
  51. data/spec/fixtures/snapshots/custom_table.yml +55 -0
  52. data/spec/fixtures/snapshots/user_details.yml +101 -0
  53. data/spec/fixtures/snapshots/user_list.yml +143 -0
  54. data/spec/proforma/hash_evaluator_spec.rb +26 -0
  55. data/spec/proforma/modeling/table/cell_spec.rb +26 -0
  56. data/spec/proforma/modeling/table/row_spec.rb +42 -0
  57. data/spec/proforma_spec.rb +230 -0
  58. data/spec/spec_helper.rb +25 -0
  59. metadata +211 -0
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Proforma
11
+ # A prototype is a compiled template that has been flattened and ready for rendering.
12
+ class Prototype
13
+ attr_writer :children, :title
14
+
15
+ def initialize(children: [], title: '')
16
+ @children = ModelFactory.array(children)
17
+ @title = title
18
+ end
19
+
20
+ def children
21
+ Array(@children)
22
+ end
23
+
24
+ def title
25
+ @title.to_s
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Proforma
11
+ # A Template instance is a set of modeling objects with directions on how to compile it into
12
+ # a Prototype object. The prototype instance can then be rendered into an end-result such as
13
+ # a text, pdf, or spreadsheet file.
14
+ class Template < Prototype
15
+ include Compiling::Compilable
16
+ acts_as_hashable
17
+
18
+ attr_writer :split
19
+
20
+ def initialize(children: [], split: false, title: '')
21
+ @split = split
22
+
23
+ super(children: children, title: title)
24
+ end
25
+
26
+ def split
27
+ @split || false
28
+ end
29
+ alias split? split
30
+
31
+ def compile(data, evaluator)
32
+ if split?
33
+ compile_record(data, evaluator)
34
+ else
35
+ compile_collection(data, evaluator)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def compile_collection(data, evaluator)
42
+ compiled_children = Modeling::Collection.new(children: children).compile(data, evaluator)
43
+
44
+ [
45
+ Prototype.new(
46
+ children: compiled_children,
47
+ title: evaluator.text({}, title)
48
+ )
49
+ ]
50
+ end
51
+
52
+ def compile_record(data, evaluator)
53
+ default_grouping = Modeling::Grouping.new(children: children)
54
+
55
+ array(data).map do |record|
56
+ compiled_children = default_grouping.compile(record, evaluator)
57
+
58
+ Prototype.new(
59
+ children: compiled_children,
60
+ title: evaluator.text(record, title)
61
+ )
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Proforma
11
+ # A TypeFactory object understands how to build objects using a special designated '$type' key.
12
+ class TypeFactory
13
+ DEFAULT_TYPE_KEY = :type
14
+
15
+ attr_reader :registry, :type_key
16
+
17
+ def initialize(registry = {}, type_key = DEFAULT_TYPE_KEY)
18
+ @registry = registry.symbolize_keys
19
+ @type_key = type_key
20
+
21
+ freeze
22
+ end
23
+
24
+ def array(objects = [])
25
+ objects = objects.is_a?(Hash) ? [objects] : Array(objects)
26
+
27
+ objects.map do |object|
28
+ object.is_a?(Hash) ? make(object) : object
29
+ end
30
+ end
31
+
32
+ def make(config = {})
33
+ config = (config || {}).symbolize_keys
34
+ type = config[type_key].to_s.to_sym
35
+ object_class = registry[type]
36
+
37
+ raise ArgumentError, "cannot find section from type: #{type}" unless object_class
38
+
39
+ config_without_type = config.reject { |k| k == type_key }
40
+
41
+ object_class.new(config_without_type)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Proforma
11
+ VERSION = '1.0.0-alpha'
12
+ end
data/proforma.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './lib/proforma/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'proforma'
7
+ s.version = Proforma::VERSION
8
+ s.summary = 'Configurable and extendable document rendering engine for datasets'
9
+
10
+ s.description = <<-DESCRIPTION
11
+ Provide a simple, configurable, and standardized document generation object model.
12
+ The basic premise is to pass in a dataset and configuration and this library will return rendered documents.
13
+ The rendering engines can be plugged in so it leaves this as an extendable/open framework.
14
+ DESCRIPTION
15
+
16
+ s.authors = ['Matthew Ruggio']
17
+ s.email = ['mruggio@bluemarblepayroll.com']
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
21
+ s.homepage = 'https://github.com/bluemarblepayroll/proforma'
22
+ s.license = 'MIT'
23
+
24
+ s.required_ruby_version = '>= 2.3.8'
25
+
26
+ s.add_dependency('acts_as_hashable', '~>1')
27
+
28
+ s.add_development_dependency('guard-rspec', '~>4.7')
29
+ s.add_development_dependency('pry', '~>0')
30
+ s.add_development_dependency('rspec', '~> 3.8')
31
+ s.add_development_dependency('rubocop', '~>0.63.1')
32
+ s.add_development_dependency('simplecov', '~>0.16.1')
33
+ s.add_development_dependency('simplecov-console', '~>0.4.2')
34
+ end
@@ -0,0 +1,55 @@
1
+ data:
2
+ - id: 1
3
+ first: Will
4
+ last: Smith
5
+ username: will_smith
6
+ login_count: 9219
7
+ phone_numbers:
8
+ - type: cell
9
+ number: 555-444-3333
10
+ - type: fax
11
+ number: 333-444-2222
12
+ - id: 2
13
+ first: Martin
14
+ last: Lawrence
15
+ username: mlaw10
16
+ login_count: 8077
17
+ phone_numbers:
18
+ - type: home
19
+ number: 999-888-7777
20
+ - id: 3
21
+ first: Will
22
+ last: Ferrell
23
+ username: will.ferrell
24
+ login_count: 190890
25
+ phone_numbers:
26
+
27
+ template:
28
+ title: Custom Table
29
+ children:
30
+ - type: Grouping
31
+ children:
32
+ - type: Table
33
+ body:
34
+ rows:
35
+ - cells:
36
+ - text: ID Number
37
+ - text: $:id
38
+ - text: Username
39
+ - text: $:username
40
+ - cells:
41
+ - text: First Name
42
+ - text: $:first
43
+ - text: Last Name
44
+ - text: $:last
45
+
46
+ documents:
47
+ - title: Custom Table
48
+ contents: |+
49
+ ID Number, 1, Username, will_smith
50
+ First Name, Will, Last Name, Smith
51
+ ID Number, 2, Username, mlaw10
52
+ First Name, Martin, Last Name, Lawrence
53
+ ID Number, 3, Username, will.ferrell
54
+ First Name, Will, Last Name, Ferrell
55
+ extension: '.txt'
@@ -0,0 +1,101 @@
1
+ data:
2
+ - id: 1
3
+ first: Will
4
+ last: Smith
5
+ username: will_smith
6
+ login_count: 9219
7
+ phone_numbers:
8
+ - type: cell
9
+ number: 555-444-3333
10
+ - type: fax
11
+ number: 333-444-2222
12
+ - id: 2
13
+ first: Martin
14
+ last: Lawrence
15
+ username: mlaw10
16
+ login_count: 8077
17
+ phone_numbers:
18
+ - type: home
19
+ number: 999-888-7777
20
+ - id: 3
21
+ first: Will
22
+ last: Ferrell
23
+ username: will.ferrell
24
+ login_count: 190890
25
+ phone_numbers:
26
+
27
+ template:
28
+ split: true
29
+ title: User Details
30
+ children:
31
+ - type: Header
32
+ value: User Details
33
+ - type: Separator
34
+ - type: Text
35
+ value: 'The following is user details'
36
+ - type: Pane
37
+ columns:
38
+ - label_width: 25.0
39
+ lines:
40
+ - label: ID Number
41
+ value: $:id
42
+ - label: First Name
43
+ value: $:first
44
+ - label: Last Name
45
+ value: $:last
46
+ - type: Spacer
47
+ - type: Header
48
+ value: Phone Numbers
49
+ - type: DataTable
50
+ property: phone_numbers
51
+ empty_message: No phone numbers.
52
+ columns:
53
+ - header: Type
54
+ body: $:type
55
+ - header: Number
56
+ body: $:number
57
+ - type: Spacer
58
+
59
+ documents:
60
+ - title: User Details
61
+ contents: |+
62
+ USER DETAILS
63
+ ----------------------------------------
64
+ The following is user details
65
+ ID Number: 1
66
+ First Name: Will
67
+ Last Name: Smith
68
+
69
+ PHONE NUMBERS
70
+ Type, Number
71
+ cell, 555-444-3333
72
+ fax, 333-444-2222
73
+
74
+ extension: '.txt'
75
+ - title: User Details
76
+ contents: |+
77
+ USER DETAILS
78
+ ----------------------------------------
79
+ The following is user details
80
+ ID Number: 2
81
+ First Name: Martin
82
+ Last Name: Lawrence
83
+
84
+ PHONE NUMBERS
85
+ Type, Number
86
+ home, 999-888-7777
87
+
88
+ extension: '.txt'
89
+ - title: User Details
90
+ contents: |+
91
+ USER DETAILS
92
+ ----------------------------------------
93
+ The following is user details
94
+ ID Number: 3
95
+ First Name: Will
96
+ Last Name: Ferrell
97
+
98
+ PHONE NUMBERS
99
+ No phone numbers.
100
+
101
+ extension: '.txt'
@@ -0,0 +1,143 @@
1
+ data:
2
+ - id: 1
3
+ first: Will
4
+ last: Smith
5
+ username: will_smith
6
+ login_count: 9219
7
+ phone_numbers:
8
+ - type: cell
9
+ number: 555-444-3333
10
+ - type: fax
11
+ number: 333-444-2222
12
+ - id: 2
13
+ first: Martin
14
+ last: Lawrence
15
+ username: mlaw10
16
+ login_count: 8077
17
+ phone_numbers:
18
+ - type: home
19
+ number: 999-888-7777
20
+ - id: 3
21
+ first: Will
22
+ last: Ferrell
23
+ username: will.ferrell
24
+ login_count: 190890
25
+ phone_numbers:
26
+
27
+ template:
28
+ title: User List
29
+ children:
30
+ - type: Banner
31
+ details: "555 N. Michigan Ave.\nChicago, IL 62626\n555-555-5555 ext. 55555"
32
+ title: Some Random System
33
+ - type: Spacer
34
+ - type: Header
35
+ value: User List
36
+ - type: Separator
37
+ - type: Text
38
+ value: The following is a list of users
39
+ - type: Spacer
40
+ - type: DataTable
41
+ aggregators:
42
+ - property: login_count
43
+ function: sum
44
+ name: login_count_sum
45
+ - property: login_count
46
+ function: ave
47
+ name: login_count_ave
48
+ columns:
49
+ - header: ID Number
50
+ body: $:id
51
+ footer: Login Count Ave.
52
+ - header: First Name
53
+ body: $:first
54
+ footer: $:login_count_ave
55
+ - header: Last Name
56
+ body: $:last
57
+ - header: Username
58
+ body: $:username
59
+ footer: Login Count Sum
60
+ - header: Login Count
61
+ footer: $:login_count_sum
62
+ body: $:login_count
63
+ - type: Spacer
64
+ - type: Grouping
65
+ children:
66
+ - type: Header
67
+ value: 'User Details'
68
+ - type: Separator
69
+ - type: Pane
70
+ columns:
71
+ - label_width: 25.0
72
+ lines:
73
+ - label: ID Number
74
+ value: $:id
75
+ - label: First Name
76
+ value: $:first
77
+ - label: Last Name
78
+ value: $:last
79
+ - type: Spacer
80
+ - type: Header
81
+ value: Phone Numbers
82
+ - type: DataTable
83
+ property: phone_numbers
84
+ empty_message: No phone numbers.
85
+ columns:
86
+ - header: Type
87
+ body: $:type
88
+ - header: Number
89
+ body: $:number
90
+ - type: Spacer
91
+
92
+ documents:
93
+ - title: User List
94
+ contents: |+
95
+ ========================================
96
+ Some Random System
97
+ ========================================
98
+ 555 N. Michigan Ave.
99
+ Chicago, IL 62626
100
+ 555-555-5555 ext. 55555
101
+ ========================================
102
+
103
+ USER LIST
104
+ ----------------------------------------
105
+ The following is a list of users
106
+
107
+ ID Number, First Name, Last Name, Username, Login Count
108
+ 1, Will, Smith, will_smith, 9219
109
+ 2, Martin, Lawrence, mlaw10, 8077
110
+ 3, Will, Ferrell, will.ferrell, 190890
111
+ Login Count Ave., 69395.333333333333333333, , Login Count Sum, 208186.0
112
+
113
+ USER DETAILS
114
+ ----------------------------------------
115
+ ID Number: 1
116
+ First Name: Will
117
+ Last Name: Smith
118
+
119
+ PHONE NUMBERS
120
+ Type, Number
121
+ cell, 555-444-3333
122
+ fax, 333-444-2222
123
+
124
+ USER DETAILS
125
+ ----------------------------------------
126
+ ID Number: 2
127
+ First Name: Martin
128
+ Last Name: Lawrence
129
+
130
+ PHONE NUMBERS
131
+ Type, Number
132
+ home, 999-888-7777
133
+
134
+ USER DETAILS
135
+ ----------------------------------------
136
+ ID Number: 3
137
+ First Name: Will
138
+ Last Name: Ferrell
139
+
140
+ PHONE NUMBERS
141
+ No phone numbers.
142
+
143
+ extension: '.txt'