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.
@@ -33,3 +33,4 @@ require "resumetools/resume/resume"
33
33
  require "resumetools/resume/text_reader"
34
34
  require "resumetools/resume/pdf"
35
35
  require "resumetools/resume/plain_text"
36
+ require "resumetools/resume/json"
@@ -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
- require "prawn"
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
- pdf.text [self.address1, self.address2].join(", "), :align => :center
74
- pdf.text [telephone, email].join(" • "), :align => :center
75
- pdf.text url, :align => :center
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(detail_line.join(" • "), :size => FONT_SIZES[:default])
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
- private
144
- def print_date(dtstart, dtend)
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
- @item_bullet = "-"
12
- @header_filler = "-"
13
- @newline = "\n"
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 = 0
16
- @format.columns = 80
17
- @indent = 2
18
- @lined_headers = true
23
+ @format.first_indent = @opts[:first_indent]
24
+ @format.columns = @opts[:columns]
19
25
 
20
- center @resume.full_name
21
- center @resume.address1
22
- center @resume.address2
23
- center @resume.telephone
24
- center @resume.email
25
- center @resume.url
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
- yield section if block_given?
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
- yield period if block_given?
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
- yield item if block_given?
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
- yield item if block_given?
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 = Array.new
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}) - #{self.dtend})"
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})"
@@ -28,8 +28,8 @@ unless defined? ResumeTools::VERSION
28
28
  module VERSION
29
29
  MAJOR = 0
30
30
  MINOR = 2
31
- TINY = 4
32
- BITSY = 1
31
+ TINY = 5
32
+ BITSY = 0
33
33
  STRING = [MAJOR, MINOR, TINY, BITSY].join('.')
34
34
  end
35
35
  end
@@ -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.1
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-17 00:00:00 -07:00
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