Commit
Β·
9e0d988
1
Parent(s):
ed44c7c
π Add debug logging to JobSearchService for Remotive API responses, including URL, parameters, job count, and error handling.
Browse files- .gitignore +2 -1
- data/embeddings_metadata.json +0 -0
- data/jobs_cache.json +0 -0
- data/profiles.json +21 -0
- job_search_results.json +345 -0
- pyproject.toml +2 -1
- src/config/settings.py +2 -1
- src/services/job_search_service.py +14 -7
- tests/__init__.py +1 -0
- tests/test_job_search.py +105 -0
- tests/test_job_search_debug.py +76 -0
- tests/test_remotive_debug.py +108 -0
- uv.lock +2 -0
.gitignore
CHANGED
@@ -1,2 +1,3 @@
|
|
1 |
.venv
|
2 |
-
__pycache__
|
|
|
|
1 |
.venv
|
2 |
+
__pycache__
|
3 |
+
.env
|
data/embeddings_metadata.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/jobs_cache.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/profiles.json
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"test_user_001": {
|
3 |
+
"user_id": "test_user_001",
|
4 |
+
"resume": "Experienced software developer with 5+ years in web development, API design, and cloud platforms",
|
5 |
+
"skills": [
|
6 |
+
"Python",
|
7 |
+
"JavaScript",
|
8 |
+
"React",
|
9 |
+
"Node.js",
|
10 |
+
"AWS"
|
11 |
+
],
|
12 |
+
"salary_wish": "$80,000 - $120,000",
|
13 |
+
"career_goals": "Software Engineer seeking remote opportunities in full-stack development",
|
14 |
+
"experience_level": null,
|
15 |
+
"location": "Remote",
|
16 |
+
"education": null,
|
17 |
+
"certifications": null,
|
18 |
+
"created_at": "2025-06-07 15:09:40.290202",
|
19 |
+
"updated_at": "2025-06-07 15:09:40.290541"
|
20 |
+
}
|
21 |
+
}
|
job_search_results.json
ADDED
@@ -0,0 +1,345 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"success": true,
|
3 |
+
"jobs": [
|
4 |
+
{
|
5 |
+
"id": "adzuna_5208183052",
|
6 |
+
"title": "Software Engineer",
|
7 |
+
"company": "Stott and May",
|
8 |
+
"location": "London, UK",
|
9 |
+
"description": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
10 |
+
"requirements": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
11 |
+
"salary": "1",
|
12 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5208183052?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=86D615C31801EF776C044736D483A06BD11DF397",
|
13 |
+
"posted_date": "2025-05-20T22:23:45Z",
|
14 |
+
"job_type": "full-time",
|
15 |
+
"source": "adzuna",
|
16 |
+
"fit_score": 68,
|
17 |
+
"match_reasons": [
|
18 |
+
"Skills match: React, Node.js",
|
19 |
+
"Good match for your experience",
|
20 |
+
"Aligns with career goals"
|
21 |
+
]
|
22 |
+
},
|
23 |
+
{
|
24 |
+
"id": "adzuna_5208183052",
|
25 |
+
"title": "Software Engineer",
|
26 |
+
"company": "Stott and May",
|
27 |
+
"location": "London, UK",
|
28 |
+
"description": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
29 |
+
"requirements": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
30 |
+
"salary": "1",
|
31 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5208183052?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=86D615C31801EF776C044736D483A06BD11DF397",
|
32 |
+
"posted_date": "2025-05-20T22:23:45Z",
|
33 |
+
"job_type": "full-time",
|
34 |
+
"source": "adzuna",
|
35 |
+
"fit_score": 68,
|
36 |
+
"match_reasons": [
|
37 |
+
"Skills match: React, Node.js",
|
38 |
+
"Good match for your experience",
|
39 |
+
"Aligns with career goals"
|
40 |
+
]
|
41 |
+
},
|
42 |
+
{
|
43 |
+
"id": "adzuna_5208183052",
|
44 |
+
"title": "Software Engineer",
|
45 |
+
"company": "Stott and May",
|
46 |
+
"location": "London, UK",
|
47 |
+
"description": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
48 |
+
"requirements": "Software Engineer - SC Cleared We're looking for a Software Engineer with strong skills in Node.js, React, and TypeScript to build scalable web applications. You\u2019ll work across the stack, using Docker, Azure Web Apps, and ElasticSearch. Key Responsibilities:Develop full-stack applications with Node.js, React, and TypeScript Build and maintain RESTful APIs and responsive UIs Containerize and deploy apps using Docker and Azure Web Apps Implement and optimize search with ElasticSearch Collaborate \u2026",
|
49 |
+
"salary": "1",
|
50 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5208183052?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=86D615C31801EF776C044736D483A06BD11DF397",
|
51 |
+
"posted_date": "2025-05-20T22:23:45Z",
|
52 |
+
"job_type": "full-time",
|
53 |
+
"source": "adzuna",
|
54 |
+
"fit_score": 68,
|
55 |
+
"match_reasons": [
|
56 |
+
"Skills match: React, Node.js",
|
57 |
+
"Good match for your experience",
|
58 |
+
"Aligns with career goals"
|
59 |
+
]
|
60 |
+
},
|
61 |
+
{
|
62 |
+
"id": "adzuna_5225750696",
|
63 |
+
"title": "Software Engineer",
|
64 |
+
"company": "Harris Global",
|
65 |
+
"location": "Bromley, South East London",
|
66 |
+
"description": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
67 |
+
"requirements": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
68 |
+
"salary": "1",
|
69 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5225750696?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=A456781811625D4049618F922512D01AE53C6928",
|
70 |
+
"posted_date": "2025-06-01T04:15:19Z",
|
71 |
+
"job_type": "full-time",
|
72 |
+
"source": "adzuna",
|
73 |
+
"fit_score": 66,
|
74 |
+
"match_reasons": [
|
75 |
+
"Skills match: Python, React",
|
76 |
+
"Good match for your experience",
|
77 |
+
"Aligns with career goals"
|
78 |
+
]
|
79 |
+
},
|
80 |
+
{
|
81 |
+
"id": "adzuna_5225750696",
|
82 |
+
"title": "Software Engineer",
|
83 |
+
"company": "Harris Global",
|
84 |
+
"location": "Bromley, South East London",
|
85 |
+
"description": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
86 |
+
"requirements": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
87 |
+
"salary": "1",
|
88 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5225750696?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=A456781811625D4049618F922512D01AE53C6928",
|
89 |
+
"posted_date": "2025-06-01T04:15:19Z",
|
90 |
+
"job_type": "full-time",
|
91 |
+
"source": "adzuna",
|
92 |
+
"fit_score": 66,
|
93 |
+
"match_reasons": [
|
94 |
+
"Skills match: Python, React",
|
95 |
+
"Good match for your experience",
|
96 |
+
"Aligns with career goals"
|
97 |
+
]
|
98 |
+
},
|
99 |
+
{
|
100 |
+
"id": "adzuna_5225750696",
|
101 |
+
"title": "Software Engineer",
|
102 |
+
"company": "Harris Global",
|
103 |
+
"location": "Bromley, South East London",
|
104 |
+
"description": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
105 |
+
"requirements": "Harris Global are currently looking for a Full Stack Software Engineer to join our client on a permanent basis. This role will require 3 days per week in the office, with 2 days working from home. Candidates will ideally possess Python, React and Vue.JS skills. Responsibilities will include: Build and maintain full stack web applications that scale well and perform reliably using modern tools and frameworks. Create and integrate RESTful APIs to connect front end interfaces with back-end service\u2026",
|
106 |
+
"salary": "1",
|
107 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5225750696?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=A456781811625D4049618F922512D01AE53C6928",
|
108 |
+
"posted_date": "2025-06-01T04:15:19Z",
|
109 |
+
"job_type": "full-time",
|
110 |
+
"source": "adzuna",
|
111 |
+
"fit_score": 66,
|
112 |
+
"match_reasons": [
|
113 |
+
"Skills match: Python, React",
|
114 |
+
"Good match for your experience",
|
115 |
+
"Aligns with career goals"
|
116 |
+
]
|
117 |
+
},
|
118 |
+
{
|
119 |
+
"id": "adzuna_5219054802",
|
120 |
+
"title": "Java Software Engineer",
|
121 |
+
"company": "4Square Recruitment Ltd",
|
122 |
+
"location": "London, UK",
|
123 |
+
"description": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
124 |
+
"requirements": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
125 |
+
"salary": "0",
|
126 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219054802?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=97587EC5192CA3904938F242C6E5CF9EDCA2603D",
|
127 |
+
"posted_date": "2025-05-27T20:28:24Z",
|
128 |
+
"job_type": "full-time",
|
129 |
+
"source": "adzuna",
|
130 |
+
"fit_score": 56,
|
131 |
+
"match_reasons": [
|
132 |
+
"Skills match: React, AWS",
|
133 |
+
"Aligns with career goals"
|
134 |
+
]
|
135 |
+
},
|
136 |
+
{
|
137 |
+
"id": "adzuna_5219054802",
|
138 |
+
"title": "Java Software Engineer",
|
139 |
+
"company": "4Square Recruitment Ltd",
|
140 |
+
"location": "London, UK",
|
141 |
+
"description": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
142 |
+
"requirements": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
143 |
+
"salary": "0",
|
144 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219054802?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=97587EC5192CA3904938F242C6E5CF9EDCA2603D",
|
145 |
+
"posted_date": "2025-05-27T20:28:24Z",
|
146 |
+
"job_type": "full-time",
|
147 |
+
"source": "adzuna",
|
148 |
+
"fit_score": 56,
|
149 |
+
"match_reasons": [
|
150 |
+
"Skills match: React, AWS",
|
151 |
+
"Aligns with career goals"
|
152 |
+
]
|
153 |
+
},
|
154 |
+
{
|
155 |
+
"id": "adzuna_5219054802",
|
156 |
+
"title": "Java Software Engineer",
|
157 |
+
"company": "4Square Recruitment Ltd",
|
158 |
+
"location": "London, UK",
|
159 |
+
"description": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
160 |
+
"requirements": "Java Developer required for my manufacturing client in London. This role requires you to work in the office 3 times per week with 2 days at home. My client is looking for a Developer with 3-5 years experience in the following: Java (8) Spring/Spring Boot RESTful APIs MySQL/PostgreSQL Agile Desirable Skills: AWS, Azure or GCP Experience with Microservices architecture React.JS",
|
161 |
+
"salary": "0",
|
162 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219054802?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=97587EC5192CA3904938F242C6E5CF9EDCA2603D",
|
163 |
+
"posted_date": "2025-05-27T20:28:24Z",
|
164 |
+
"job_type": "full-time",
|
165 |
+
"source": "adzuna",
|
166 |
+
"fit_score": 56,
|
167 |
+
"match_reasons": [
|
168 |
+
"Skills match: React, AWS",
|
169 |
+
"Aligns with career goals"
|
170 |
+
]
|
171 |
+
},
|
172 |
+
{
|
173 |
+
"id": "adzuna_5238172599",
|
174 |
+
"title": "Software Engineer",
|
175 |
+
"company": "Zygo People",
|
176 |
+
"location": "London, UK",
|
177 |
+
"description": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
178 |
+
"requirements": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
179 |
+
"salary": "1",
|
180 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5238172599?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=EB5D5E34684F520BBE399809889418E9FF326030",
|
181 |
+
"posted_date": "2025-06-07T07:57:54Z",
|
182 |
+
"job_type": "full-time",
|
183 |
+
"source": "adzuna",
|
184 |
+
"fit_score": 56,
|
185 |
+
"match_reasons": [
|
186 |
+
"Skills match: React",
|
187 |
+
"Aligns with career goals"
|
188 |
+
]
|
189 |
+
},
|
190 |
+
{
|
191 |
+
"id": "adzuna_5238172599",
|
192 |
+
"title": "Software Engineer",
|
193 |
+
"company": "Zygo People",
|
194 |
+
"location": "London, UK",
|
195 |
+
"description": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
196 |
+
"requirements": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
197 |
+
"salary": "1",
|
198 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5238172599?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=EB5D5E34684F520BBE399809889418E9FF326030",
|
199 |
+
"posted_date": "2025-06-07T07:57:54Z",
|
200 |
+
"job_type": "full-time",
|
201 |
+
"source": "adzuna",
|
202 |
+
"fit_score": 56,
|
203 |
+
"match_reasons": [
|
204 |
+
"Skills match: React",
|
205 |
+
"Aligns with career goals"
|
206 |
+
]
|
207 |
+
},
|
208 |
+
{
|
209 |
+
"id": "adzuna_5238172599",
|
210 |
+
"title": "Software Engineer",
|
211 |
+
"company": "Zygo People",
|
212 |
+
"location": "London, UK",
|
213 |
+
"description": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
214 |
+
"requirements": "Software Engineer (React & Next.js) Location: London (Hybrid \u2013 2x/month on-site) Salary: \u00a336,625 \u2013 \u00a352,250 Join a global data and insights leader supporting critical industries like energy, agriculture, and weather. They're growing their London-based engineering team to build out a brand-new application within their Energy Division. The environment? Smart, supportive, and full of opportunity for technical and career growth. What You\u2019ll Do You\u2019ll be one of two engineers joining a close-knit, cro\u2026",
|
215 |
+
"salary": "1",
|
216 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5238172599?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=EB5D5E34684F520BBE399809889418E9FF326030",
|
217 |
+
"posted_date": "2025-06-07T07:57:54Z",
|
218 |
+
"job_type": "full-time",
|
219 |
+
"source": "adzuna",
|
220 |
+
"fit_score": 56,
|
221 |
+
"match_reasons": [
|
222 |
+
"Skills match: React",
|
223 |
+
"Aligns with career goals"
|
224 |
+
]
|
225 |
+
},
|
226 |
+
{
|
227 |
+
"id": "adzuna_5219918516",
|
228 |
+
"title": "Software Engineer",
|
229 |
+
"company": "Executive Facilities",
|
230 |
+
"location": "London, UK",
|
231 |
+
"description": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
232 |
+
"requirements": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
233 |
+
"salary": "0",
|
234 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219918516?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=D68B938D399C3F781BC280D7C29F76A6B95D78B1",
|
235 |
+
"posted_date": "2025-05-28T12:38:39Z",
|
236 |
+
"job_type": "full-time",
|
237 |
+
"source": "adzuna",
|
238 |
+
"fit_score": 54,
|
239 |
+
"match_reasons": [
|
240 |
+
"Skills match: Python, JavaScript, Node.js",
|
241 |
+
"Aligns with career goals"
|
242 |
+
]
|
243 |
+
},
|
244 |
+
{
|
245 |
+
"id": "adzuna_5219918516",
|
246 |
+
"title": "Software Engineer",
|
247 |
+
"company": "Executive Facilities",
|
248 |
+
"location": "London, UK",
|
249 |
+
"description": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
250 |
+
"requirements": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
251 |
+
"salary": "0",
|
252 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219918516?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=D68B938D399C3F781BC280D7C29F76A6B95D78B1",
|
253 |
+
"posted_date": "2025-05-28T12:38:39Z",
|
254 |
+
"job_type": "full-time",
|
255 |
+
"source": "adzuna",
|
256 |
+
"fit_score": 54,
|
257 |
+
"match_reasons": [
|
258 |
+
"Skills match: Python, JavaScript, Node.js",
|
259 |
+
"Aligns with career goals"
|
260 |
+
]
|
261 |
+
},
|
262 |
+
{
|
263 |
+
"id": "adzuna_5219918516",
|
264 |
+
"title": "Software Engineer",
|
265 |
+
"company": "Executive Facilities",
|
266 |
+
"location": "London, UK",
|
267 |
+
"description": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
268 |
+
"requirements": "Our client is a global software organisation with it\u2019s Uk headquarters based in central London. They are now seeking a Software Engineer for an interesting 6 month contract. Skills Expertise with one or more of: Javascript, Java, .NET, PHP, Node.js, Python, Ruby on rails. BSc/MSc in computer science or equivalent work experience. 5 years experience designing and/or developing web, software, or mobile applications for small business or consumer finance management. Strong relationship building to\u2026",
|
269 |
+
"salary": "0",
|
270 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5219918516?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=D68B938D399C3F781BC280D7C29F76A6B95D78B1",
|
271 |
+
"posted_date": "2025-05-28T12:38:39Z",
|
272 |
+
"job_type": "full-time",
|
273 |
+
"source": "adzuna",
|
274 |
+
"fit_score": 54,
|
275 |
+
"match_reasons": [
|
276 |
+
"Skills match: Python, JavaScript, Node.js",
|
277 |
+
"Aligns with career goals"
|
278 |
+
]
|
279 |
+
},
|
280 |
+
{
|
281 |
+
"id": "adzuna_5222886687",
|
282 |
+
"title": "Software Engineer",
|
283 |
+
"company": "Gravitas Recruitment Group Ltd",
|
284 |
+
"location": "London, UK",
|
285 |
+
"description": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
286 |
+
"requirements": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
287 |
+
"salary": "1",
|
288 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5222886687?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=DAEC2280308896EA35F92F59B6FC15589E4D24CD",
|
289 |
+
"posted_date": "2025-05-30T05:13:52Z",
|
290 |
+
"job_type": "full-time",
|
291 |
+
"source": "adzuna",
|
292 |
+
"fit_score": 52,
|
293 |
+
"match_reasons": [
|
294 |
+
"Skills match: React, AWS",
|
295 |
+
"Aligns with career goals"
|
296 |
+
]
|
297 |
+
},
|
298 |
+
{
|
299 |
+
"id": "adzuna_5222886687",
|
300 |
+
"title": "Software Engineer",
|
301 |
+
"company": "Gravitas Recruitment Group Ltd",
|
302 |
+
"location": "London, UK",
|
303 |
+
"description": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
304 |
+
"requirements": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
305 |
+
"salary": "1",
|
306 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5222886687?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=DAEC2280308896EA35F92F59B6FC15589E4D24CD",
|
307 |
+
"posted_date": "2025-05-30T05:13:52Z",
|
308 |
+
"job_type": "full-time",
|
309 |
+
"source": "adzuna",
|
310 |
+
"fit_score": 52,
|
311 |
+
"match_reasons": [
|
312 |
+
"Skills match: React, AWS",
|
313 |
+
"Aligns with career goals"
|
314 |
+
]
|
315 |
+
},
|
316 |
+
{
|
317 |
+
"id": "adzuna_5222886687",
|
318 |
+
"title": "Software Engineer",
|
319 |
+
"company": "Gravitas Recruitment Group Ltd",
|
320 |
+
"location": "London, UK",
|
321 |
+
"description": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
322 |
+
"requirements": "Role : Product Engineer Salary range : 70 - 110k ( equity) Location: x3 days pw - Central London (Mon, Tues & Fri) Tech stack includes : React, Typescript, NextJS, Golang, AWS, Docker, Postgres, GraphQL Current team size: x3 Engineers Multiple Product engineers required on a permanent basis for a startup building a collaboration design platform for hardware engineering teams across the globe (think Rocket Ships!). They've raised over 9 mil in Seed funding, profitable, and are looking to close S\u2026",
|
323 |
+
"salary": "1",
|
324 |
+
"url": "https://www.adzuna.co.uk/jobs/land/ad/5222886687?se=FD-jwY9D8BGV1lGWTncHCQ&utm_medium=api&utm_source=55ad9cb7&v=DAEC2280308896EA35F92F59B6FC15589E4D24CD",
|
325 |
+
"posted_date": "2025-05-30T05:13:52Z",
|
326 |
+
"job_type": "full-time",
|
327 |
+
"source": "adzuna",
|
328 |
+
"fit_score": 52,
|
329 |
+
"match_reasons": [
|
330 |
+
"Skills match: React, AWS",
|
331 |
+
"Aligns with career goals"
|
332 |
+
]
|
333 |
+
}
|
334 |
+
],
|
335 |
+
"total_found": 18,
|
336 |
+
"search_params": {
|
337 |
+
"query": "software engineer",
|
338 |
+
"location": "london",
|
339 |
+
"job_type": "full-time"
|
340 |
+
},
|
341 |
+
"user_profile": {
|
342 |
+
"skills_count": 5,
|
343 |
+
"location": "Remote"
|
344 |
+
}
|
345 |
+
}
|
pyproject.toml
CHANGED
@@ -24,7 +24,8 @@ dependencies = [
|
|
24 |
"transformers>=4.30.0",
|
25 |
"datasets>=2.14.0",
|
26 |
"aiohttp>=3.8.0",
|
27 |
-
"typing-extensions>=4.5.0"
|
|
|
28 |
]
|
29 |
|
30 |
[project.optional-dependencies]
|
|
|
24 |
"transformers>=4.30.0",
|
25 |
"datasets>=2.14.0",
|
26 |
"aiohttp>=3.8.0",
|
27 |
+
"typing-extensions>=4.5.0",
|
28 |
+
"pydantic-settings>=2.9.1",
|
29 |
]
|
30 |
|
31 |
[project.optional-dependencies]
|
src/config/settings.py
CHANGED
@@ -4,7 +4,8 @@ import os
|
|
4 |
from functools import lru_cache
|
5 |
from typing import Optional
|
6 |
|
7 |
-
from pydantic import
|
|
|
8 |
|
9 |
|
10 |
class Settings(BaseSettings):
|
|
|
4 |
from functools import lru_cache
|
5 |
from typing import Optional
|
6 |
|
7 |
+
from pydantic import Field
|
8 |
+
from pydantic_settings import BaseSettings
|
9 |
|
10 |
|
11 |
class Settings(BaseSettings):
|
src/services/job_search_service.py
CHANGED
@@ -89,7 +89,7 @@ class JobSearchService:
|
|
89 |
title = (
|
90 |
title_elem.get_text(strip=True)
|
91 |
if title_elem
|
92 |
-
else f"Position {i+1}"
|
93 |
)
|
94 |
|
95 |
company_elem = card.find("span", class_="companyName")
|
@@ -203,13 +203,19 @@ class JobSearchService:
|
|
203 |
if job_type:
|
204 |
params["job_type"] = job_type
|
205 |
|
|
|
|
|
|
|
206 |
response = requests.get(
|
207 |
-
self.settings.remotive_api_url, params=params, timeout=
|
208 |
)
|
209 |
response.raise_for_status()
|
210 |
data = response.json()
|
211 |
|
212 |
-
|
|
|
|
|
|
|
213 |
job = {
|
214 |
"id": f"remotive_{item.get('id')}",
|
215 |
"title": item.get("title", ""),
|
@@ -224,7 +230,10 @@ class JobSearchService:
|
|
224 |
"source": "remotive",
|
225 |
}
|
226 |
jobs.append(job)
|
|
|
|
|
227 |
except Exception as e:
|
|
|
228 |
logging.error("Error fetching Remotive jobs: %s", e)
|
229 |
|
230 |
return jobs
|
@@ -239,9 +248,7 @@ class JobSearchService:
|
|
239 |
return jobs
|
240 |
|
241 |
try:
|
242 |
-
base_url =
|
243 |
-
f"https://api.adzuna.com/v1/api/jobs/{self.settings.adzuna_country}/search/1"
|
244 |
-
)
|
245 |
params = {
|
246 |
"app_id": self.settings.adzuna_app_id,
|
247 |
"app_key": self.settings.adzuna_app_key,
|
@@ -250,7 +257,7 @@ class JobSearchService:
|
|
250 |
"results_per_page": min(self.settings.max_jobs_per_search, 50),
|
251 |
"content-type": "application/json",
|
252 |
}
|
253 |
-
response = requests.get(base_url, params=params, timeout=
|
254 |
response.raise_for_status()
|
255 |
data = response.json()
|
256 |
|
|
|
89 |
title = (
|
90 |
title_elem.get_text(strip=True)
|
91 |
if title_elem
|
92 |
+
else f"Position {i + 1}"
|
93 |
)
|
94 |
|
95 |
company_elem = card.find("span", class_="companyName")
|
|
|
203 |
if job_type:
|
204 |
params["job_type"] = job_type
|
205 |
|
206 |
+
print(f"π Remotive Debug - URL: {self.settings.remotive_api_url}")
|
207 |
+
print(f"π Remotive Debug - Params: {params}")
|
208 |
+
|
209 |
response = requests.get(
|
210 |
+
self.settings.remotive_api_url, params=params, timeout=30
|
211 |
)
|
212 |
response.raise_for_status()
|
213 |
data = response.json()
|
214 |
|
215 |
+
remotive_jobs = data.get("jobs", [])
|
216 |
+
print(f"π Remotive Debug - Response: {len(remotive_jobs)} jobs found")
|
217 |
+
|
218 |
+
for item in remotive_jobs:
|
219 |
job = {
|
220 |
"id": f"remotive_{item.get('id')}",
|
221 |
"title": item.get("title", ""),
|
|
|
230 |
"source": "remotive",
|
231 |
}
|
232 |
jobs.append(job)
|
233 |
+
|
234 |
+
print(f"π Remotive Debug - Processed: {len(jobs)} jobs")
|
235 |
except Exception as e:
|
236 |
+
print(f"π Remotive Debug - Error: {str(e)}")
|
237 |
logging.error("Error fetching Remotive jobs: %s", e)
|
238 |
|
239 |
return jobs
|
|
|
248 |
return jobs
|
249 |
|
250 |
try:
|
251 |
+
base_url = f"https://api.adzuna.com/v1/api/jobs/{self.settings.adzuna_country}/search/1"
|
|
|
|
|
252 |
params = {
|
253 |
"app_id": self.settings.adzuna_app_id,
|
254 |
"app_key": self.settings.adzuna_app_key,
|
|
|
257 |
"results_per_page": min(self.settings.max_jobs_per_search, 50),
|
258 |
"content-type": "application/json",
|
259 |
}
|
260 |
+
response = requests.get(base_url, params=params, timeout=30)
|
261 |
response.raise_for_status()
|
262 |
data = response.json()
|
263 |
|
tests/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
# Tests package
|
tests/test_job_search.py
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
from src.services.job_search_service import JobSearchService
|
3 |
+
from src.services.profile_service import ProfileService
|
4 |
+
from src.config import get_settings
|
5 |
+
import json
|
6 |
+
import os
|
7 |
+
|
8 |
+
# Load environment variables from .env file
|
9 |
+
load_dotenv()
|
10 |
+
|
11 |
+
# Debug: Check if Adzuna credentials are loaded
|
12 |
+
settings = get_settings()
|
13 |
+
print(
|
14 |
+
f"π Debug - Adzuna App ID: {'β
Set' if settings.adzuna_app_id else 'β Not set'}"
|
15 |
+
)
|
16 |
+
print(
|
17 |
+
f"π Debug - Adzuna App Key: {'β
Set' if settings.adzuna_app_key else 'β Not set'}"
|
18 |
+
)
|
19 |
+
print(f"π Debug - Adzuna Country: {settings.adzuna_country}")
|
20 |
+
|
21 |
+
# Environment variables check
|
22 |
+
print(
|
23 |
+
f"π Debug - ADZUNA_APP_ID env: {'β
Set' if os.getenv('ADZUNA_APP_ID') else 'β Not set'}"
|
24 |
+
)
|
25 |
+
print(
|
26 |
+
f"π Debug - ADZUNA_APP_KEY env: {'β
Set' if os.getenv('ADZUNA_APP_KEY') else 'β Not set'}"
|
27 |
+
)
|
28 |
+
|
29 |
+
# Initialize services
|
30 |
+
jb = JobSearchService()
|
31 |
+
profile_service = ProfileService()
|
32 |
+
|
33 |
+
# Create a sample user profile first (required for job search)
|
34 |
+
user_id = "test_user_001"
|
35 |
+
profile_data = {
|
36 |
+
"skills": ["Python", "JavaScript", "React", "Node.js", "AWS"],
|
37 |
+
"career_goals": "Software Engineer seeking remote opportunities in full-stack development",
|
38 |
+
"location": "Remote",
|
39 |
+
"resume": "Experienced software developer with 5+ years in web development, API design, and cloud platforms",
|
40 |
+
"salary_wish": "$80,000 - $120,000",
|
41 |
+
}
|
42 |
+
|
43 |
+
# Create user profile
|
44 |
+
print("Creating user profile...")
|
45 |
+
profile_result = profile_service.upsert_profile(user_id, json.dumps(profile_data))
|
46 |
+
print(f"Profile created: {profile_result}")
|
47 |
+
|
48 |
+
# Search parameters
|
49 |
+
search_query = "software engineer"
|
50 |
+
location = "london"
|
51 |
+
job_type = "full-time"
|
52 |
+
|
53 |
+
print(f"\nπ Searching for '{search_query}' jobs in '{location}' ({job_type})...")
|
54 |
+
print("=" * 60)
|
55 |
+
|
56 |
+
# Run job search (this will fetch from both Remotive and Adzuna)
|
57 |
+
search_results = jb.search_jobs(
|
58 |
+
user_id=user_id, query=search_query, location=location, job_type=job_type
|
59 |
+
)
|
60 |
+
|
61 |
+
# Display results
|
62 |
+
if search_results.get("success"):
|
63 |
+
jobs = search_results.get("jobs", [])
|
64 |
+
total_found = search_results.get("total_found", 0)
|
65 |
+
|
66 |
+
print(f"β
Found {total_found} jobs")
|
67 |
+
print(f"π Search parameters: {search_results.get('search_params', {})}")
|
68 |
+
|
69 |
+
# Group jobs by source
|
70 |
+
remotive_jobs = [job for job in jobs if job.get("source") == "remotive"]
|
71 |
+
adzuna_jobs = [job for job in jobs if job.get("source") == "adzuna"]
|
72 |
+
sample_jobs = [job for job in jobs if job.get("source") == "sample"]
|
73 |
+
|
74 |
+
print(f"\nπ Results breakdown:")
|
75 |
+
print(f" β’ Remotive jobs: {len(remotive_jobs)}")
|
76 |
+
print(f" β’ Adzuna jobs: {len(adzuna_jobs)}")
|
77 |
+
print(f" β’ Sample jobs: {len(sample_jobs)}")
|
78 |
+
|
79 |
+
# Display top jobs from each source
|
80 |
+
print(f"\nπ TOP REMOTIVE JOBS:")
|
81 |
+
print("-" * 40)
|
82 |
+
for i, job in enumerate(remotive_jobs[:3], 1):
|
83 |
+
print(f"{i}. {job['title']} at {job['company']}")
|
84 |
+
print(f" π {job['location']}")
|
85 |
+
print(f" π― Fit Score: {job['fit_score']}%")
|
86 |
+
print(f" π {job['url']}")
|
87 |
+
print()
|
88 |
+
|
89 |
+
print(f"\nπ TOP ADZUNA JOBS:")
|
90 |
+
print("-" * 40)
|
91 |
+
for i, job in enumerate(adzuna_jobs[:3], 1):
|
92 |
+
print(f"{i}. {job['title']} at {job['company']}")
|
93 |
+
print(f" π {job['location']}")
|
94 |
+
print(f" π― Fit Score: {job['fit_score']}%")
|
95 |
+
print(f" π {job['url']}")
|
96 |
+
print()
|
97 |
+
|
98 |
+
# Save detailed results to file
|
99 |
+
with open("job_search_results.json", "w", encoding="utf-8") as f:
|
100 |
+
json.dump(search_results, f, indent=2, default=str)
|
101 |
+
|
102 |
+
print(f"πΎ Detailed results saved to 'job_search_results.json'")
|
103 |
+
|
104 |
+
else:
|
105 |
+
print(f"β Search failed: {search_results.get('message', 'Unknown error')}")
|
tests/test_job_search_debug.py
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
from src.config import get_settings
|
3 |
+
import requests
|
4 |
+
import json
|
5 |
+
|
6 |
+
# Load environment variables from .env file
|
7 |
+
load_dotenv()
|
8 |
+
|
9 |
+
|
10 |
+
def test_adzuna_api_variations():
|
11 |
+
"""Test Adzuna API with different search variations."""
|
12 |
+
settings = get_settings()
|
13 |
+
|
14 |
+
print(f"π Testing Adzuna API with multiple variations...")
|
15 |
+
print(f"π App ID: {'β
Set' if settings.adzuna_app_id else 'β Not set'}")
|
16 |
+
print(f"π App Key: {'β
Set' if settings.adzuna_app_key else 'β Not set'}")
|
17 |
+
|
18 |
+
if not settings.adzuna_app_id or not settings.adzuna_app_key:
|
19 |
+
print("β Missing Adzuna credentials!")
|
20 |
+
return
|
21 |
+
|
22 |
+
# Test different combinations
|
23 |
+
test_cases = [
|
24 |
+
{"country": "gb", "what": "software engineer", "where": "london"},
|
25 |
+
{"country": "gb", "what": "python developer", "where": "london"},
|
26 |
+
{"country": "gb", "what": "software", "where": ""},
|
27 |
+
{"country": "us", "what": "software engineer", "where": "remote"},
|
28 |
+
{"country": "us", "what": "python", "where": "new york"},
|
29 |
+
{"country": "gb", "what": "", "where": "london"}, # Just location search
|
30 |
+
]
|
31 |
+
|
32 |
+
for i, test_case in enumerate(test_cases, 1):
|
33 |
+
print(
|
34 |
+
f"\nπ Test {i}: Country={test_case['country']}, What='{test_case['what']}', Where='{test_case['where']}'"
|
35 |
+
)
|
36 |
+
|
37 |
+
try:
|
38 |
+
base_url = (
|
39 |
+
f"https://api.adzuna.com/v1/api/jobs/{test_case['country']}/search/1"
|
40 |
+
)
|
41 |
+
params = {
|
42 |
+
"app_id": settings.adzuna_app_id,
|
43 |
+
"app_key": settings.adzuna_app_key,
|
44 |
+
"what": test_case["what"],
|
45 |
+
"where": test_case["where"],
|
46 |
+
"results_per_page": 5,
|
47 |
+
"content-type": "application/json",
|
48 |
+
}
|
49 |
+
|
50 |
+
response = requests.get(base_url, params=params, timeout=10)
|
51 |
+
|
52 |
+
if response.status_code == 200:
|
53 |
+
data = response.json()
|
54 |
+
results = data.get("results", [])
|
55 |
+
count = data.get("count", 0)
|
56 |
+
print(
|
57 |
+
f" β
Status: {response.status_code} | Found: {len(results)} jobs | Total available: {count}"
|
58 |
+
)
|
59 |
+
|
60 |
+
if results:
|
61 |
+
sample_job = results[0]
|
62 |
+
print(
|
63 |
+
f" π Sample: '{sample_job.get('title', 'N/A')}' at '{sample_job.get('company', {}).get('display_name', 'N/A')}' in '{sample_job.get('location', {}).get('display_name', 'N/A')}'"
|
64 |
+
)
|
65 |
+
break # Found some results, stop testing
|
66 |
+
else:
|
67 |
+
print(
|
68 |
+
f" β Status: {response.status_code} | Error: {response.text[:100]}"
|
69 |
+
)
|
70 |
+
|
71 |
+
except Exception as e:
|
72 |
+
print(f" π₯ Exception: {str(e)}")
|
73 |
+
|
74 |
+
|
75 |
+
if __name__ == "__main__":
|
76 |
+
test_adzuna_api_variations()
|
tests/test_remotive_debug.py
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
from src.config import get_settings
|
3 |
+
import requests
|
4 |
+
import json
|
5 |
+
import time
|
6 |
+
|
7 |
+
# Load environment variables from .env file
|
8 |
+
load_dotenv()
|
9 |
+
|
10 |
+
|
11 |
+
def test_remotive_api_directly():
|
12 |
+
"""Test Remotive API directly to debug timeout issues."""
|
13 |
+
settings = get_settings()
|
14 |
+
|
15 |
+
print(f"π Testing Remotive API directly...")
|
16 |
+
print(f"π API URL: {settings.remotive_api_url}")
|
17 |
+
|
18 |
+
# Test different search parameters and timeouts
|
19 |
+
test_cases = [
|
20 |
+
{"search": "software engineer", "location": "london", "timeout": 30},
|
21 |
+
{"search": "python", "location": "remote", "timeout": 30},
|
22 |
+
{"search": "software", "location": "", "timeout": 30}, # No location filter
|
23 |
+
{"search": "", "location": "", "timeout": 30}, # No filters - get all jobs
|
24 |
+
]
|
25 |
+
|
26 |
+
for i, test_case in enumerate(test_cases, 1):
|
27 |
+
print(
|
28 |
+
f"\nπ Test {i}: search='{test_case['search']}', location='{test_case['location']}', timeout={test_case['timeout']}s"
|
29 |
+
)
|
30 |
+
|
31 |
+
try:
|
32 |
+
params = {}
|
33 |
+
if test_case["search"]:
|
34 |
+
params["search"] = test_case["search"]
|
35 |
+
if test_case["location"]:
|
36 |
+
params["location"] = test_case["location"]
|
37 |
+
|
38 |
+
print(f" π Parameters: {params}")
|
39 |
+
|
40 |
+
start_time = time.time()
|
41 |
+
response = requests.get(
|
42 |
+
settings.remotive_api_url, params=params, timeout=test_case["timeout"]
|
43 |
+
)
|
44 |
+
end_time = time.time()
|
45 |
+
|
46 |
+
response_time = end_time - start_time
|
47 |
+
print(f" β±οΈ Response time: {response_time:.2f}s")
|
48 |
+
|
49 |
+
if response.status_code == 200:
|
50 |
+
data = response.json()
|
51 |
+
jobs = data.get("jobs", [])
|
52 |
+
print(f" β
Status: {response.status_code} | Found: {len(jobs)} jobs")
|
53 |
+
|
54 |
+
if jobs:
|
55 |
+
sample_job = jobs[0]
|
56 |
+
print(
|
57 |
+
f" π Sample: '{sample_job.get('title', 'N/A')}' at '{sample_job.get('company_name', 'N/A')}' in '{sample_job.get('candidate_required_location', 'N/A')}'"
|
58 |
+
)
|
59 |
+
break # Found some results, stop testing
|
60 |
+
else:
|
61 |
+
print(f" β οΈ Response OK but no jobs in results")
|
62 |
+
print(f" π Response keys: {list(data.keys())}")
|
63 |
+
|
64 |
+
else:
|
65 |
+
print(
|
66 |
+
f" β Status: {response.status_code} | Error: {response.text[:100]}"
|
67 |
+
)
|
68 |
+
|
69 |
+
except requests.exceptions.Timeout:
|
70 |
+
print(f" β±οΈ TIMEOUT after {test_case['timeout']}s")
|
71 |
+
except Exception as e:
|
72 |
+
print(f" π₯ Exception: {str(e)}")
|
73 |
+
|
74 |
+
|
75 |
+
def test_remotive_simple():
|
76 |
+
"""Simple test without any parameters."""
|
77 |
+
settings = get_settings()
|
78 |
+
|
79 |
+
print(f"\nπ Testing Remotive API with no parameters (should be fastest)...")
|
80 |
+
|
81 |
+
try:
|
82 |
+
start_time = time.time()
|
83 |
+
response = requests.get(settings.remotive_api_url, timeout=30)
|
84 |
+
end_time = time.time()
|
85 |
+
|
86 |
+
response_time = end_time - start_time
|
87 |
+
print(f"β±οΈ Response time: {response_time:.2f}s")
|
88 |
+
|
89 |
+
if response.status_code == 200:
|
90 |
+
data = response.json()
|
91 |
+
jobs = data.get("jobs", [])
|
92 |
+
print(f"β
Success! Found {len(jobs)} total jobs available")
|
93 |
+
|
94 |
+
if jobs:
|
95 |
+
print(
|
96 |
+
f"π First job: '{jobs[0].get('title', 'N/A')}' at '{jobs[0].get('company_name', 'N/A')}'"
|
97 |
+
)
|
98 |
+
else:
|
99 |
+
print(f"β Status: {response.status_code}")
|
100 |
+
print(f"π Response: {response.text[:200]}")
|
101 |
+
|
102 |
+
except Exception as e:
|
103 |
+
print(f"π₯ Exception: {str(e)}")
|
104 |
+
|
105 |
+
|
106 |
+
if __name__ == "__main__":
|
107 |
+
test_remotive_simple()
|
108 |
+
test_remotive_api_directly()
|
uv.lock
CHANGED
@@ -891,6 +891,7 @@ dependencies = [
|
|
891 |
{ name = "openai" },
|
892 |
{ name = "pandas" },
|
893 |
{ name = "pydantic" },
|
|
|
894 |
{ name = "python-dotenv" },
|
895 |
{ name = "python-multipart" },
|
896 |
{ name = "requests" },
|
@@ -928,6 +929,7 @@ requires-dist = [
|
|
928 |
{ name = "openai", specifier = ">=1.0.0" },
|
929 |
{ name = "pandas", specifier = ">=2.0.0" },
|
930 |
{ name = "pydantic", specifier = ">=2.0.0" },
|
|
|
931 |
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" },
|
932 |
{ name = "python-dotenv", specifier = ">=1.0.0" },
|
933 |
{ name = "python-multipart", specifier = ">=0.0.6" },
|
|
|
891 |
{ name = "openai" },
|
892 |
{ name = "pandas" },
|
893 |
{ name = "pydantic" },
|
894 |
+
{ name = "pydantic-settings" },
|
895 |
{ name = "python-dotenv" },
|
896 |
{ name = "python-multipart" },
|
897 |
{ name = "requests" },
|
|
|
929 |
{ name = "openai", specifier = ">=1.0.0" },
|
930 |
{ name = "pandas", specifier = ">=2.0.0" },
|
931 |
{ name = "pydantic", specifier = ">=2.0.0" },
|
932 |
+
{ name = "pydantic-settings", specifier = ">=2.9.1" },
|
933 |
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" },
|
934 |
{ name = "python-dotenv", specifier = ">=1.0.0" },
|
935 |
{ name = "python-multipart", specifier = ">=0.0.6" },
|