caracal 0.1.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.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +941 -0
  6. data/Rakefile +2 -0
  7. data/caracal.gemspec +27 -0
  8. data/lib/caracal.rb +31 -0
  9. data/lib/caracal/core/file_name.rb +39 -0
  10. data/lib/caracal/core/fonts.rb +75 -0
  11. data/lib/caracal/core/images.rb +37 -0
  12. data/lib/caracal/core/line_breaks.rb +29 -0
  13. data/lib/caracal/core/list_styles.rb +92 -0
  14. data/lib/caracal/core/lists.rb +57 -0
  15. data/lib/caracal/core/models/base_model.rb +51 -0
  16. data/lib/caracal/core/models/border_model.rb +120 -0
  17. data/lib/caracal/core/models/font_model.rb +64 -0
  18. data/lib/caracal/core/models/image_model.rb +118 -0
  19. data/lib/caracal/core/models/line_break_model.rb +15 -0
  20. data/lib/caracal/core/models/link_model.rb +65 -0
  21. data/lib/caracal/core/models/list_item_model.rb +105 -0
  22. data/lib/caracal/core/models/list_model.rb +130 -0
  23. data/lib/caracal/core/models/list_style_model.rb +129 -0
  24. data/lib/caracal/core/models/margin_model.rb +76 -0
  25. data/lib/caracal/core/models/page_break_model.rb +15 -0
  26. data/lib/caracal/core/models/page_number_model.rb +69 -0
  27. data/lib/caracal/core/models/page_size_model.rb +70 -0
  28. data/lib/caracal/core/models/paragraph_model.rb +141 -0
  29. data/lib/caracal/core/models/relationship_model.rb +108 -0
  30. data/lib/caracal/core/models/rule_model.rb +27 -0
  31. data/lib/caracal/core/models/style_model.rb +134 -0
  32. data/lib/caracal/core/models/table_cell_model.rb +155 -0
  33. data/lib/caracal/core/models/table_model.rb +206 -0
  34. data/lib/caracal/core/models/text_model.rb +92 -0
  35. data/lib/caracal/core/page_breaks.rb +29 -0
  36. data/lib/caracal/core/page_numbers.rb +51 -0
  37. data/lib/caracal/core/page_settings.rb +72 -0
  38. data/lib/caracal/core/relationships.rb +90 -0
  39. data/lib/caracal/core/rules.rb +35 -0
  40. data/lib/caracal/core/styles.rb +86 -0
  41. data/lib/caracal/core/tables.rb +41 -0
  42. data/lib/caracal/core/text.rb +73 -0
  43. data/lib/caracal/document.rb +242 -0
  44. data/lib/caracal/errors.rb +23 -0
  45. data/lib/caracal/renderers/app_renderer.rb +41 -0
  46. data/lib/caracal/renderers/content_types_renderer.rb +53 -0
  47. data/lib/caracal/renderers/core_renderer.rb +44 -0
  48. data/lib/caracal/renderers/document_renderer.rb +349 -0
  49. data/lib/caracal/renderers/fonts_renderer.rb +56 -0
  50. data/lib/caracal/renderers/footer_renderer.rb +69 -0
  51. data/lib/caracal/renderers/numbering_renderer.rb +87 -0
  52. data/lib/caracal/renderers/package_relationships_renderer.rb +50 -0
  53. data/lib/caracal/renderers/relationships_renderer.rb +48 -0
  54. data/lib/caracal/renderers/settings_renderer.rb +58 -0
  55. data/lib/caracal/renderers/styles_renderer.rb +163 -0
  56. data/lib/caracal/renderers/xml_renderer.rb +83 -0
  57. data/lib/caracal/version.rb +3 -0
  58. data/lib/tilt/caracal.rb +21 -0
  59. data/spec/lib/caracal/core/file_name_spec.rb +54 -0
  60. data/spec/lib/caracal/core/fonts_spec.rb +119 -0
  61. data/spec/lib/caracal/core/images_spec.rb +25 -0
  62. data/spec/lib/caracal/core/line_breaks_spec.rb +25 -0
  63. data/spec/lib/caracal/core/list_styles_spec.rb +121 -0
  64. data/spec/lib/caracal/core/lists_spec.rb +43 -0
  65. data/spec/lib/caracal/core/models/base_model_spec.rb +38 -0
  66. data/spec/lib/caracal/core/models/border_model_spec.rb +159 -0
  67. data/spec/lib/caracal/core/models/font_model_spec.rb +92 -0
  68. data/spec/lib/caracal/core/models/image_model_spec.rb +192 -0
  69. data/spec/lib/caracal/core/models/line_break_model_spec.rb +21 -0
  70. data/spec/lib/caracal/core/models/link_model_spec.rb +139 -0
  71. data/spec/lib/caracal/core/models/list_item_model_spec.rb +190 -0
  72. data/spec/lib/caracal/core/models/list_model_spec.rb +178 -0
  73. data/spec/lib/caracal/core/models/list_style_model_spec.rb +212 -0
  74. data/spec/lib/caracal/core/models/margin_model_spec.rb +111 -0
  75. data/spec/lib/caracal/core/models/page_break_model_spec.rb +21 -0
  76. data/spec/lib/caracal/core/models/page_number_model_spec.rb +101 -0
  77. data/spec/lib/caracal/core/models/page_size_model_spec.rb +91 -0
  78. data/spec/lib/caracal/core/models/paragraph_model_spec.rb +162 -0
  79. data/spec/lib/caracal/core/models/relationship_model_spec.rb +183 -0
  80. data/spec/lib/caracal/core/models/rule_model_spec.rb +108 -0
  81. data/spec/lib/caracal/core/models/style_model_spec.rb +187 -0
  82. data/spec/lib/caracal/core/models/table_cell_model_spec.rb +221 -0
  83. data/spec/lib/caracal/core/models/table_model_spec.rb +222 -0
  84. data/spec/lib/caracal/core/models/text_model_spec.rb +132 -0
  85. data/spec/lib/caracal/core/page_breaks_spec.rb +25 -0
  86. data/spec/lib/caracal/core/page_numbers_spec.rb +80 -0
  87. data/spec/lib/caracal/core/page_settings_spec.rb +143 -0
  88. data/spec/lib/caracal/core/relationships_spec.rb +119 -0
  89. data/spec/lib/caracal/core/rules_spec.rb +25 -0
  90. data/spec/lib/caracal/core/styles_spec.rb +129 -0
  91. data/spec/lib/caracal/core/tables_spec.rb +25 -0
  92. data/spec/lib/caracal/core/text_spec.rb +52 -0
  93. data/spec/lib/caracal/errors_spec.rb +10 -0
  94. data/spec/spec_helper.rb +8 -0
  95. metadata +245 -0
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Models::LineBreakModel do
4
+ let(:name) { 'Arial' }
5
+
6
+ subject { described_class.new }
7
+
8
+
9
+ #-------------------------------------------------------------
10
+ # Configuration
11
+ #-------------------------------------------------------------
12
+
13
+ describe 'configuration tests' do
14
+
15
+ describe 'inheritance' do
16
+ it { expect(subject).to be_a(Caracal::Core::Models::BaseModel) }
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Models::LinkModel do
4
+ subject do
5
+ described_class.new do
6
+ content 'Link Text'
7
+ href 'http://www.google.com'
8
+ style 'Fancy'
9
+ color '666666'
10
+ size 20
11
+ bold false
12
+ italic false
13
+ underline true
14
+ end
15
+ end
16
+
17
+ #-------------------------------------------------------------
18
+ # Configuration
19
+ #-------------------------------------------------------------
20
+
21
+ describe 'configuration tests' do
22
+
23
+ # accessors
24
+ describe 'accessors' do
25
+ it { expect(subject.link_content).to eq 'Link Text' }
26
+ it { expect(subject.link_href).to eq 'http://www.google.com' }
27
+ it { expect(subject.link_style).to eq 'Fancy' }
28
+ it { expect(subject.link_color).to eq '666666' }
29
+ it { expect(subject.link_size).to eq 20 }
30
+ it { expect(subject.link_bold).to eq false }
31
+ it { expect(subject.link_italic).to eq false }
32
+ it { expect(subject.link_underline).to eq true }
33
+ end
34
+
35
+ end
36
+
37
+
38
+ #-------------------------------------------------------------
39
+ # Public Methods
40
+ #-------------------------------------------------------------
41
+
42
+ describe 'public method tests' do
43
+
44
+ #=============== GETTERS ==========================
45
+
46
+ # .run_attributes
47
+ describe '.run_attributes' do
48
+ let(:expected) { { style: 'Fancy', color: '666666', size: 20, bold: false, italic: false, underline: true } }
49
+
50
+ it { expect(subject.run_attributes).to eq expected }
51
+ end
52
+
53
+
54
+ #=============== SETTERS ==========================
55
+
56
+ # booleans
57
+ describe '.bold' do
58
+ before { subject.bold(true) }
59
+
60
+ it { expect(subject.link_bold).to eq true }
61
+ end
62
+ describe '.italic' do
63
+ before { subject.italic(true) }
64
+
65
+ it { expect(subject.link_italic).to eq true }
66
+ end
67
+ describe '.underline' do
68
+ before { subject.underline(true) }
69
+
70
+ it { expect(subject.link_underline).to eq true }
71
+ end
72
+
73
+ # integers
74
+ describe '.size' do
75
+ before { subject.size(24) }
76
+
77
+ it { expect(subject.link_size).to eq 24 }
78
+ end
79
+
80
+ # strings
81
+ describe '.color' do
82
+ before { subject.color('999999') }
83
+
84
+ it { expect(subject.link_color).to eq '999999' }
85
+ end
86
+ describe '.content' do
87
+ before { subject.content('Something Else') }
88
+
89
+ it { expect(subject.link_content).to eq 'Something Else' }
90
+ end
91
+ describe '.href' do
92
+ before { subject.href('http://www.google.com') }
93
+
94
+ it { expect(subject.link_href).to eq 'http://www.google.com' }
95
+ end
96
+ describe '.style' do
97
+ before { subject.style('Dummy') }
98
+
99
+ it { expect(subject.link_style).to eq 'Dummy' }
100
+ end
101
+
102
+
103
+ #=============== VALIDATION ===========================
104
+
105
+ describe '.valid?' do
106
+ describe 'when required attributes provided' do
107
+ it { expect(subject.valid?).to eq true }
108
+ end
109
+ [:content, :href].each do |prop|
110
+ describe "when #{ prop } nil" do
111
+ before do
112
+ allow(subject).to receive("link_#{ prop }").and_return(nil)
113
+ end
114
+
115
+ it { expect(subject.valid?).to eq false }
116
+ end
117
+ end
118
+ end
119
+
120
+ end
121
+
122
+
123
+ #-------------------------------------------------------------
124
+ # Private Methods
125
+ #-------------------------------------------------------------
126
+
127
+ describe 'private method tests' do
128
+
129
+ # .option_keys
130
+ describe '.option_keys' do
131
+ let(:actual) { subject.send(:option_keys).sort }
132
+ let(:expected) { [:content, :href, :style, :color, :size, :bold, :italic, :underline].sort }
133
+
134
+ it { expect(actual).to eq expected }
135
+ end
136
+
137
+ end
138
+
139
+ end
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Models::ListItemModel do
4
+ subject do
5
+ described_class.new content: 'Lorem ipsum dolor....' do
6
+ type :ordered
7
+ level 2
8
+ style 'Fancy'
9
+ color '666666'
10
+ size 20
11
+ bold false
12
+ italic false
13
+ underline true
14
+ end
15
+ end
16
+
17
+ #-------------------------------------------------------------
18
+ # Configuration
19
+ #-------------------------------------------------------------
20
+
21
+ describe 'configuration tests' do
22
+
23
+ # accessors
24
+ describe 'accessors' do
25
+ it { expect(subject.respond_to? :nested_list).to eq true }
26
+ it { expect(subject.respond_to? :nested_list=).to eq true }
27
+ it { expect(subject.list_item_type).to eq :ordered }
28
+ it { expect(subject.list_item_level).to eq 2 }
29
+ it { expect(subject.list_item_style).to eq 'Fancy' }
30
+ it { expect(subject.list_item_color).to eq '666666' }
31
+ it { expect(subject.list_item_size).to eq 20 }
32
+ it { expect(subject.list_item_bold).to eq false }
33
+ it { expect(subject.list_item_italic).to eq false }
34
+ it { expect(subject.list_item_underline).to eq true }
35
+ end
36
+
37
+ end
38
+
39
+
40
+ #-------------------------------------------------------------
41
+ # Public Methods
42
+ #-------------------------------------------------------------
43
+
44
+ describe 'public method tests' do
45
+
46
+ #=============== GETTERS ==========================
47
+
48
+ # .runs
49
+ describe '.runs' do
50
+ it { expect(subject.runs).to be_a(Array) }
51
+ end
52
+
53
+
54
+ #=============== SETTERS ==========================
55
+
56
+ # booleans
57
+ describe '.bold' do
58
+ before { subject.bold(true) }
59
+
60
+ it { expect(subject.list_item_bold).to eq true }
61
+ end
62
+ describe '.italic' do
63
+ before { subject.italic(true) }
64
+
65
+ it { expect(subject.list_item_italic).to eq true }
66
+ end
67
+ describe '.underline' do
68
+ before { subject.underline(true) }
69
+
70
+ it { expect(subject.list_item_underline).to eq true }
71
+ end
72
+
73
+ # integers
74
+ describe '.level' do
75
+ before { subject.level(3) }
76
+
77
+ it { expect(subject.list_item_level).to eq 3 }
78
+ end
79
+ describe '.size' do
80
+ before { subject.size(24) }
81
+
82
+ it { expect(subject.list_item_size).to eq 24 }
83
+ end
84
+
85
+ # strings
86
+ describe '.color' do
87
+ before { subject.color('999999') }
88
+
89
+ it { expect(subject.list_item_color).to eq '999999' }
90
+ end
91
+ describe '.style' do
92
+ before { subject.style('Dummy') }
93
+
94
+ it { expect(subject.list_item_style).to eq 'Dummy' }
95
+ end
96
+
97
+ # symbols
98
+ describe '.type' do
99
+ before { subject.type(:ordered) }
100
+
101
+ it { expect(subject.list_item_type).to eq :ordered }
102
+ end
103
+
104
+
105
+ #=============== SUB-METHODS ==========================
106
+
107
+ # .link
108
+ describe '.link' do
109
+ let!(:length) { subject.runs.length }
110
+
111
+ before { subject.link 'Text', 'http://www.google.com' }
112
+
113
+ it { expect(subject.runs.size).to eq length + 1 }
114
+ end
115
+
116
+ # .text
117
+ describe '.text' do
118
+ let!(:length) { subject.runs.length }
119
+
120
+ before { subject.text 'Text' }
121
+
122
+ it { expect(subject.runs.size).to eq length + 1 }
123
+ end
124
+
125
+ # .ol
126
+ describe '.ol' do
127
+ describe 'when no nested list provided' do
128
+ subject do
129
+ described_class.new type: :ordered, level: 0 do
130
+ text 'Item text.'
131
+ end
132
+ end
133
+
134
+ it { expect(subject.nested_list).to eq nil }
135
+ end
136
+ describe 'when nested list provided' do
137
+ subject do
138
+ described_class.new type: :ordered, level: 0 do
139
+ text 'Item text.'
140
+ ol do
141
+ li 'Nested item text.'
142
+ end
143
+ end
144
+ end
145
+
146
+ it { expect(subject.nested_list).to be_a(Caracal::Core::Models::ListModel) }
147
+ end
148
+ end
149
+
150
+
151
+
152
+ #=============== VALIDATION ===========================
153
+
154
+ describe '.valid?' do
155
+ describe 'when at least one run exists' do
156
+ before do
157
+ allow(subject).to receive(:runs).and_return(['a'])
158
+ end
159
+
160
+ it { expect(subject.valid?).to eq true }
161
+ end
162
+ describe 'when no runs exist' do
163
+ before do
164
+ allow(subject).to receive(:runs).and_return([])
165
+ end
166
+
167
+ it { expect(subject.valid?).to eq false }
168
+ end
169
+ end
170
+
171
+ end
172
+
173
+
174
+ #-------------------------------------------------------------
175
+ # Private Methods
176
+ #-------------------------------------------------------------
177
+
178
+ describe 'private method tests' do
179
+
180
+ # .option_keys
181
+ describe '.option_keys' do
182
+ let(:actual) { subject.send(:option_keys).sort }
183
+ let(:expected) { [:type, :level, :content, :style, :color, :size, :bold, :italic, :underline].sort }
184
+
185
+ it { expect(actual).to eq expected }
186
+ end
187
+
188
+ end
189
+
190
+ end
@@ -0,0 +1,178 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Models::ListModel do
4
+ subject do
5
+ described_class.new do
6
+ type :ordered
7
+ level 1
8
+ li 'Item 1'
9
+ end
10
+ end
11
+
12
+ #-------------------------------------------------------------
13
+ # Configuration
14
+ #-------------------------------------------------------------
15
+
16
+ describe 'configuration tests' do
17
+
18
+ # constants
19
+ describe 'constants' do
20
+ it { expect(described_class::DEFAULT_LIST_TYPE).to eq :unordered }
21
+ it { expect(described_class::DEFAULT_LIST_LEVEL).to eq 0 }
22
+ end
23
+
24
+ # accessors
25
+ describe 'accessors' do
26
+ it { expect(subject.list_type).to eq :ordered }
27
+ it { expect(subject.list_level).to eq 1 }
28
+ end
29
+
30
+ end
31
+
32
+
33
+ #-------------------------------------------------------------
34
+ # Public Methods
35
+ #-------------------------------------------------------------
36
+
37
+ describe 'public method tests' do
38
+
39
+ #=============== GETTERS ==========================
40
+
41
+ # .items
42
+ describe '.items' do
43
+ it { expect(subject.items).to be_a(Array) }
44
+ end
45
+
46
+ # .recursive_items
47
+ describe '.recursive_items' do
48
+ describe 'when no nested lists provided' do
49
+ subject do
50
+ described_class.new type: :ordered, level: 0 do
51
+ li 'Item 1'
52
+ li 'Item 2'
53
+ end
54
+ end
55
+
56
+ it { expect(subject.recursive_items.size).to eq 2 }
57
+ it { expect(subject.recursive_items[0].list_item_level).to eq 0 }
58
+ end
59
+ describe 'when one nested list provided' do
60
+ subject do
61
+ described_class.new type: :ordered, level: 0 do
62
+ li 'Item 1'
63
+ li 'Item 2' do
64
+ ol do
65
+ li 'SubItem 1'
66
+ li 'SubItem 2'
67
+ end
68
+ end
69
+ li 'Item 3'
70
+ end
71
+ end
72
+
73
+ it { expect(subject.recursive_items.size).to eq 5 }
74
+ it { expect(subject.recursive_items[0].list_item_level).to eq 0 }
75
+ it { expect(subject.recursive_items[2].list_item_level).to eq 1 }
76
+ it { expect(subject.recursive_items[4].list_item_level).to eq 0 }
77
+ end
78
+ describe 'when more than one nested list provided' do
79
+ subject do
80
+ described_class.new type: :ordered, level: 0 do
81
+ li 'Item 1'
82
+ li 'Item 2' do
83
+ ol do
84
+ li 'SubItem 1' do
85
+ ul do
86
+ li 'NestedItem 1'
87
+ end
88
+ end
89
+ li 'SubItem 2'
90
+ end
91
+ end
92
+ li 'Item 3'
93
+ end
94
+ end
95
+
96
+ it { expect(subject.recursive_items.size).to eq 6 }
97
+ it { expect(subject.recursive_items[0].list_item_level).to eq 0 }
98
+ it { expect(subject.recursive_items[2].list_item_level).to eq 1 }
99
+ it { expect(subject.recursive_items[3].list_item_level).to eq 2 }
100
+ it { expect(subject.recursive_items[4].list_item_level).to eq 1 }
101
+ it { expect(subject.recursive_items[5].list_item_level).to eq 0 }
102
+ end
103
+ end
104
+
105
+
106
+ #=============== SETTERS ==========================
107
+
108
+ # .type
109
+ describe '.type' do
110
+ before { subject.type(:dummy) }
111
+
112
+ it { expect(subject.list_type).to eq :dummy }
113
+ end
114
+
115
+ # .level
116
+ describe '.level' do
117
+ before { subject.level(2) }
118
+
119
+ it { expect(subject.list_level).to eq 2 }
120
+ end
121
+
122
+
123
+ #=============== SUB-METHODS ==========================
124
+
125
+ # .li
126
+ describe '.li' do
127
+ let!(:length) { subject.items.length }
128
+
129
+ before { subject.li 'Text' }
130
+
131
+ it { expect(subject.items.size).to eq length + 1 }
132
+ end
133
+
134
+
135
+ #=============== VALIDATION ===========================
136
+
137
+ describe '.valid?' do
138
+ describe 'when all required attributes provides' do
139
+ it { expect(subject.valid?).to eq true }
140
+ end
141
+ [:type, :level].each do |attr|
142
+ describe "when #{ attr } nil" do
143
+ before do
144
+ allow(subject).to receive("list_#{ attr }").and_return(nil)
145
+ end
146
+
147
+ it { expect(subject.valid?).to eq false }
148
+ end
149
+ end
150
+ describe 'when items empty' do
151
+ before do
152
+ allow(subject).to receive(:items).and_return([])
153
+ end
154
+
155
+ it { expect(subject.valid?).to eq false }
156
+ end
157
+ end
158
+
159
+ end
160
+
161
+
162
+ #-------------------------------------------------------------
163
+ # Private Methods
164
+ #-------------------------------------------------------------
165
+
166
+ describe 'private method tests' do
167
+
168
+ # .option_keys
169
+ describe '.option_keys' do
170
+ let(:actual) { subject.send(:option_keys).sort }
171
+ let(:expected) { [:type, :level].sort }
172
+
173
+ it { expect(actual).to eq expected }
174
+ end
175
+
176
+ end
177
+
178
+ end