linkedin2cv 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.buildpacks +2 -0
- data/.bundle/config +1 -0
- data/.gitignore +7 -0
- data/.node +1 -0
- data/.travis.yml +21 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +119 -0
- data/Procfile +3 -0
- data/README.md +32 -0
- data/Rakefile +6 -0
- data/Vagrantfile +16 -0
- data/app/routes/api.rb +101 -0
- data/app/routes/web.rb +132 -0
- data/app/views/hello.erb +36 -0
- data/app/views/home.erb +12 -0
- data/app/views/index.haml +11 -0
- data/app.rb +26 -0
- data/config.ru +6 -0
- data/config.yml +31 -0
- data/lib/linkedin2cv/cli/command.rb +46 -0
- data/lib/linkedin2cv/converter.rb +116 -0
- data/lib/linkedin2cv/logging.rb +35 -0
- data/lib/linkedin2cv/renderer/latex_renderer.rb +64 -0
- data/lib/linkedin2cv/version.rb +3 -0
- data/linkedin2cv.gemspec +49 -0
- data/public/.bowerrc +3 -0
- data/public/.editorconfig +21 -0
- data/public/.gitattributes +1 -0
- data/public/.gitignore +5 -0
- data/public/.jshintrc +24 -0
- data/public/.travis.yml +7 -0
- data/public/Gruntfile.js +487 -0
- data/public/app/.buildignore +1 -0
- data/public/app/.htaccess +543 -0
- data/public/app/404.html +157 -0
- data/public/app/favicon.ico +0 -0
- data/public/app/images/yeoman.png +0 -0
- data/public/app/index.html +73 -0
- data/public/app/robots.txt +3 -0
- data/public/app/scripts/app.js +20 -0
- data/public/app/scripts/controllers/main.js +21 -0
- data/public/app/scripts/services/linkedin2cv.js +93 -0
- data/public/app/styles/main.scss +95 -0
- data/public/app/views/main.html +23 -0
- data/public/bower.json +19 -0
- data/public/karma-e2e.conf.js +54 -0
- data/public/karma.conf.js +56 -0
- data/public/package.json +41 -0
- data/public/test/.jshintrc +36 -0
- data/public/test/runner.html +10 -0
- data/public/test/spec/controllers/main.js +22 -0
- data/public/test/spec/services/happyapi.js +18 -0
- data/public/test/spec/services/happyservice.js +18 -0
- data/spec/converter_spec.rb +83 -0
- data/spec/mocks/config.yml +31 -0
- data/spec/mocks/profile.json +866 -0
- data/spec/spec_helper.rb +13 -0
- data/templates/cv.erb +327 -0
- data/templates/foo.asciidoc +11 -0
- data/templates/foo.latex +230 -0
- data/test.rb +109 -0
- data/test.sh +6 -0
- data/teust.rb +75 -0
- metadata +434 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d62bfd1c1f730f996da843ce11a63b400f3c7cbb
|
4
|
+
data.tar.gz: 72139b2c8f2d664429de8b33c876ade5463207ba
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d18f5df837e060d5b5fb79bff0ec69b2c50fda290e2f9027d2aa78e3e38355cb6f0e6f0f3494648194601943f0180bbe0d8e1f442b394000990781ed9d8d2f03
|
7
|
+
data.tar.gz: 8f918db4c0368dcac90545a67222c7654bb6d0f66da04b1bb9827ac1ebc4667da39999c61dd0e844950671fbf4d0095dfa3a85d7308e7d17ab7600f6ff9614d7
|
data/.buildpacks
ADDED
data/.bundle/config
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--- {}
|
data/.gitignore
ADDED
data/.node
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
public
|
data/.travis.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.8.7
|
4
|
+
- 1.9.2
|
5
|
+
- 1.9.3
|
6
|
+
- 2.1.1
|
7
|
+
- 2.1.0
|
8
|
+
deploy:
|
9
|
+
- provider: heroku
|
10
|
+
api_key:
|
11
|
+
secure: Lv2f5VTR98m6pAcdE2g6mZKxr3bfNmY8hQtF5ItLdijWjX0G3P+fVPvtIfeBlYtmJAblHIItVpANnjpBL1M/Bi4HT77VDnKI9Ss2paah6fppkO+6LIWkR0pOHUxSTGNkHF7x7uRtu1/GPRHu/yysnnFJKQoWTtbMcXlU6n5hGK0=
|
12
|
+
app: linkedin2cv -generator
|
13
|
+
on:
|
14
|
+
repo: mefellows/linkedin2cv -generator
|
15
|
+
- provider: rubygems
|
16
|
+
api_key:
|
17
|
+
secure: Db23e9FQhY3Re/UEs0nvR+Gn6ji0sO4jnTO+FY6m69LhAcAL4Sfs4kSP287h70HCi/dCYvgTPrzR8R3ihPthBAjCBVVJ/SHeP25k8zfJAtMhFI+9Rvgas0jFfQFA4jTyLqMUeZZQsH6YnPRYcayHMzl53inRTWlSlnvUXQWoKEA=
|
18
|
+
gem: linkedin2cv -generator
|
19
|
+
on:
|
20
|
+
tags: true
|
21
|
+
repo: mefellows/linkedin2cv -generator
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
linkedin2cv (0.0.1)
|
5
|
+
asciidoctor
|
6
|
+
clamp
|
7
|
+
dotenv
|
8
|
+
em-websocket (= 0.3.6)
|
9
|
+
eventmachine
|
10
|
+
foreman
|
11
|
+
haml
|
12
|
+
json
|
13
|
+
launchy
|
14
|
+
linkedin-oauth2
|
15
|
+
log4r
|
16
|
+
rake
|
17
|
+
rspec
|
18
|
+
sinatra
|
19
|
+
sinatra-contrib
|
20
|
+
sinatra-param
|
21
|
+
sinatra-websocket
|
22
|
+
thin
|
23
|
+
tilt
|
24
|
+
|
25
|
+
GEM
|
26
|
+
remote: https://rubygems.org/
|
27
|
+
specs:
|
28
|
+
addressable (2.3.6)
|
29
|
+
asciidoctor (0.1.4)
|
30
|
+
backports (3.6.0)
|
31
|
+
clamp (0.6.3)
|
32
|
+
crack (0.4.2)
|
33
|
+
safe_yaml (~> 1.0.0)
|
34
|
+
daemons (1.1.9)
|
35
|
+
diff-lcs (1.2.5)
|
36
|
+
dotenv (0.11.1)
|
37
|
+
dotenv-deployment (~> 0.0.2)
|
38
|
+
dotenv-deployment (0.0.2)
|
39
|
+
em-websocket (0.3.6)
|
40
|
+
addressable (>= 2.1.1)
|
41
|
+
eventmachine (>= 0.12.9)
|
42
|
+
eventmachine (1.0.3)
|
43
|
+
faraday (0.9.0)
|
44
|
+
multipart-post (>= 1.2, < 3)
|
45
|
+
foreman (0.71.0)
|
46
|
+
dotenv (~> 0.11.1)
|
47
|
+
thor (~> 0.19.1)
|
48
|
+
haml (4.0.5)
|
49
|
+
tilt
|
50
|
+
hashie (2.0.5)
|
51
|
+
json (1.8.1)
|
52
|
+
jwt (1.0.0)
|
53
|
+
launchy (2.4.2)
|
54
|
+
addressable (~> 2.3)
|
55
|
+
linkedin-oauth2 (0.1.1)
|
56
|
+
hashie (>= 1.2, < 2.1)
|
57
|
+
multi_json (~> 1.0)
|
58
|
+
oauth2 (~> 0.8)
|
59
|
+
log4r (1.1.10)
|
60
|
+
multi_json (1.10.1)
|
61
|
+
multi_xml (0.5.5)
|
62
|
+
multipart-post (2.0.0)
|
63
|
+
oauth2 (0.9.4)
|
64
|
+
faraday (>= 0.8, < 0.10)
|
65
|
+
jwt (~> 1.0)
|
66
|
+
multi_json (~> 1.3)
|
67
|
+
multi_xml (~> 0.5)
|
68
|
+
rack (~> 1.2)
|
69
|
+
rack (1.5.2)
|
70
|
+
rack-protection (1.5.3)
|
71
|
+
rack
|
72
|
+
rack-test (0.6.2)
|
73
|
+
rack (>= 1.0)
|
74
|
+
rake (10.3.2)
|
75
|
+
rspec (2.99.0)
|
76
|
+
rspec-core (~> 2.99.0)
|
77
|
+
rspec-expectations (~> 2.99.0)
|
78
|
+
rspec-mocks (~> 2.99.0)
|
79
|
+
rspec-core (2.99.0)
|
80
|
+
rspec-expectations (2.99.0)
|
81
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
82
|
+
rspec-mocks (2.99.0)
|
83
|
+
safe_yaml (1.0.3)
|
84
|
+
sinatra (1.4.5)
|
85
|
+
rack (~> 1.4)
|
86
|
+
rack-protection (~> 1.4)
|
87
|
+
tilt (~> 1.3, >= 1.3.4)
|
88
|
+
sinatra-contrib (1.4.2)
|
89
|
+
backports (>= 2.0)
|
90
|
+
multi_json
|
91
|
+
rack-protection
|
92
|
+
rack-test
|
93
|
+
sinatra (~> 1.4.0)
|
94
|
+
tilt (~> 1.3)
|
95
|
+
sinatra-param (1.2.2)
|
96
|
+
sinatra (~> 1.3)
|
97
|
+
sinatra-websocket (0.3.0)
|
98
|
+
em-websocket (~> 0.3.6)
|
99
|
+
eventmachine
|
100
|
+
thin (>= 1.3.1)
|
101
|
+
thin (1.6.2)
|
102
|
+
daemons (>= 1.0.9)
|
103
|
+
eventmachine (>= 1.0.0)
|
104
|
+
rack (>= 1.0.0)
|
105
|
+
thor (0.19.1)
|
106
|
+
tilt (1.4.1)
|
107
|
+
webmock (1.18.0)
|
108
|
+
addressable (>= 2.3.6)
|
109
|
+
crack (>= 0.3.2)
|
110
|
+
|
111
|
+
PLATFORMS
|
112
|
+
ruby
|
113
|
+
|
114
|
+
DEPENDENCIES
|
115
|
+
bundler
|
116
|
+
linkedin2cv!
|
117
|
+
rake
|
118
|
+
rspec
|
119
|
+
webmock
|
data/Procfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
LinkedIn 2 CV
|
2
|
+
==============
|
3
|
+
|
4
|
+
Turn your LinkedIn Profile into a professional resume in many formats (PDF / HTML5 / Latex / Asciidoc)
|
5
|
+
|
6
|
+
## Motivations
|
7
|
+
|
8
|
+
Everyone stalks you on LinkedIn and that's where you get opportunities. But apparently you still need to give a resume/CV before you have your next job interview. So, rather than duplicate efforts you can focus on writing it once well, and then producing a resume in whatever format you want!
|
9
|
+
|
10
|
+
Oh, and don't bother using the LinkedIn 'Export to PDF' feature - it sucks.
|
11
|
+
|
12
|
+
## Getting Started
|
13
|
+
|
14
|
+
First, install [MacTex](http://www.tug.org/mactex/) so that you can produce LaTeX documents. Then, simply run the converter:
|
15
|
+
|
16
|
+
gem install linkedin2resume
|
17
|
+
linkedin2cv convert --format latex --options config.yml matt.fellows
|
18
|
+
|
19
|
+
The converter should open up a Web Browser and ask you to sign-in to LinkedIn, enabling it to pull down your profile and convert it into a pretty CV.
|
20
|
+
|
21
|
+
## Custom fields/data
|
22
|
+
|
23
|
+
Some templates may display extra information, or you may choose to make the resume more intelligent. For example, LinkedIn doesn't connect your projects to your role/company. See the example config.yml file for full details.
|
24
|
+
|
25
|
+
## Contributing your own template
|
26
|
+
|
27
|
+
TODO, sorry!
|
28
|
+
|
29
|
+
## Acknowledgements
|
30
|
+
|
31
|
+
* Asciidoctor
|
32
|
+
* LaTeX & MacTex
|
data/Rakefile
ADDED
data/Vagrantfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Vagrant.configure("2") do |config|
|
2
|
+
|
3
|
+
config.vm.define "centos-64-x64-vbox4210" do |v|
|
4
|
+
v.vm.box = "centos-64-x64-vbox4210"
|
5
|
+
v.vm.hostname = "centos"
|
6
|
+
v.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
|
7
|
+
config.vm.network "forwarded_port", guest: 80, host: 8081
|
8
|
+
end
|
9
|
+
|
10
|
+
config.vm.provider :virtualbox do |vb|
|
11
|
+
vb.customize ["modifyvm", :id, "--memory", "256"]
|
12
|
+
end
|
13
|
+
|
14
|
+
config.vm.provision :shell, :path => "vagrant/shell/bootstrap.sh"
|
15
|
+
|
16
|
+
end
|
data/app/routes/api.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'em-websocket'
|
4
|
+
require 'sinatra/reloader'
|
5
|
+
require 'sinatra/param'
|
6
|
+
require "sinatra/json"
|
7
|
+
require "json"
|
8
|
+
require "sinatra-websocket"
|
9
|
+
|
10
|
+
#
|
11
|
+
# Public: API for the Application
|
12
|
+
#
|
13
|
+
module Linkedin2CV
|
14
|
+
module Routes
|
15
|
+
class API < Sinatra::Application
|
16
|
+
helpers Sinatra::Param
|
17
|
+
|
18
|
+
configure do
|
19
|
+
set :json_encoder, :to_json
|
20
|
+
set :sockets, []
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
content_type :json
|
25
|
+
|
26
|
+
# CORS ACLs
|
27
|
+
headers 'Access-Control-Allow-Origin' => '*',
|
28
|
+
'Access-Control-Allow-Methods' => ['OPTIONS', 'GET', 'POST']
|
29
|
+
end
|
30
|
+
|
31
|
+
# CORS pre-flight
|
32
|
+
options '/*' do
|
33
|
+
200
|
34
|
+
end
|
35
|
+
|
36
|
+
# Public: Main API entry point to run the Linkedin2CV service
|
37
|
+
#
|
38
|
+
#
|
39
|
+
get '/api/linkedin2cv /:uri' do
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
get '/socket' do
|
45
|
+
if !request.websocket?
|
46
|
+
JSON::generate({'data' => {}, 'error' => 'Invalid WebSocket request'})
|
47
|
+
else
|
48
|
+
response_obj = {'data' => {}, 'message' => 'Invalid Request'}
|
49
|
+
request.websocket do |ws|
|
50
|
+
ws.onopen do
|
51
|
+
warn("socket opened")
|
52
|
+
settings.sockets << ws
|
53
|
+
end
|
54
|
+
ws.onmessage do |msg|
|
55
|
+
EM.next_tick {
|
56
|
+
json_msg = JSON.parse(msg)
|
57
|
+
|
58
|
+
# Do not remove the 'pong' response
|
59
|
+
# TODO: move this into an abstraction somewhere so it's hidden
|
60
|
+
pong = checkPong(json_msg)
|
61
|
+
if (!pong.nil?)
|
62
|
+
response_obj = pong
|
63
|
+
elsif
|
64
|
+
|
65
|
+
# Play with request/responses
|
66
|
+
if (json_msg['message'] == 'foo')
|
67
|
+
response_obj = {'message' => 'bar'}
|
68
|
+
else
|
69
|
+
# Do something with json_msg
|
70
|
+
response_obj = {'message' => json_msg['message']}
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# Send a response
|
76
|
+
settings.sockets.each{|s| s.send(JSON::generate(response_obj)) }
|
77
|
+
}
|
78
|
+
end
|
79
|
+
ws.onclose do
|
80
|
+
warn("websocket closed")
|
81
|
+
settings.sockets.delete(ws)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Public: Keep-alive check.
|
88
|
+
#
|
89
|
+
# Defaults to look for for a 'ping' message, responds with a 'pong'
|
90
|
+
# Override this for custom behaviour.
|
91
|
+
#
|
92
|
+
def checkPong(msg)
|
93
|
+
log.debug("Checking ping pong for a ping: " + msg['message'])
|
94
|
+
if (msg['message'] == 'ping')
|
95
|
+
log.debug("Ping hit!")
|
96
|
+
response_obj = {'message' => 'pong'}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/app/routes/web.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'sinatra/reloader'
|
3
|
+
require 'sinatra/param'
|
4
|
+
require 'haml'
|
5
|
+
require 'linkedin-oauth2'
|
6
|
+
|
7
|
+
#
|
8
|
+
# Public: Front end API for the Linkedin2CV Generator website
|
9
|
+
#
|
10
|
+
module Linkedin2CV
|
11
|
+
module Routes
|
12
|
+
class Web < Sinatra::Application
|
13
|
+
# include Logging
|
14
|
+
use Rack::Logger
|
15
|
+
|
16
|
+
configure do
|
17
|
+
set :views, 'app/views'
|
18
|
+
set :public_folder, 'public/dist'
|
19
|
+
set :sessions, true
|
20
|
+
set :api, ENV['LINKEDIN_API_KEY']
|
21
|
+
set :secret, ENV["LINKEDIN_API_SECRET"]
|
22
|
+
set :session_secret, 'd41d8cd98f00b204e9800998ecf8427e'
|
23
|
+
set :logging, true
|
24
|
+
set :server, 'thin'
|
25
|
+
set :port, 5000
|
26
|
+
|
27
|
+
# Would like to pass as option for CLI to set false, but true otherwise
|
28
|
+
set :threaded, false # This allows sneaky thread manipulation
|
29
|
+
end
|
30
|
+
|
31
|
+
# configure :production do
|
32
|
+
# set :views, 'app/views'
|
33
|
+
# set :public_folder, 'public/dist'
|
34
|
+
# set :sessions, true
|
35
|
+
# end
|
36
|
+
|
37
|
+
helpers do
|
38
|
+
def login?
|
39
|
+
!session[:atoken].nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
def profile
|
43
|
+
linkedin_client.profile unless session[:atoken].nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
def connections
|
47
|
+
linkedin_client.connections unless session[:atoken].nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def linkedin_client
|
52
|
+
client = LinkedIn::Client.new(settings.api, settings.secret, session[:atoken])
|
53
|
+
client
|
54
|
+
end
|
55
|
+
|
56
|
+
def logger
|
57
|
+
request.logger
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# Public: Main HTML web page to interact with app
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# get '/' do
|
66
|
+
# erb :home
|
67
|
+
# end
|
68
|
+
|
69
|
+
get "/" do
|
70
|
+
logger.info "this is interesting"
|
71
|
+
haml :index
|
72
|
+
end
|
73
|
+
|
74
|
+
# Public: Run API only temporarily for purposes of CLI client
|
75
|
+
#
|
76
|
+
#
|
77
|
+
get "/cli/auth" do
|
78
|
+
ENV['CLI_ONLY'] = 'true'
|
79
|
+
redirect "/auth"
|
80
|
+
end
|
81
|
+
|
82
|
+
get "/auth" do
|
83
|
+
logger.info "Authing..."
|
84
|
+
client = LinkedIn::Client.new(settings.api, settings.secret)
|
85
|
+
session[:authorize_url] = client.authorize_url(redirect_uri: "http://#{request.host}:#{request.port}/auth/callback")
|
86
|
+
redirect session[:authorize_url]
|
87
|
+
end
|
88
|
+
|
89
|
+
get "/auth/logout" do
|
90
|
+
session[:atoken] = nil
|
91
|
+
redirect "/"
|
92
|
+
end
|
93
|
+
|
94
|
+
get "/auth/callback" do
|
95
|
+
code = params[:code]
|
96
|
+
logger.info "Auth code received #{code}"
|
97
|
+
logger.info "OK, so getting a URL to authorize and get my access token"
|
98
|
+
client = LinkedIn::Client.new(settings.api, settings.secret)
|
99
|
+
token = client.request_access_token(code, redirect_uri: "http://#{request.host}:#{request.port}/auth/callback")
|
100
|
+
session[:atoken] = token.token
|
101
|
+
|
102
|
+
# Store in env for command line!
|
103
|
+
file = File.new('.token', 'w')
|
104
|
+
file.write(token.token)
|
105
|
+
file.close
|
106
|
+
|
107
|
+
if !ENV['CLI_ONLY'].nil?
|
108
|
+
logger.info "Got access token, shutting down!: #{session[:atoken]}"
|
109
|
+
Thread.current.thread_variable_set('access_token', token.token)
|
110
|
+
Thread.kill(Thread.current)
|
111
|
+
end
|
112
|
+
|
113
|
+
redirect "/"
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# Public: 404 page
|
118
|
+
#
|
119
|
+
not_found do
|
120
|
+
'This is nowhere to be found.'
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# Public: Error page
|
125
|
+
#
|
126
|
+
error do
|
127
|
+
'Im sorry, <a href="http://github.com/mefellows/">this guy</a>" wrote some shit code and hasnt improved it yet. He did say this was experimental though!'
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
data/app/views/hello.erb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<h1>Simple Echo & Chat Server</h1>
|
4
|
+
<form id="form">
|
5
|
+
<input type="text" id="input" value="send a message"></input>
|
6
|
+
</form>
|
7
|
+
<div id="msgs"></div>
|
8
|
+
</body>
|
9
|
+
|
10
|
+
<script type="text/javascript">
|
11
|
+
window.onload = function(){
|
12
|
+
(function(){
|
13
|
+
var show = function(el){
|
14
|
+
return function(msg){ el.innerHTML = msg + '<br />' + el.innerHTML; }
|
15
|
+
}(document.getElementById('msgs'));
|
16
|
+
|
17
|
+
var url = 'ws://' + window.location.host + '/socket';
|
18
|
+
alert('opening connection to: ' + url)
|
19
|
+
var ws = new WebSocket(url);
|
20
|
+
ws.onopen = function() { show('websocket opened'); };
|
21
|
+
ws.onclose = function() { show('websocket closed'); }
|
22
|
+
ws.onmessage = function(m) { show('websocket message: ' + m.data); };
|
23
|
+
|
24
|
+
var sender = function(f){
|
25
|
+
var input = document.getElementById('input');
|
26
|
+
input.onclick = function(){ input.value = "" };
|
27
|
+
f.onsubmit = function(){
|
28
|
+
ws.send(input.value);
|
29
|
+
input.value = "send a message";
|
30
|
+
return false;
|
31
|
+
}
|
32
|
+
}(document.getElementById('form'));
|
33
|
+
})();
|
34
|
+
}
|
35
|
+
</script>
|
36
|
+
</html>
|
data/app/views/home.erb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
<!doctype html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><title>Linkedin2CV Generator | Generate a Linkedin2CV for your website</title><meta name="description" content=""><meta name="viewport" content="width=device-width"><!-- Place favicon.ico and apple-touch-icon.png in the root directory --><link rel="stylesheet" href="styles/vendor.css"><link rel="stylesheet" href="styles/f24dfdad.main.css"><body ng-app="linkedin2cv GeneratorApp"><!--[if lt IE 7]>
|
2
|
+
<p class="browselinkedin2cv ">You are using an <strong>outdated</strong> browser. Please <a href="http://browselinkedin2cv .com/">upgrade your browser</a> to improve your experience.</p>
|
3
|
+
<![endif]--><!-- Add your site or application content here --><div class="container" ng-view=""></div><!-- Google Analytics: change UA-XXXXX-X to be your site's ID --><script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
4
|
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
5
|
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
6
|
+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
7
|
+
|
8
|
+
ga('create', 'UA-XXXXX-X');
|
9
|
+
ga('send', 'pageview');</script><!--[if lt IE 9]>
|
10
|
+
<script src="bower_components/es5-shim/es5-shim.js"></script>
|
11
|
+
<script src="bower_components/json3/lib/json3.min.js"></script>
|
12
|
+
<![endif]--><script src="scripts/4e7c0841.vendor.js"></script><script src="scripts/d73d3ac9.scripts.js"></script>
|
data/app.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'sinatra/reloader'
|
3
|
+
require './app/routes/web'
|
4
|
+
require './app/routes/api'
|
5
|
+
require 'eventmachine'
|
6
|
+
|
7
|
+
#
|
8
|
+
# Public: Front end UI and API
|
9
|
+
#
|
10
|
+
module Linkedin2CV
|
11
|
+
EventMachine.run do
|
12
|
+
class Linkedin2CVApplication < Sinatra::Application
|
13
|
+
|
14
|
+
configure { set :server, 'thin' }
|
15
|
+
use Rack::Deflater
|
16
|
+
use Linkedin2CV::Routes::API
|
17
|
+
use Linkedin2CV::Routes::Web
|
18
|
+
|
19
|
+
get '/status' do
|
20
|
+
"alive"
|
21
|
+
end
|
22
|
+
|
23
|
+
run!
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/config.ru
ADDED
data/config.yml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
home_phone: +61 3 9628 3624
|
2
|
+
mobile_phone: +61 422 082 738
|
3
|
+
|
4
|
+
references:
|
5
|
+
- mark:
|
6
|
+
projects: ["Melbourne IT AWS Migration \\ \"DevOps\""]
|
7
|
+
roles: ["Manager, Digital"]
|
8
|
+
first_name: Mark
|
9
|
+
last_name: Murphy
|
10
|
+
phone: +61 3 8624 2378
|
11
|
+
email: mark.murphy@melbourneit.com.au
|
12
|
+
|
13
|
+
skills:
|
14
|
+
max: 10
|
15
|
+
extra:
|
16
|
+
- technical: [Solution Design & Architecture, REST, APIs, AWS, Puppet, Automation]
|
17
|
+
- languages: [Java, PHP, Ruby, Scala]
|
18
|
+
|
19
|
+
other:
|
20
|
+
interests: [The Internet, Human Computer Interaction & Usability, Basketball, Waterskiing\Wakeboarding, Snowboarding]
|
21
|
+
|
22
|
+
projects:
|
23
|
+
- "Melbourne IT AWS Migration \\ \"DevOps\"": "Melbourne IT"
|
24
|
+
- "Melbourne IT Website Refresh (In Progress)": "Melbourne IT"
|
25
|
+
- "Startup - Mobile App (Advertising)": "Freelance"
|
26
|
+
- "Transformation": "Melbourne IT"
|
27
|
+
- "Renewal - Conversion Rate Optimisation": "Melbourne IT"
|
28
|
+
- "Skylock - Cloud-based GPS Security Portal": "Freelance"
|
29
|
+
- "Substantiate - GPS logbook solutions": "Freelance"
|
30
|
+
- "Auto-renewal": "Melbourne IT"
|
31
|
+
- "Business Transformation Programme (IWS)": "Melbourne IT"
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'linkedin2cv/version'
|
2
|
+
require 'linkedin2cv/logging'
|
3
|
+
require 'linkedin2cv/converter'
|
4
|
+
require 'clamp'
|
5
|
+
|
6
|
+
module Linkedin2CV
|
7
|
+
class AbstractCommand < Clamp::Command
|
8
|
+
include Logging
|
9
|
+
|
10
|
+
option ["-v", "--verbose"], :flag, "be verbose"
|
11
|
+
option "--version", :flag, "show version" do
|
12
|
+
puts "Linkedin2CV v" + Linkedin2CV::VERSION
|
13
|
+
exit(0)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class ConvertCommand < AbstractCommand
|
19
|
+
option "--format", "format", "Specify the output format. Options are [asciidoc, latex (pdf)]", :attribute_name => :format, :default => 'latex'
|
20
|
+
option "--options", "options", "Specify an options file with supplemental data and settings", :attribute_name => :options_file
|
21
|
+
# option "--style", "style", "Specify the style resume you want. Options are [standard, awesome, boring] ", :attribute_name => :format, :default => 'standard'
|
22
|
+
# option "--all-fields", :flag, "Import all supported LinkedIn fields [position, company, publication, patent, language, skills, certification, education, course, volunteer, recommendations]", :attribute_name => :all
|
23
|
+
# option "--position", :flag, "Import Position Profile data", :default => true
|
24
|
+
# option "--company", :flag, "Import Company Profile data", :default => true
|
25
|
+
# option "--skills", :flag, "Import Skills Profile data", :default => true
|
26
|
+
|
27
|
+
parameter "[output-file]", "Output file (without extension. e.g. 'output' to produce 'output.pdf', 'output.latex'", :attribute_name => :output_file, :default => 'output'
|
28
|
+
|
29
|
+
def execute
|
30
|
+
options = {}
|
31
|
+
if !options_file.nil?
|
32
|
+
options = YAML.load_file(options_file)
|
33
|
+
end
|
34
|
+
|
35
|
+
options['output_file'] = output_file
|
36
|
+
options['format'] = format
|
37
|
+
|
38
|
+
converter = Linkedin2CV::Converter.new
|
39
|
+
converter.create_resume(options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class MainCommand < AbstractCommand
|
44
|
+
subcommand "convert", "Magically converts your LinkedIn Profile to a professional resume", Linkedin2CV::ConvertCommand
|
45
|
+
end
|
46
|
+
end
|