virgild-resumetools 0.2.4.1 → 0.2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|