resme 1.0.1 → 2.0.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.
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Resme
4
+ #
5
+ # Export to JSON resume
6
+ #
7
+ class JsonResume
8
+ include Helper
9
+
10
+ def initialize(document)
11
+ @document = document
12
+ @data = document.data
13
+ end
14
+
15
+ def build
16
+ address = @data[:addresses]&.first || {}
17
+
18
+ {
19
+ "basics": {
20
+ "name": full_name(@data),
21
+ "label": @data[:basics][:title],
22
+ "image": "",
23
+ "email": select(@data[:contacts], label: :email),
24
+ "phone": select(@data[:contacts], label: :phone),
25
+ "url": select(@data[:web_presence], label: :url),
26
+ "summary": @data[:summary],
27
+ "location": {
28
+ "address": address[:street],
29
+ "postalCode": address[:postal_code].to_s,
30
+ "city": address[:city],
31
+ "countryCode": address[:country_code],
32
+ "region": address[:region]
33
+ }.compact,
34
+ "profiles": @data[:web_presence].map do |kv|
35
+ {
36
+ "network": kv[:label],
37
+ "username": kv[:value],
38
+ # "url":
39
+ }
40
+ end.compact
41
+ }.compact,
42
+
43
+ "work": @data[:work].map do |job|
44
+ {
45
+ "name": job[:name],
46
+ "position": job[:position],
47
+ "url": job[:url],
48
+ "startDate": complete_date(job[:date] || job[:start_date]),
49
+ "endDate": complete_date(job[:date] || job[:end_date]),
50
+ "summary": job[:summary],
51
+ "highlights": split_highlights(job[:details])
52
+ }.compact
53
+ end,
54
+
55
+ "volunteer": (@data[:volunteer] || []).map do |job|
56
+ {
57
+ "organization": job[:name],
58
+ "position": job[:position],
59
+ "startDate": complete_date(job[:date] || job[:start_date]),
60
+ "endDate": complete_date(job[:date] || job[:end_date]),
61
+ "summary": job[:summary],
62
+ "highlights": split_highlights(job[:details])
63
+ }.compact
64
+ end,
65
+
66
+ "education": (@data[:education].select { |x| x[:publish] } || []).map do |job|
67
+ {
68
+ "institution": job[:school],
69
+ "url": job[:url],
70
+ "area": job[:topic],
71
+ "studyType": job[:degree],
72
+ "startDate": complete_date(job[:date] || job[:start_date]),
73
+ "endDate": complete_date(job[:date] || job[:end_date]),
74
+ "score": job[:score],
75
+ "courses": []
76
+ }.compact
77
+ end,
78
+
79
+ "awards": (@data[:awards] || []).map do |job|
80
+ {
81
+ "title": job[:title],
82
+ "date": complete_date(job[:date]),
83
+ "awarder": job[:name],
84
+ "summary": job[:summary]
85
+ }.compact
86
+ end,
87
+
88
+ "certificates": [],
89
+
90
+ "publications": (@data[:publications] || []).map do |job|
91
+ {
92
+ "name": [job[:title], job[:authors]].compact.join(", "),
93
+ "publisher": job[:publisher],
94
+ "releaseDate": complete_date(job[:date]),
95
+ "url": job[:url],
96
+ "summary": ""
97
+ }.compact
98
+ end,
99
+
100
+ "skills": (@data[:skills] || []).map do |job|
101
+ {
102
+ "name": job[:name],
103
+ "level": job[:level],
104
+ "keywords": split_highlights(job[:summary])
105
+ }.compact
106
+ end,
107
+
108
+ "languages": (@data.dig(:languages, :mother_tongues) || []).map do |job|
109
+ {
110
+ "language": job[:language],
111
+ "fluency": "Native speaker"
112
+ }.compact
113
+ end + (@data.dig(:languages, :foreign) || []).map do |job|
114
+ {
115
+ "language": job[:language],
116
+ "fluency": job[:level]
117
+ }.compact
118
+ end,
119
+
120
+ "interests": (@data[:interests] || []).map do |job|
121
+ {
122
+ "name": job[:name],
123
+ "keywords": split_highlights(job[:summary])
124
+ }.compact
125
+ end,
126
+
127
+ "references": (@data[:references] || []).map do |job|
128
+ {
129
+ "name": job[:name],
130
+ "reference": job[:reference]
131
+ }.compact
132
+ end,
133
+
134
+ "projects": (@data[:projects] || []).map do |job|
135
+ {
136
+ "name": job[:name],
137
+ "url": job[:url],
138
+ "startDate": complete_date(job[:date] || job[:start_date]),
139
+ "endDate": complete_date(job[:date] || job[:end_date]),
140
+ "description": job[:summary],
141
+ "highlights": []
142
+ }.compact
143
+ end
144
+ }.compact
145
+ end
146
+
147
+ private
148
+
149
+ # make a string with an itemized list into an array of the items
150
+ def split_highlights(highlights)
151
+ (highlights || "").split(/^ *- /)
152
+ .map { |x| x.gsub("\n", "") }
153
+ .reject { |x| x == "" }
154
+ end
155
+ end
156
+ end
data/lib/resme/version.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Version number
4
3
  module Resme
5
- VERSION = "1.0.1"
4
+ VERSION = "2.0.0"
6
5
  end
data/lib/resme.rb CHANGED
@@ -1,5 +1,20 @@
1
- require "resme/version"
2
- require "resme/renderer/renderer"
3
- require "resme/cli/resume_structure_validator"
4
- require "resme/cli/command_syntax"
5
- require "resme/cli/command_semantics"
1
+ # frozen_string_literal: true
2
+
3
+ require "classy_hash"
4
+ require "date"
5
+ require "erb"
6
+ require "fileutils"
7
+ require "json"
8
+ require "optionparser"
9
+ require "yaml"
10
+
11
+ require_relative "resme/version"
12
+ require_relative "resme/helper"
13
+
14
+ require_relative "resme/cli"
15
+ require_relative "resme/document"
16
+ require_relative "resme/document_validator"
17
+ require_relative "resme/json_resume"
18
+ require_relative "resme/executor"
19
+ require_relative "resme/version"
20
+
data/sig/resme.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Resme
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
@@ -0,0 +1 @@
1
+ <%= JSON.pretty_generate @json_resume %>
data/templates/org.erb ADDED
@@ -0,0 +1,217 @@
1
+ #+TITLE: Curriculum Vitae
2
+ #+AUTHOR: <%= full_name @data %>, <%= @data[:basics][:title] %>
3
+ #+EMAIL: <%= select @data[:contacts], label: :email %>
4
+ #+DATE: <<%= Date.today %>>
5
+ #+STARTUP: showall
6
+ #+OPTIONS: toc:nil num:nil
7
+ #+OPTIONS: h:1
8
+ #+OPTIONS: prop:nil
9
+
10
+ <% if @data[:addresses] || @data[:contacts] || @data[:web_presence] %>
11
+ * Contacts
12
+ :PROPERTIES:
13
+ <% (@data[:addresses] || []).each do |x| -%>
14
+ <%= ":#{x[:label].upcase}: #{x[:street]}, #{x[:postal_code]} #{x[:city]}" %>
15
+ <% end -%>
16
+ <% (@data[:contacts] || []).each do |x| -%>
17
+ <%= ":#{x[:label].upcase}: #{x[:value]}" %>
18
+ <% end -%>
19
+ :END:
20
+
21
+ <% (@data[:contacts] || []).each do |x| -%>
22
+ | <%= "%-30s" % x[:label] %> | <%= "%-40s" % x[:value] %> |
23
+ <% end -%>
24
+ <% (@data[:web_presence] || []).each do |x| -%>
25
+ | <%= "%-30s" % x[:label] %> | <%= "%-40s" % x[:value] %> |
26
+ <% end -%>
27
+ <% end -%>
28
+
29
+ <% if @data[:summary] -%>
30
+ * Summary
31
+
32
+ <%= reflow_s @data[:summary] -%>
33
+ <% end -%>
34
+
35
+ <% if @data[:skills] -%>
36
+ * Skills
37
+
38
+ <% (@data[:skills] || []).each do |item| -%>
39
+ ** <%= item[:name] %>: <%= item[:level] %>
40
+ <%= propertify item %>
41
+
42
+ <% end %>
43
+ <% end -%>
44
+
45
+ <% if @data[:work] -%>
46
+ * Work Experience
47
+
48
+ <% (@data[:work] || []).each do |item| -%>
49
+ ** <%= period item %>: <%= clean [item[:position], item[:name]].join(", ") %>
50
+ <%= propertify item %>
51
+
52
+ <%= reflow_s item[:summary] -%>
53
+
54
+ <% end -%>
55
+ <% end -%>
56
+
57
+ <% if @data[:teaching] -%>
58
+ * Teaching
59
+
60
+ <% (@data[:teaching] || []).each do |item| -%>
61
+
62
+ ** <%= period item %>: <%= item[:subject] %>
63
+ <%= propertify item %>
64
+
65
+ <%- string = [item[:position], item[:school], item[:name]].compact.join(", ") %>
66
+ <%= reflow_s string %>
67
+
68
+ <% end -%>
69
+ <% end -%>
70
+
71
+ <% if @data[:projects] -%>
72
+ * Projects
73
+
74
+ <% (@data[:projects] || []).each do |item| -%>
75
+
76
+ ** <%= period item %>: <%= [item[:name], item[:position]].join(", ") %>
77
+ <%= propertify item %>
78
+
79
+ <%= reflow_s item[:summary] -%>
80
+
81
+ <% end -%>
82
+ <% end -%>
83
+
84
+ <% if @data[:other] -%>
85
+ * Other
86
+
87
+ <% (@data[:other] || []).each do |item| -%>
88
+
89
+ ** <%= period item %>: <%= [item[:name], item[:position]].join(", ") %>
90
+ <%= propertify item %>
91
+
92
+ <%= reflow_s item[:summary] -%>
93
+
94
+ <% end -%>
95
+ <% end -%>
96
+
97
+ <% if @data[:committees] -%>
98
+ * Committees
99
+
100
+ <% (@data[:committees] || []).each do |item| -%>
101
+
102
+ ** <%= item[:name] %>, <%= item[:position] %> <%= item[:editions] %>
103
+ <%= propertify item %>
104
+
105
+ <% end -%>
106
+ <% end -%>
107
+
108
+ <% if @data[:volunteer] -%>
109
+ * Volunteer
110
+
111
+ <% (@data[:volunteer] || []).each do |item| -%>
112
+
113
+ ** *<%= period item %>: <%= [item[:position], item[:name]].join(", ") %>*
114
+ <%= propertify item %>
115
+
116
+ <%= reflow_s item[:summary] -%>
117
+
118
+ <% end -%>
119
+ <% end -%>
120
+
121
+ <% if @data[:publications] -%>
122
+ * Publications
123
+
124
+ <% (@data[:publications] || []).each do |item| -%>
125
+ - <%= item[:authors] %>, *"<%= item[:title] %>"*
126
+ <%= item[:publisher] %>, <%= item[:date] %>
127
+ <% end -%>
128
+ <% end -%>
129
+
130
+ <% if @data[:talks] -%>
131
+ * Talks
132
+
133
+ <% (@data[:talks] || []).each do |item| -%>
134
+ - <%= item[:title] %>
135
+ <%= item[:venue] %>
136
+ (<%= item[:date] %>)
137
+ <% end -%>
138
+ <% end -%>
139
+
140
+ <% if @data[:visits] -%>
141
+ * Visits
142
+
143
+ <% (@data[:visits] || []).each do |item| -%>
144
+
145
+ ** *<%= period item %>: <%= [item[:position], item[:name], item[:address]].join(", ") %>*
146
+ <%= propertify item %>
147
+
148
+ <%= reflow_s item[:summary] -%>
149
+
150
+ <% end -%>
151
+ <% end -%>
152
+
153
+ <% if @data[:education] -%>
154
+ * Education
155
+
156
+ <% @data[:education].select { |x| x[:publish] }.each do |item| -%>
157
+
158
+ ** *<%= year(item[:end_date]) %>: <%= [item[:degree], item[:school], item[:address]].join(", ") %>*
159
+ <%= propertify item %>
160
+
161
+ <% end -%>
162
+ <% end -%>
163
+
164
+ <% [:awards, :achievements].each do |group| -%>
165
+ <% if @data[group] -%>
166
+ * <%= group.capitalize %>
167
+
168
+ <% (group || []).each do |item| -%>
169
+
170
+ ** <%= item[:date] %>: <%= [item[:title], item[:name], item[:address]].join(", ") %>
171
+ <%= propertify item %>
172
+
173
+ <%= reflow_s item[:summary] -%>
174
+
175
+ <% end -%>
176
+ <% end -%>
177
+ <% end -%>
178
+
179
+ <% if @data[:software] %>
180
+ * Software
181
+
182
+ <% (@data[:software] || []).each do |item| -%>
183
+ - <%= item[:title] %> (<%= item[:position] %>)
184
+ <%= item[:url] %>
185
+ <% end -%>
186
+ <% end -%>
187
+
188
+ <% if @data[:interests] -%>
189
+ * Interests
190
+
191
+ <% (@data[:interests] || []).each do |item| -%>
192
+ - *<%= item[:name] %>:* <%= reflow_s item[:summary] %>
193
+ <% end -%>
194
+ <% end -%>
195
+
196
+ <% if @data[:languages] %>
197
+ * Languages
198
+
199
+ <% if @data[:languages] and @data[:languages][:mother_tongues] -%>
200
+ - Mother Tongue(s): <%= @data[:languages][:mother_tongues].map { |x| x[:language] }.join(",") %>
201
+ <% end -%>
202
+ <% if @data[:languages] and @data[:languages][:foreign] -%>
203
+ - Other Language(s):
204
+ <% @data[:languages][:foreign].each do |x| -%>
205
+ + <%= x[:language] %>: <%= x[:level] %>
206
+ <% end -%>
207
+ <% end -%>
208
+ <% end -%>
209
+
210
+ <% if @data[:references] %>
211
+ * References
212
+
213
+ <% (@data[:references] || []).each do |item| -%>
214
+ <%= item[:name] %>:
215
+ <%= reflow_s item[:reference], indent: 0 %>
216
+ <% end -%>
217
+ <% end -%>
@@ -41,8 +41,10 @@ contacts:
41
41
  addresses:
42
42
  - label:
43
43
  street:
44
- zip_code:
44
+ postal_code:
45
45
  city:
46
+ region:
47
+ country_code:
46
48
  country:
47
49
 
48
50
  # this is your presence on the net
@@ -56,6 +58,8 @@ web_presence:
56
58
  #
57
59
  # if you write a multi-line entry don't forget to use ">-" or "|-"
58
60
  # (see the YAML documentation for more information)
61
+ #
62
+ # |- has the advntage of preserving paragraphs.
59
63
  summary:
60
64
 
61
65
  #
@@ -69,24 +73,24 @@ summary:
69
73
 
70
74
  # work experience
71
75
  work:
72
- - who:
73
- website:
76
+ - name:
77
+ url:
74
78
  address:
75
- till:
76
- from:
77
- role:
79
+ end_date:
80
+ start_date:
81
+ position:
78
82
  summary:
79
83
  details:
80
84
 
81
85
  # teaching experience
82
86
  teaching:
83
- - who:
87
+ - name:
84
88
  school:
85
89
  address:
86
- role:
90
+ position:
87
91
  subject:
88
- till:
89
- from:
92
+ end_date:
93
+ start_date:
90
94
  summary:
91
95
  details:
92
96
 
@@ -94,42 +98,42 @@ teaching:
94
98
  projects:
95
99
  - name:
96
100
  size:
97
- who:
98
- role:
99
- from:
100
- till:
101
+ stakeholder:
102
+ position:
103
+ start_date:
104
+ end_date:
101
105
  summary:
102
106
 
103
107
  # other experiences
104
108
  other:
105
- - who:
106
- till:
107
- from:
108
- role:
109
+ - name:
110
+ end_date:
111
+ start_date:
112
+ position:
109
113
  summary:
110
114
 
111
115
  # participation to committees (e.g. program committees in conferences)
112
116
  committees:
113
- - who:
114
- role:
117
+ - name:
118
+ position:
115
119
  editions:
116
120
  url:
117
121
 
118
122
  # work as volunteer
119
123
  volunteer:
120
- - who:
121
- till:
122
- from:
123
- role:
124
+ - name:
125
+ end_date:
126
+ start_date:
127
+ position:
124
128
  summary:
125
129
 
126
130
  # mobility programs and other similar initiatives (e.g., Erasmus grants)
127
131
  visits:
128
- - who:
132
+ - name:
129
133
  address:
130
- role:
131
- till:
132
- from:
134
+ position:
135
+ end_date:
136
+ start_date:
133
137
  summary:
134
138
 
135
139
  # education and degrees
@@ -139,8 +143,9 @@ education:
139
143
  topic:
140
144
  school:
141
145
  address:
142
- till:
143
- from:
146
+ end_date:
147
+ start_date:
148
+ url:
144
149
  publish: yes
145
150
 
146
151
  # publications
@@ -160,7 +165,7 @@ talks:
160
165
 
161
166
  # any award
162
167
  awards:
163
- - who:
168
+ - name:
164
169
  address:
165
170
  date:
166
171
  title:
@@ -168,7 +173,7 @@ awards:
168
173
 
169
174
  # any interesting achievement you want to highlight?
170
175
  achievements:
171
- - who:
176
+ - name:
172
177
  address:
173
178
  date:
174
179
  title:
@@ -181,7 +186,7 @@ software:
181
186
  url:
182
187
  programming_language:
183
188
  license:
184
- role:
189
+ position:
185
190
  summary:
186
191
 
187
192
  # what are your skills?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adolfo Villafiorita
@@ -13,44 +13,16 @@ dependencies:
13
13
  name: classy_hash
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 1.0.0
18
+ version: '0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - "~>"
23
+ - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 1.0.0
26
- - !ruby/object:Gem::Dependency
27
- name: bundler
28
- requirement: !ruby/object:Gem::Requirement
29
- requirements:
30
- - - "~>"
31
- - !ruby/object:Gem::Version
32
- version: 2.3.20
33
- type: :development
34
- prerelease: false
35
- version_requirements: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: 2.3.20
40
- - !ruby/object:Gem::Dependency
41
- name: rake
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: 13.0.6
47
- type: :development
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: 13.0.6
25
+ version: '0'
54
26
  description: 'This gem allows you to manage your resume in YAML, while providing different
55
27
  backends for publishings. Supported backends: Org Mode, Markdown, JSON resume,
56
28
  and Europass XML. Custom templates can be defined using ERB.'
@@ -61,33 +33,31 @@ executables:
61
33
  extensions: []
62
34
  extra_rdoc_files: []
63
35
  files:
64
- - ".gitignore"
65
36
  - CHANGELOG.org
66
- - Gemfile
67
- - Gemfile.lock
37
+ - CODE_OF_CONDUCT.org
68
38
  - LICENSE.txt
69
39
  - README.org
70
40
  - Rakefile
71
- - bin/console
72
- - bin/setup
41
+ - TAGS
73
42
  - exe/resme
74
43
  - lib/resme.rb
75
- - lib/resme/cli/command_semantics.rb
76
- - lib/resme/cli/command_syntax.rb
77
- - lib/resme/cli/resume_structure_validator.rb
78
- - lib/resme/renderer/renderer.rb
79
- - lib/resme/templates/resume.json.erb
80
- - lib/resme/templates/resume.md.erb
81
- - lib/resme/templates/resume.org.erb
82
- - lib/resme/templates/resume.yml
44
+ - lib/resme/cli.rb
45
+ - lib/resme/document.rb
46
+ - lib/resme/document_validator.rb
47
+ - lib/resme/executor.rb
48
+ - lib/resme/helper.rb
49
+ - lib/resme/json_resume.rb
83
50
  - lib/resme/version.rb
84
- - resme.gemspec
85
- homepage: http://github.io/avillafiorita/resme
51
+ - sig/resme.rbs
52
+ - templates/json.erb
53
+ - templates/org.erb
54
+ - templates/resume.yml
55
+ homepage: https://github.com/avillafiorita/resme
86
56
  licenses:
87
57
  - MIT
88
58
  metadata:
89
59
  allowed_push_host: https://rubygems.org/
90
- homepage_uri: http://github.io/avillafiorita/resme
60
+ homepage_uri: https://github.com/avillafiorita/resme
91
61
  source_code_uri: https://github.com/avillafiorita/resme
92
62
  changelog_uri: https://github.com/avillafiorita/resme/CHANGELOG.org
93
63
  rdoc_options: []
@@ -97,15 +67,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
67
  requirements:
98
68
  - - ">="
99
69
  - !ruby/object:Gem::Version
100
- version: 2.3.0
70
+ version: 3.2.0
101
71
  required_rubygems_version: !ruby/object:Gem::Requirement
102
72
  requirements:
103
73
  - - ">="
104
74
  - !ruby/object:Gem::Version
105
75
  version: '0'
106
76
  requirements: []
107
- rubygems_version: 3.6.7
77
+ rubygems_version: 3.6.9
108
78
  specification_version: 4
109
- summary: Write a resume in YML and export to various formats, including json and europass
110
- XML.
79
+ summary: Keep your resume in YML and export to various formats
111
80
  test_files: []
data/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/