laddro-career 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c3223cb1c47a28a841c9a997bd8e87f6a25fd09a05603b272f99d95429b8708f
4
+ data.tar.gz: bea19fa64c7a69566b4deee620a4dd96ea53ac7401e6d1d9b2bff55daeebb942
5
+ SHA512:
6
+ metadata.gz: c577e3d08890b6fbaff28578099e68218e0509ab4ee7263cdd9210ed2be52993c10c699e0808c897a6c1dc5c14dcf76754e06b85ff6600ba5780443312e51841
7
+ data.tar.gz: 016b868020aafe548b43460a3ceb680f183808aaefa81dcd76c2ba25a72853f2d6815389ced644bdbf69c06335490d0db8263b614d70bb34a7dc7bb6980660ea
@@ -0,0 +1,153 @@
1
+ require "net/http"
2
+ require "json"
3
+ require "uri"
4
+
5
+ module Laddro
6
+ class Client
7
+ attr_reader :base_url
8
+
9
+ def initialize(api_key = nil, base_url: "https://api.laddro.com")
10
+ @api_key = api_key
11
+ @base_url = base_url.chomp("/")
12
+ end
13
+
14
+ def list_templates
15
+ get("/v1/templates")["templates"]
16
+ end
17
+
18
+ def get_template(template_id)
19
+ get("/v1/templates/#{template_id}")
20
+ end
21
+
22
+ def list_fonts
23
+ get("/v1/fonts")["fonts"]
24
+ end
25
+
26
+ def list_languages
27
+ get("/v1/languages")["languages"]
28
+ end
29
+
30
+ def list_models
31
+ get("/v1/models")["models"]
32
+ end
33
+
34
+ def list_resumes(limit: 20, offset: 0)
35
+ get("/v1/resumes?limit=#{limit}&offset=#{offset}")
36
+ end
37
+
38
+ def get_resume(resume_id)
39
+ get("/v1/resumes/#{resume_id}")
40
+ end
41
+
42
+ def render_resume(resume_id, options)
43
+ put_binary("/v1/resumes/#{resume_id}/render", options)
44
+ end
45
+
46
+ def tailor(request)
47
+ post_binary("/v1/tailor", request)
48
+ end
49
+
50
+ def export_pdf(request)
51
+ post_binary("/v1/export", request)
52
+ end
53
+
54
+ def list_cover_letters(limit: 20, offset: 0)
55
+ get("/v1/cover-letters?limit=#{limit}&offset=#{offset}")
56
+ end
57
+
58
+ def get_cover_letter(id)
59
+ get("/v1/cover-letters/#{id}")
60
+ end
61
+
62
+ def create_cover_letter(request)
63
+ post("/v1/cover-letters", request)
64
+ end
65
+
66
+ def generate_cover_letter(request)
67
+ post_binary("/v1/cover-letters/generate", request)
68
+ end
69
+
70
+ def render_cover_letter(id, options)
71
+ put_binary("/v1/cover-letters/#{id}/render", options)
72
+ end
73
+
74
+ def get_settings
75
+ get("/v1/settings")
76
+ end
77
+
78
+ def update_ai_settings(request)
79
+ put("/v1/settings/model", request)
80
+ end
81
+
82
+ def delete_ai_settings
83
+ delete("/v1/settings/model")
84
+ end
85
+
86
+ private
87
+
88
+ def get(path)
89
+ request(:get, path)
90
+ end
91
+
92
+ def post(path, body)
93
+ request(:post, path, body)
94
+ end
95
+
96
+ def put(path, body)
97
+ request(:put, path, body)
98
+ end
99
+
100
+ def delete(path)
101
+ request(:delete, path)
102
+ end
103
+
104
+ def post_binary(path, body)
105
+ request_binary(:post, path, body)
106
+ end
107
+
108
+ def put_binary(path, body)
109
+ request_binary(:put, path, body)
110
+ end
111
+
112
+ def request(method, path, body = nil)
113
+ response = execute(method, path, body)
114
+ handle_error(response) unless response.is_a?(Net::HTTPSuccess)
115
+ JSON.parse(response.body)
116
+ end
117
+
118
+ def request_binary(method, path, body = nil)
119
+ response = execute(method, path, body)
120
+ handle_error(response) unless response.is_a?(Net::HTTPSuccess)
121
+ response.body
122
+ end
123
+
124
+ def execute(method, path, body)
125
+ uri = URI("#{@base_url}#{path}")
126
+ http = Net::HTTP.new(uri.host, uri.port)
127
+ http.use_ssl = uri.scheme == "https"
128
+ http.read_timeout = 120
129
+
130
+ req = case method
131
+ when :get then Net::HTTP::Get.new(uri)
132
+ when :post then Net::HTTP::Post.new(uri)
133
+ when :put then Net::HTTP::Put.new(uri)
134
+ when :delete then Net::HTTP::Delete.new(uri)
135
+ end
136
+
137
+ req["x-api-key"] = @api_key if @api_key
138
+ if body
139
+ req["Content-Type"] = "application/json"
140
+ req.body = body.is_a?(String) ? body : JSON.generate(body)
141
+ end
142
+
143
+ http.request(req)
144
+ end
145
+
146
+ def handle_error(response)
147
+ body = JSON.parse(response.body) rescue {}
148
+ message = body["error"] || response.message
149
+ code = body["code"]
150
+ raise APIError.new(message, response.code.to_i, code)
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,23 @@
1
+ module Laddro
2
+ class APIError < StandardError
3
+ attr_reader :status, :code
4
+
5
+ def initialize(message, status, code = nil)
6
+ super(message)
7
+ @status = status
8
+ @code = code
9
+ end
10
+
11
+ def auth_error?
12
+ status == 401
13
+ end
14
+
15
+ def usage_limit_error?
16
+ status == 402
17
+ end
18
+
19
+ def not_found?
20
+ status == 404
21
+ end
22
+ end
23
+ end
data/lib/laddro.rb ADDED
@@ -0,0 +1,8 @@
1
+ require_relative "laddro/client"
2
+ require_relative "laddro/error"
3
+
4
+ module Laddro
5
+ def self.new(api_key = nil, base_url: "https://api.laddro.com")
6
+ Client.new(api_key, base_url: base_url)
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: laddro-career
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Laddro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-05-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Tailor resumes, generate cover letters, and export PDFs via the Laddro
14
+ Career API
15
+ email: support@laddro.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/laddro.rb
21
+ - lib/laddro/client.rb
22
+ - lib/laddro/error.rb
23
+ homepage: https://docs.laddro.com
24
+ licenses:
25
+ - MIT
26
+ metadata:
27
+ source_code_uri: https://github.com/laddro-app/laddro-career-sdk-ruby
28
+ homepage_uri: https://docs.laddro.com
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '3.1'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.0.3.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Ruby SDK for the Laddro Career API
48
+ test_files: []