resme 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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +170 -0
  6. data/Rakefile +2 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/exe/resme +6 -0
  10. data/lib/resme.rb +4 -0
  11. data/lib/resme/cli/command_semantics.rb +155 -0
  12. data/lib/resme/cli/command_syntax.rb +192 -0
  13. data/lib/resme/renderer/renderer.rb +103 -0
  14. data/lib/resme/templates/europass/eu.xml.erb +405 -0
  15. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Achievement.xsd +91 -0
  16. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Certificate.xsd +62 -0
  17. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/CommonTypes.xsd +139 -0
  18. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/ComputerSkill.xsd +112 -0
  19. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/ContactInformation.xsd +321 -0
  20. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Demographics.xsd +122 -0
  21. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/DigitalContent.xsd +164 -0
  22. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/DocumentInformation.xsd +119 -0
  23. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Documentation.xsd +122 -0
  24. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/DrivingSkill.xsd +71 -0
  25. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EducationalExperience.xsd +137 -0
  26. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EmploymentExperience.xsd +65 -0
  27. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EuropassCoverLetter.xsd +70 -0
  28. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EuropassLearnerInformation.xsd +91 -0
  29. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EuropassPrintingPreferences.xsd +247 -0
  30. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/EuropassSchema.xsd +133 -0
  31. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Experience.xsd +75 -0
  32. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Headline.xsd +97 -0
  33. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Identification.xsd +54 -0
  34. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Language.xsd +107 -0
  35. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Letter.xsd +129 -0
  36. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/LinguisticSkill.xsd +189 -0
  37. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/OccupationalField.xsd +68 -0
  38. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Organisation.xsd +129 -0
  39. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/PersonName.xsd +71 -0
  40. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/Skill.xsd +71 -0
  41. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/imported/EQF_08_V1.0.0.xsd +115 -0
  42. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/imported/EUDrivingLicence_V1.1.0.xsd +28 -0
  43. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/imported/ISCED97_V1.0.0.xsd +981 -0
  44. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/imported/NACE_COM_V1.0.0.xsd +5630 -0
  45. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/included/EuropassAddressFormats_V1.3.0.xsd +117 -0
  46. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/included/EuropassISCO_88_COM_V1.4.0.xsd +15116 -0
  47. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/included/EuropassISOCountries_V1.6.0.xsd +6180 -0
  48. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/included/EuropassISOLanguages_V1.8.0.xsd +7645 -0
  49. data/lib/resme/templates/europass/europass-xml-schema-definition-v3.3.0/included/EuropassNationalities_V1.6.0.xsd +6179 -0
  50. data/lib/resme/templates/europass/europass-xml-schema-doc-v3.3.0.pdf +0 -0
  51. data/lib/resme/templates/html/css/main.css +87 -0
  52. data/lib/resme/templates/html/css/normalize.css +424 -0
  53. data/lib/resme/templates/html/index.html.erb +22 -0
  54. data/lib/resme/templates/html/js/main.js +0 -0
  55. data/lib/resme/templates/html/js/plugins.js +24 -0
  56. data/lib/resme/templates/html/js/vendor/jquery-1.12.0.min.js +5 -0
  57. data/lib/resme/templates/html/js/vendor/modernizr-2.8.3.min.js +4 -0
  58. data/lib/resme/templates/resume.json.erb +137 -0
  59. data/lib/resme/templates/resume.md.erb +120 -0
  60. data/lib/resme/templates/resume.yml +240 -0
  61. data/lib/resme/version.rb +3 -0
  62. data/resme.gemspec +28 -0
  63. metadata +151 -0
@@ -0,0 +1,103 @@
1
+ #
2
+ # Utility functions you might want to use in your ERB
3
+ # template
4
+ #
5
+
6
+ # remove spaces at the beginning of string
7
+ # remove extra spaces and special chars with a single space
8
+ def clean string
9
+ string.gsub(/^[\t\n ]+/, "").gsub(/[\t\n ]+/, " ")
10
+ end
11
+
12
+ # break a string into substrings of length chars breaking at spaces
13
+ # and newlines
14
+ #
15
+ # * `string` string to reflow
16
+ # * `chars` number of characters to break the string at
17
+ # * returns an array of strings of length < chars (with exceptions
18
+ # for special cases)
19
+ #
20
+ # special cases: if one line is longer than chars characters, then
21
+ # break at the first space after chars
22
+ #
23
+ def reflow string, chars
24
+ if string.length < chars
25
+ return [clean(string)]
26
+ else
27
+ chars.downto(0).each do |index|
28
+ if string[index] == " " or string[index] == "\n" or string[index] == "\t"
29
+ return [clean(string[0..index-1])] + reflow(string[index+1..-1], chars)
30
+ end
31
+ end
32
+ chars.upto(string.length).each do |index|
33
+ if string[index] == " " or string[index] == "\n" or string[index] == "\t"
34
+ return [clean(string[0..index-1])] + reflow(string[index+1..-1], chars)
35
+ end
36
+ end
37
+ return [clean(string)]
38
+ end
39
+ end
40
+
41
+ # Utility function for managing dates (2015-01-01) and partial dates (2015-05)
42
+ def year string
43
+ string.to_s[0..3]
44
+ end
45
+
46
+ def month string
47
+ string.to_s[5..6]
48
+ end
49
+
50
+ def day string
51
+ string.to_s[8..9]
52
+ end
53
+
54
+ def has_month input
55
+ if input.class == Date
56
+ true
57
+ else
58
+ input.size >= 7
59
+ end
60
+ end
61
+
62
+ def has_day input
63
+ if input.class == Date
64
+ true
65
+ else
66
+ input.size == 10
67
+ end
68
+ end
69
+
70
+ # Access hash keys like they were class methods
71
+ # hash["key"] -> hash.key
72
+ class Hash
73
+ def method_missing(m)
74
+ key = m.to_s
75
+
76
+ # error: nil value
77
+ if self.has_key? key and self[key] == nil
78
+ $stderr.puts "WARNING!! The value of key '#{key}' is nil in the following entry."
79
+ # $stderr.puts self.to_s
80
+ self.keys.each do |k|
81
+ $stderr.puts " #{k}: #{self[k]}"
82
+ end
83
+ $stderr.puts ""
84
+ end
85
+
86
+ return self[key] if self.has_key? key
87
+
88
+ # we get here if the key is not found
89
+ # we report an error, return "" and continue
90
+ # the actual mileage might vary
91
+
92
+ # more error reporting: key not found
93
+ $stderr.puts "ERROR!! Key '#{key}' not found in the following entry."
94
+ # $stderr.puts self.to_s
95
+ self.keys.each do |k|
96
+ $stderr.puts " #{k}: #{self[k]}"
97
+ end
98
+ $stderr.puts ""
99
+
100
+ return ""
101
+ end
102
+ end
103
+
@@ -0,0 +1,405 @@
1
+ <%
2
+ email = data.contacts.select { |x| x.label == "email" }.first
3
+ phones = data.contacts.select { |x|
4
+ ["phone", "mobile", "cell"].include?(x.label)
5
+ }
6
+ messaging = data.contacts.select { |x|
7
+ ["skype", "gtalk", "telegram", "whatsup"].include?(x.label)
8
+ }
9
+ address = data.addresses.select { |x| x.label == "home" }.first
10
+
11
+ # make a period (2015, 2015-10, 2015-01-01 into the date attributes day, month, year"
12
+ def period_tod period
13
+ el = period.to_s.split("-")
14
+ fields = ["year=\"%d\"", "month=\"--%02d\"", "day=\"---%02d\""]
15
+ el.each_with_index.map { |x, i| fields[i] % x.to_i }.join(" ")
16
+ end
17
+
18
+
19
+ %><?xml version="1.0" encoding="UTF-8"?>
20
+ <SkillsPassport xmlns="http://europass.cedefop.europa.eu/Europass" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://europass.cedefop.europa.eu/Europass http://europass.cedefop.europa.eu/xml/v3.3.0/EuropassSchema.xsd" locale="en">
21
+ <DocumentInfo>
22
+ <DocumentType>ECV</DocumentType>
23
+ <Bundle></Bundle>
24
+ <CreationDate><%= DateTime.now.iso8601 %></CreationDate>
25
+ <LastUpdateDate><%= DateTime.now.iso8601 %></LastUpdateDate>
26
+ <XSDVersion>V3.3</XSDVersion>
27
+ <Generator>resume.rb</Generator>
28
+ <Comment></Comment>
29
+ <Copyright>© European Communities | http://europass.cedefop.europa.eu</Copyright>
30
+ <EuropassLogo>false</EuropassLogo>
31
+ </DocumentInfo>
32
+ <!-- <PrintingPreferences> </PrintingPreferences> -->
33
+ <LearnerInfo>
34
+ <Identification>
35
+ <PersonName>
36
+ <Title>
37
+ <Code>dr</Code>
38
+ <Label><%= data.basics.title %></Label>
39
+ </Title>
40
+ <FirstName><%= data.basics.first_name %></FirstName>
41
+ <Surname><%= data.basics.last_name %></Surname>
42
+ </PersonName>
43
+ <ContactInfo>
44
+ <Address>
45
+ <Contact>
46
+ <AddressLine><%= address.street %></AddressLine>
47
+ <PostalCode><%= address.zip_code %></PostalCode>
48
+ <Municipality><%= address.city %></Municipality>
49
+ <Country>
50
+ <Code><%= address.country[0..1].upcase %></Code>
51
+ <Label><%= address.country %></Label>
52
+ </Country>
53
+ </Contact>
54
+ </Address>
55
+ <Email>
56
+ <Contact><%= email.value %></Contact>
57
+ </Email>
58
+ <TelephoneList>
59
+ <% phones.each do |phone| %>
60
+ <Telephone>
61
+ <Contact><%= phone.value %></Contact>
62
+ <Use>
63
+ <Code><%= phone.label %></Code>
64
+ <Label><%= phone.value %></Label>
65
+ </Use>
66
+ </Telephone>
67
+ <% end %>
68
+ </TelephoneList>
69
+ <WebsiteList>
70
+ <% data.web_presence.each do |web| %>
71
+ <Website>
72
+ <Contact><%= web.value %></Contact>
73
+ <Use>
74
+ <!-- <Code><%= web.label %></Code> -->
75
+ <Label><%= web.label.capitalize %></Label>
76
+ </Use>
77
+ </Website>
78
+ <% end %>
79
+ </WebsiteList>
80
+ <InstantMessagingList>
81
+ <% messaging.each do |im| %>
82
+ <InstantMessaging>
83
+ <Contact><%= im.value %></Contact>
84
+ <Use>
85
+ <!-- <Code><%= im.label %></Code> -->
86
+ <Label><%= im.label.capitalize %></Label>
87
+ </Use>
88
+ </InstantMessaging>
89
+ <% end %>
90
+ </InstantMessagingList>
91
+ <ContactMethodList>
92
+ <!-- other contacts not defined above -->
93
+ </ContactMethodList>
94
+ </ContactInfo>
95
+ <Demographics>
96
+ <Birthdate day="---<%= "%02d" % data.basics.birthdate.day %>" month="--<%= "%02d" % data.basics.birthdate.month %>" year="<%= data.basics.birthdate.year %>" />
97
+ <% if data.gender %>
98
+ <Gender>
99
+ <Code><%= data.gender %></Code>
100
+ <Label><%= data.gender == "M" ? "Male" : "Female" %></Label>
101
+ </Gender>
102
+ <% end %>
103
+ <NationalityList>
104
+ <Nationality>
105
+ <Label><%= data.basics.nationality %></Label>
106
+ </Nationality>
107
+ </NationalityList>
108
+ <!--
109
+ <Photo>
110
+ <MimeType>image/jpeg</MimeType>
111
+ <Data></Data>
112
+ <MetadataList>
113
+ <Metadata key="photo-dimensions" value="100x110"/>
114
+ </MetadataList>
115
+ </Photo>
116
+ <Signature>
117
+ <MimeType>image/jpeg</MimeType>
118
+ <Data></Data>
119
+ <MetadataList>
120
+ <Metadata key="signature-dimensions" value="250x150" />
121
+ </MetadataList>
122
+ </Signature>
123
+ -->
124
+ </Demographics>
125
+ </Identification>
126
+ <Headline>
127
+ <Description><Label><%= data.summary %></Label></Description>
128
+ </Headline>
129
+ <WorkExperienceList>
130
+ <% data.work.each do |pos| %>
131
+ <WorkExperience>
132
+ <Period>
133
+ <From <%= period_tod pos.from %>/>
134
+ <% if pos["till"] and pos.till != "" %>
135
+ <To <%= period_tod pos.from %>/>
136
+ <% else %>
137
+ <Current>true</Current>
138
+ <% end %>
139
+ </Period>
140
+ <!--
141
+ <Documentation>
142
+ <ReferenceTo idref="ATT_1"/>
143
+ </Documentation>
144
+ -->
145
+ <Position>
146
+ <Label><%= pos.role %></Label>
147
+ </Position>
148
+ <Activities>
149
+ <%= pos.summary %>
150
+ </Activities>
151
+ <Employer>
152
+ <Name><%= pos["who"] ? pos.who : "" %></Name>
153
+ <% if pos["address"] %>
154
+ <ContactInfo>
155
+ <Address>
156
+ <Contact>
157
+ <AddressLine><%= pos.address %></AddressLine>
158
+ <!-- <Country>
159
+ <Code></Code>
160
+ <Label></Label>
161
+ </Country> -->
162
+ </Contact>
163
+ </Address>
164
+ <Website>
165
+ <Contact><%= pos.website %></Contact>
166
+ </Website>
167
+ </ContactInfo>
168
+ <!--
169
+ <Sector>
170
+ <Code></Code>
171
+ <Label></Label>
172
+ </Sector>
173
+ -->
174
+ <% end %>
175
+ </Employer>
176
+ </WorkExperience>
177
+ <% end %>
178
+ <% data.teaching.each do |pos| %>
179
+ <WorkExperience>
180
+ <Period>
181
+ <From <%= period_tod pos.from %>/>
182
+ <% if pos["till"] and pos.till != "" %>
183
+ <To <%= period_tod pos.from %>/>
184
+ <% else %>
185
+ <Current>true</Current>
186
+ <% end %>
187
+ </Period>
188
+ <!--
189
+ <Documentation>
190
+ <ReferenceTo idref="ATT_1"/>
191
+ </Documentation>
192
+ -->
193
+ <Position>
194
+ <Label><%= pos.role %></Label>
195
+ </Position>
196
+ <Activities>
197
+ <%= pos.summary %>
198
+ </Activities>
199
+ <Employer>
200
+ <Name><%= pos.who + (pos["school"] ? pos.school : "") %></Name>
201
+ <% if pos["address"] %>
202
+ <ContactInfo>
203
+ <Address>
204
+ <Contact>
205
+ <AddressLine><%= pos.address %></AddressLine>
206
+ <!-- <Country>
207
+ <Code></Code>
208
+ <Label></Label>
209
+ </Country> -->
210
+ </Contact>
211
+ </Address>
212
+ <Website>
213
+ <Contact><%= pos["website"] %></Contact>
214
+ </Website>
215
+ </ContactInfo>
216
+ <!--
217
+ <Sector>
218
+ <Code></Code>
219
+ <Label></Label>
220
+ </Sector>
221
+ -->
222
+ <% end %>
223
+ </Employer>
224
+ </WorkExperience>
225
+ <% end %>
226
+ </WorkExperienceList>
227
+ <EducationList>
228
+ <% data.education.select { |x| x.publish }.each do |edu| %>
229
+ <Education>
230
+ <Period>
231
+ <From <%= period_tod edu.from %>/>
232
+ <To <%= period_tod edu.till %>/>
233
+ </Period>
234
+ <!--
235
+ <Documentation>
236
+ <ReferenceTo idref="ATT_1"/>
237
+ <ReferenceTo idref="ATT_2"/>
238
+ </Documentation>
239
+ -->
240
+ <Title><%= edu.degree %></Title>
241
+ <Activities></Activities>
242
+ <Organisation>
243
+ <Name><%= edu["school"] %></Name>
244
+ <ContactInfo>
245
+ <Address>
246
+ <Contact>
247
+ <AddressLine><%= edu.address %></AddressLine>
248
+ <!-- <Country>
249
+ <Code>US</Code>
250
+ <Label>United States</Label>
251
+ </Country>
252
+ -->
253
+ </Contact>
254
+ </Address>
255
+ </ContactInfo>
256
+ </Organisation>
257
+ </Education>
258
+ <% end %>
259
+ </EducationList>
260
+ <Skills>
261
+ <% if data.languages %>
262
+ <Linguistic>
263
+ <% if data.mother_tongues %>
264
+ <MotherTongueList>
265
+ <% data.mother_tongues.each do |mt| %>
266
+ <MotherTongue>
267
+ <Description>
268
+ <Code><%= mt.code %></Code>
269
+ <Label><% mt.language %></Label>
270
+ </Description>
271
+ </MotherTongue>
272
+ <% end %>
273
+ </MotherTongueList>
274
+ <% end %>
275
+ <% if data.foreign %>
276
+ <ForeignLanguageList>
277
+ <% data.foreign.each do |language| %>
278
+ <ForeignLanguage>
279
+ <Description>
280
+ <Code><%= language.code %></Code><Label><%= language.language %></Label>
281
+ </Description>
282
+ <ProficiencyLevel>
283
+ <Listening>
284
+ <%= language.listening %>
285
+ </Listening>
286
+ <Reading>
287
+ <%= language.reading %>
288
+ </Reading>
289
+ <SpokenInteraction>
290
+ <%= language.spoken_interaction %>
291
+ </SpokenInteraction>
292
+ <SpokenProduction>
293
+ <%= language.spoken_production %>
294
+ </SpokenProduction>
295
+ <Writing>
296
+ <%= language.writing %>
297
+ </Writing>
298
+ </ProficiencyLevel>
299
+ </ForeignLanguage>
300
+ <% end %>
301
+ </ForeignLanguageList>
302
+ <% end %>
303
+ </Linguistic>
304
+ <% end %>
305
+ <!--
306
+ <Communication>
307
+ <Description></Description>
308
+ <Documentation></Documentation>
309
+ </Communication>
310
+ <Organisational>
311
+ <Description></Description>
312
+ <Documentation></Documentation>
313
+ </Organisational>
314
+ <JobRelated>
315
+ <Description></Description>
316
+ <Documentation></Documentation>
317
+ </JobRelated>
318
+ <Computer>
319
+ <Description></Description>
320
+ <ProficiencyLevel></ProficiencyLevel>
321
+ <VerifiedBy>
322
+ <Certificate><Title></Title></Certificate>
323
+ </VerifiedBy>
324
+ <Documentation></Documentation>
325
+ </Computer>
326
+ -->
327
+ <% if data.driving %>
328
+ <Driving>
329
+ <Description>
330
+ <% data.driving.each do |license| %>
331
+ <Licence><%= license.license %></Licence>
332
+ <% end %>
333
+ </Description>
334
+ </Driving>
335
+ <% end %>
336
+ <Other>
337
+ <Description>
338
+ <% [[:volunteer, "Volunteering Work"], [:interests]
339
+ <% if data.volunteer %>
340
+ <p><b>Volunteering Work</b></p>
341
+ <% data.volunteer.each do |v| %>
342
+
343
+ <% end %>
344
+ <% end %>
345
+ </Description>
346
+ </Other>
347
+ </Skills>
348
+ <AchievementList>
349
+ <% data.awards.each do |award| %>
350
+ <Achievement>
351
+ <Title>
352
+ <Label><%= award.title %></Label>
353
+ </Title>
354
+ <Description>
355
+ <%= award.summary %>
356
+ (<%= achievement.who %>, <%= achievement.where %>, <%= achievement.date %>)
357
+ </Description>
358
+ </Achievement>
359
+ <% end %>
360
+ <% data.achievements.each do |achievement| %>
361
+ <Achievement>
362
+ <Title>
363
+ <Label><%= achievement.title %></Label>
364
+ </Title>
365
+ <Description>
366
+ <%= achievement.summary %>
367
+ (<%= achievement.who %>, <%= achievement.where %>, <%= achievement.date %>)
368
+ </Description>
369
+ </Achievement>
370
+ <% end %>
371
+ <% if data.projects %>
372
+ <Achievement>
373
+ <Title>
374
+ <Code>projects</Code>
375
+ <Label>Projects</Label>
376
+ </Title>
377
+ <Description>
378
+ <%= data.projects.each.map { |x|
379
+ "#{x.name} (#{x.who}): #{x.role} (#{x.from}--#{x.till})"
380
+ }.join("; ") %>
381
+ </Description>
382
+ </Achievement>
383
+ <% end %>
384
+ <% if data.publications %>
385
+ <Achievement>
386
+ <Title>
387
+ <Code>publications</Code>
388
+ <Label>Publications</Label>
389
+ </Title>
390
+ <Description>
391
+ <%= data.publications.each.map { |x|
392
+ [x.title, x.authors, x.publisher, x.date].join(", ")
393
+ }.join("; ") %>
394
+ </Description>
395
+ </Achievement>
396
+ <% end %>
397
+ </AchievementList>
398
+ <Documentation>
399
+ </Documentation>
400
+ </LearnerInfo>
401
+ <!--
402
+ <AttachmentList>
403
+ </AttachmentList>
404
+ -->
405
+ </SkillsPassport>