virgild-resumetools 0.2.4.1 → 0.2.5.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.
- data/lib/resumetools.rb +1 -0
- data/lib/resumetools/resume/json.rb +79 -0
- data/lib/resumetools/resume/pdf.rb +14 -29
- data/lib/resumetools/resume/plain_text.rb +35 -20
- data/lib/resumetools/resume/resume.rb +17 -6
- data/lib/resumetools/version.rb +2 -2
- data/tasks/gem.rake +2 -1
- metadata +14 -3
data/lib/resumetools.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'json/pure'
|
2
|
+
|
3
|
+
module ResumeTools
|
4
|
+
module Renderer
|
5
|
+
class JSON
|
6
|
+
def initialize(resume)
|
7
|
+
@resume = resume
|
8
|
+
end
|
9
|
+
|
10
|
+
def render(opts={})
|
11
|
+
frame = {
|
12
|
+
:full_name => @resume.full_name,
|
13
|
+
:url => @resume.url,
|
14
|
+
:email => @resume.email,
|
15
|
+
:telephone => @resume.telephone,
|
16
|
+
:address1 => @resume.address1,
|
17
|
+
:address2 => @resume.address2,
|
18
|
+
:sections => @resume.sections.map { |section| section.json_frame }
|
19
|
+
}
|
20
|
+
::JSON.generate(frame)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module JSONHelpers
|
25
|
+
module SectionMethods
|
26
|
+
def json_frame
|
27
|
+
frame = {
|
28
|
+
:title => self.title,
|
29
|
+
:para => self.para,
|
30
|
+
:items => self.items.map { |item| item.json_frame },
|
31
|
+
:periods => self.periods.map { |period| period.json_frame }
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ItemMethods
|
37
|
+
def json_frame
|
38
|
+
frame = { :text => self.text }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module PeriodMethods
|
43
|
+
def json_frame
|
44
|
+
frame = {
|
45
|
+
:title => self.title,
|
46
|
+
:location => self.location,
|
47
|
+
:organization => self.organization,
|
48
|
+
:dtstart => self.dtstart,
|
49
|
+
:dtend => self.dtend,
|
50
|
+
:items => self.items.map { |item| item.json_frame }
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module JSONMethods
|
57
|
+
def render_json(opts={})
|
58
|
+
renderer = JSON.new(self)
|
59
|
+
renderer.render(opts)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Section.class_eval do
|
65
|
+
include Renderer::JSONHelpers::SectionMethods
|
66
|
+
end
|
67
|
+
|
68
|
+
Period.class_eval do
|
69
|
+
include Renderer::JSONHelpers::PeriodMethods
|
70
|
+
end
|
71
|
+
|
72
|
+
Item.class_eval do
|
73
|
+
include Renderer::JSONHelpers::ItemMethods
|
74
|
+
end
|
75
|
+
|
76
|
+
Resume.class_eval do
|
77
|
+
include Renderer::JSONMethods
|
78
|
+
end
|
79
|
+
end
|
@@ -23,14 +23,15 @@
|
|
23
23
|
# OTHER DEALINGS IN THE SOFTWARE.
|
24
24
|
#++
|
25
25
|
|
26
|
+
require "prawn"
|
27
|
+
require "prawn/format"
|
28
|
+
require "prawn/layout"
|
29
|
+
require "prawn/measurement_extensions"
|
30
|
+
|
26
31
|
module ResumeTools
|
27
32
|
module Renderer
|
28
33
|
module PDF
|
29
|
-
|
30
|
-
require "prawn/format"
|
31
|
-
require "prawn/layout"
|
32
|
-
require "prawn/measurement_extensions"
|
33
|
-
|
34
|
+
|
34
35
|
FONT_DIR = File.join(File.dirname(__FILE__), '..', '..', 'fonts')
|
35
36
|
MARGINS = [1.0, 1.0, 1.0, 1.0]
|
36
37
|
FONT_SIZES = {
|
@@ -70,9 +71,9 @@ module ResumeTools
|
|
70
71
|
pdf.text self.full_name, :style => :bold, :size => FONT_SIZES[:header], :align => :center
|
71
72
|
|
72
73
|
# Contact info
|
73
|
-
|
74
|
-
|
75
|
-
|
74
|
+
self.header_lines.each do |line|
|
75
|
+
pdf.text line, :align => :center
|
76
|
+
end
|
76
77
|
|
77
78
|
pdf.pad_bottom 20 do
|
78
79
|
end
|
@@ -110,14 +111,8 @@ module ResumeTools
|
|
110
111
|
pdf.pad_top(5) { pdf.text period.title, :style => :bold, :size => FONT_SIZES[:period] }
|
111
112
|
|
112
113
|
# Period details
|
113
|
-
detail_line = []
|
114
|
-
dates = print_date(period.dtstart, period.dtend)
|
115
|
-
detail_line << period.organization unless period.organization.blank?
|
116
|
-
detail_line << period.location unless period.location.blank?
|
117
|
-
detail_line << dates unless dates.blank?
|
118
|
-
|
119
114
|
pdf.span(pdf.bounds.width - 10, :position => 10) do
|
120
|
-
pdf.text(
|
115
|
+
pdf.text(period.line, :size => FONT_SIZES[:default])
|
121
116
|
end
|
122
117
|
|
123
118
|
# Period items
|
@@ -139,21 +134,11 @@ module ResumeTools
|
|
139
134
|
|
140
135
|
pdf.render
|
141
136
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
if dtstart && dtend
|
146
|
-
dtstart + " - " + dtend
|
147
|
-
elsif dtstart && dtend.nil?
|
148
|
-
dtstart.strftime(DATE_FORMAT)
|
149
|
-
else
|
150
|
-
""
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
137
|
+
|
138
|
+
end #module PDF
|
139
|
+
end #module Renderer
|
155
140
|
|
156
141
|
Resume.class_eval do
|
157
142
|
include Renderer::PDF
|
158
143
|
end
|
159
|
-
end
|
144
|
+
end #module ResumeTools
|
@@ -8,21 +8,27 @@ module ResumeTools
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def render(opts={})
|
11
|
-
@
|
12
|
-
|
13
|
-
|
11
|
+
@opts = {
|
12
|
+
:item_bullet => '-',
|
13
|
+
:header_filler => '-',
|
14
|
+
:newline => "\n",
|
15
|
+
:first_indent => 0,
|
16
|
+
:columns => 80,
|
17
|
+
:indent => 2,
|
18
|
+
:centered_top => true,
|
19
|
+
:lined_headers => true
|
20
|
+
}
|
21
|
+
@opts.merge!(opts)
|
14
22
|
@format = Text::Format.new
|
15
|
-
@format.first_indent =
|
16
|
-
@format.columns =
|
17
|
-
@indent = 2
|
18
|
-
@lined_headers = true
|
23
|
+
@format.first_indent = @opts[:first_indent]
|
24
|
+
@format.columns = @opts[:columns]
|
19
25
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
top_line @resume.full_name unless @resume.full_name.blank?
|
27
|
+
top_line @resume.address1 if @resume.has_address1?
|
28
|
+
top_line @resume.address2 if @resume.has_address2?
|
29
|
+
top_line @resume.telephone if @resume.has_telephone?
|
30
|
+
top_line @resume.email if @resume.has_email?
|
31
|
+
top_line @resume.url if @resume.has_url?
|
26
32
|
blank_line
|
27
33
|
|
28
34
|
@resume.sections.each_with_index do |section, n|
|
@@ -53,6 +59,14 @@ module ResumeTools
|
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|
62
|
+
def top_line(text)
|
63
|
+
if @opts[:centered_top]
|
64
|
+
center text
|
65
|
+
else
|
66
|
+
add_line text
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
56
70
|
def render_period(period)
|
57
71
|
add_line(period.title) if period.title
|
58
72
|
add_line period.line
|
@@ -69,7 +83,7 @@ module ResumeTools
|
|
69
83
|
end
|
70
84
|
|
71
85
|
def render_item(item)
|
72
|
-
add_line "#{@item_bullet} " + item.text
|
86
|
+
add_line "#{@opts[:item_bullet]} " + item.text
|
73
87
|
end
|
74
88
|
|
75
89
|
def render_paragraph(para)
|
@@ -85,21 +99,21 @@ module ResumeTools
|
|
85
99
|
end
|
86
100
|
|
87
101
|
def center(line)
|
88
|
-
line = @newline if line.nil?
|
89
|
-
content << @format.center(line)
|
102
|
+
line = @opts[:newline] if line.nil?
|
103
|
+
content << @format.center(line)
|
90
104
|
end
|
91
105
|
|
92
106
|
def add_line(line="")
|
93
|
-
line = @newline if line.nil?
|
107
|
+
line = @opts[:newline] if line.nil?
|
94
108
|
content << @format.format(line)
|
95
109
|
end
|
96
110
|
|
97
111
|
def blank_line
|
98
|
-
content << @newline
|
112
|
+
content << @opts[:newline]
|
99
113
|
end
|
100
114
|
|
101
115
|
def push_margin(cols=0, &block)
|
102
|
-
cols = @indent if (cols == 0)
|
116
|
+
cols = @opts[:indent] if (cols == 0)
|
103
117
|
previous_margin = @format.left_margin
|
104
118
|
@format.left_margin = @format.left_margin + cols
|
105
119
|
block.call
|
@@ -108,7 +122,8 @@ module ResumeTools
|
|
108
122
|
|
109
123
|
def header(text)
|
110
124
|
add_line(text)
|
111
|
-
add_line(@header_filler * text.length) if @lined_headers
|
125
|
+
add_line(@opts[:header_filler] * text.length) if @opts[:lined_headers]
|
126
|
+
blank_line
|
112
127
|
end
|
113
128
|
end #class PlainText
|
114
129
|
|
@@ -77,7 +77,7 @@ module ResumeTools
|
|
77
77
|
# Create new section and add to sections
|
78
78
|
def create_section(props={}, &block)
|
79
79
|
section = Section.new(props)
|
80
|
-
|
80
|
+
block.call(section) if block
|
81
81
|
self.add_section(section)
|
82
82
|
self
|
83
83
|
end
|
@@ -112,6 +112,17 @@ module ResumeTools
|
|
112
112
|
!self.sections.empty?
|
113
113
|
end
|
114
114
|
|
115
|
+
# Returns an array of lines that has the contact info
|
116
|
+
def header_lines
|
117
|
+
elements = []
|
118
|
+
[:address1, :address2, :telephone, :email, :url].each do |element|
|
119
|
+
elements << self.send(element) unless self.send(element).blank?
|
120
|
+
end
|
121
|
+
lines = []
|
122
|
+
elements.each_slice(2) { |pair| lines << pair.join(" • ") }
|
123
|
+
lines
|
124
|
+
end
|
125
|
+
|
115
126
|
end #class Resume
|
116
127
|
|
117
128
|
|
@@ -166,7 +177,7 @@ module ResumeTools
|
|
166
177
|
# Creates a period and adds it to the list
|
167
178
|
def create_period(props={}, &block)
|
168
179
|
period = Period.new(props)
|
169
|
-
|
180
|
+
block.call(period) if block
|
170
181
|
self.add_period(period)
|
171
182
|
self
|
172
183
|
end
|
@@ -184,7 +195,7 @@ module ResumeTools
|
|
184
195
|
# Creates an item and adds it to the list
|
185
196
|
def create_item(props={}, &block)
|
186
197
|
item = Item.new(props)
|
187
|
-
|
198
|
+
block.call(item) if block
|
188
199
|
self.add_item(item)
|
189
200
|
self
|
190
201
|
end
|
@@ -255,18 +266,18 @@ module ResumeTools
|
|
255
266
|
# Creates an item and adds it to the list
|
256
267
|
def create_item(props={}, &block)
|
257
268
|
item = Item.new(props)
|
258
|
-
|
269
|
+
block.call(item) if block
|
259
270
|
self.add_item(item)
|
260
271
|
item
|
261
272
|
end
|
262
273
|
|
263
274
|
# The period details in a single line
|
264
275
|
def line
|
265
|
-
elements =
|
276
|
+
elements = []
|
266
277
|
elements << self.organization if self.has_organization?
|
267
278
|
elements << self.location if self.has_location?
|
268
279
|
if self.has_dtstart? && self.has_dtend?
|
269
|
-
date = " (#{self.dtstart}
|
280
|
+
date = " (#{self.dtstart} - #{self.dtend})"
|
270
281
|
elsif self.has_dtstart? || self.has_dtend?
|
271
282
|
value = self.has_dtstart? ? self.dtstart : self.dtend
|
272
283
|
date = " (#{value})"
|
data/lib/resumetools/version.rb
CHANGED
data/tasks/gem.rake
CHANGED
@@ -24,7 +24,8 @@ namespace :gem do
|
|
24
24
|
s.add_runtime_dependency("extlib")
|
25
25
|
s.add_runtime_dependency("prawn", ">= 0.5.0")
|
26
26
|
s.add_runtime_dependency("treetop", ">= 1.3.0")
|
27
|
-
s.add_runtime_dependency("text-format", "1.0.0")
|
27
|
+
s.add_runtime_dependency("text-format", ">=1.0.0")
|
28
|
+
s.add_runtime_dependency("json", ">=1.1.9")
|
28
29
|
|
29
30
|
s.require_path = "lib"
|
30
31
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virgild-resumetools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Virgil Dimaguila
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-22 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,10 +68,20 @@ dependencies:
|
|
68
68
|
version_requirement:
|
69
69
|
version_requirements: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- - "
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: 1.0.0
|
74
74
|
version:
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: json
|
77
|
+
type: :runtime
|
78
|
+
version_requirement:
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.1.9
|
84
|
+
version:
|
75
85
|
description: Resume generation and writing tools
|
76
86
|
email: virgil@roundysoft.com
|
77
87
|
executables: []
|
@@ -92,6 +102,7 @@ files:
|
|
92
102
|
- lib/resumetools/grammars
|
93
103
|
- lib/resumetools/grammars/resume.treetop
|
94
104
|
- lib/resumetools/resume
|
105
|
+
- lib/resumetools/resume/json.rb
|
95
106
|
- lib/resumetools/resume/pdf.rb
|
96
107
|
- lib/resumetools/resume/plain_text.rb
|
97
108
|
- lib/resumetools/resume/resume.rb
|