linkedin2md 0.1.0__tar.gz
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.
- linkedin2md-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- linkedin2md-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- linkedin2md-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +25 -0
- linkedin2md-0.1.0/.github/workflows/ci.yml +39 -0
- linkedin2md-0.1.0/.github/workflows/publish.yml +47 -0
- linkedin2md-0.1.0/.gitignore +87 -0
- linkedin2md-0.1.0/CHANGELOG.md +32 -0
- linkedin2md-0.1.0/CODE_OF_CONDUCT.md +55 -0
- linkedin2md-0.1.0/CONTRIBUTING.md +105 -0
- linkedin2md-0.1.0/LICENSE +21 -0
- linkedin2md-0.1.0/PKG-INFO +155 -0
- linkedin2md-0.1.0/README.md +127 -0
- linkedin2md-0.1.0/pyproject.toml +56 -0
- linkedin2md-0.1.0/src/linkedin2md/__init__.py +64 -0
- linkedin2md-0.1.0/src/linkedin2md/__main__.py +6 -0
- linkedin2md-0.1.0/src/linkedin2md/cli.py +81 -0
- linkedin2md-0.1.0/src/linkedin2md/converter.py +136 -0
- linkedin2md-0.1.0/src/linkedin2md/extractor.py +80 -0
- linkedin2md-0.1.0/src/linkedin2md/formatter.py +1073 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/__init__.py +133 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/activity.py +85 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/advertising.py +109 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/base.py +71 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/content.py +265 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/identity.py +70 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/jobs.py +173 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/learning.py +57 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/network.py +133 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/payments.py +34 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/professional.py +225 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/profile.py +53 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/recommendations.py +139 -0
- linkedin2md-0.1.0/src/linkedin2md/formatters/services.py +74 -0
- linkedin2md-0.1.0/src/linkedin2md/language.py +88 -0
- linkedin2md-0.1.0/src/linkedin2md/parser.py +1504 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/__init__.py +147 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/activity.py +92 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/advertising.py +111 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/base.py +236 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/content.py +269 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/identity.py +62 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/jobs.py +195 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/learning.py +71 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/network.py +162 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/payments.py +35 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/professional.py +269 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/profile.py +149 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/recommendations.py +133 -0
- linkedin2md-0.1.0/src/linkedin2md/parsers/services.py +66 -0
- linkedin2md-0.1.0/src/linkedin2md/protocols.py +185 -0
- linkedin2md-0.1.0/src/linkedin2md/registry.py +76 -0
- linkedin2md-0.1.0/src/linkedin2md/writer.py +54 -0
- linkedin2md-0.1.0/tests/__init__.py +0 -0
- linkedin2md-0.1.0/tests/test_formatter.py +127 -0
- linkedin2md-0.1.0/tests/test_parser.py +74 -0
- linkedin2md-0.1.0/tests/test_security.py +217 -0
- linkedin2md-0.1.0/tests/test_solid.py +269 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: '[BUG] '
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Describe the bug
|
|
10
|
+
A clear and concise description of what the bug is.
|
|
11
|
+
|
|
12
|
+
## To Reproduce
|
|
13
|
+
Steps to reproduce the behavior:
|
|
14
|
+
1. Run command '...'
|
|
15
|
+
2. With file '...'
|
|
16
|
+
3. See error
|
|
17
|
+
|
|
18
|
+
## Expected behavior
|
|
19
|
+
A clear and concise description of what you expected to happen.
|
|
20
|
+
|
|
21
|
+
## Error output
|
|
22
|
+
```
|
|
23
|
+
Paste the error message here
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Environment
|
|
27
|
+
- OS: [e.g., Ubuntu 22.04, macOS 14, Windows 11]
|
|
28
|
+
- Python version: [e.g., 3.13.0]
|
|
29
|
+
- linkedin2md version: [e.g., 0.1.0]
|
|
30
|
+
|
|
31
|
+
## Sample data
|
|
32
|
+
If possible, provide a minimal example of the CSV data that causes the issue (please anonymize any personal information).
|
|
33
|
+
|
|
34
|
+
## Additional context
|
|
35
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: '[FEATURE] '
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Is your feature request related to a problem?
|
|
10
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
11
|
+
|
|
12
|
+
## Describe the solution you'd like
|
|
13
|
+
A clear and concise description of what you want to happen.
|
|
14
|
+
|
|
15
|
+
## Describe alternatives you've considered
|
|
16
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
17
|
+
|
|
18
|
+
## Additional context
|
|
19
|
+
Add any other context or screenshots about the feature request here.
|
|
20
|
+
|
|
21
|
+
## Would you be willing to contribute this feature?
|
|
22
|
+
- [ ] Yes, I'd like to submit a PR
|
|
23
|
+
- [ ] I can help with testing
|
|
24
|
+
- [ ] No, I'm just suggesting
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
Brief description of the changes in this PR.
|
|
3
|
+
|
|
4
|
+
## Related Issue
|
|
5
|
+
Fixes #(issue number)
|
|
6
|
+
|
|
7
|
+
## Type of Change
|
|
8
|
+
- [ ] Bug fix (non-breaking change that fixes an issue)
|
|
9
|
+
- [ ] New feature (non-breaking change that adds functionality)
|
|
10
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
11
|
+
- [ ] Documentation update
|
|
12
|
+
|
|
13
|
+
## Checklist
|
|
14
|
+
- [ ] My code follows the project's style guidelines
|
|
15
|
+
- [ ] I have run `ruff check .` and `ruff format .`
|
|
16
|
+
- [ ] I have run `pyright` with no errors
|
|
17
|
+
- [ ] I have added tests that prove my fix/feature works
|
|
18
|
+
- [ ] I have run `pytest` and all tests pass
|
|
19
|
+
- [ ] I have updated documentation as needed
|
|
20
|
+
|
|
21
|
+
## Testing
|
|
22
|
+
Describe how you tested these changes.
|
|
23
|
+
|
|
24
|
+
## Screenshots (if applicable)
|
|
25
|
+
Add screenshots to help explain your changes.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.13"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: |
|
|
26
|
+
python -m pip install --upgrade pip
|
|
27
|
+
pip install -e ".[dev]"
|
|
28
|
+
|
|
29
|
+
- name: Lint with ruff
|
|
30
|
+
run: |
|
|
31
|
+
ruff check .
|
|
32
|
+
ruff format --check .
|
|
33
|
+
|
|
34
|
+
- name: Type check with pyright
|
|
35
|
+
run: pyright
|
|
36
|
+
continue-on-error: true # Pre-existing type issues to be addressed later
|
|
37
|
+
|
|
38
|
+
- name: Run tests
|
|
39
|
+
run: pytest -v
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
|
|
13
|
+
- name: Set up Python
|
|
14
|
+
uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.13"
|
|
17
|
+
|
|
18
|
+
- name: Install build dependencies
|
|
19
|
+
run: |
|
|
20
|
+
python -m pip install --upgrade pip
|
|
21
|
+
pip install build
|
|
22
|
+
|
|
23
|
+
- name: Build package
|
|
24
|
+
run: python -m build
|
|
25
|
+
|
|
26
|
+
- name: Upload artifacts
|
|
27
|
+
uses: actions/upload-artifact@v4
|
|
28
|
+
with:
|
|
29
|
+
name: dist
|
|
30
|
+
path: dist/
|
|
31
|
+
|
|
32
|
+
publish:
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
environment: pypi
|
|
36
|
+
permissions:
|
|
37
|
+
id-token: write # Required for trusted publishing
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- name: Download artifacts
|
|
41
|
+
uses: actions/download-artifact@v4
|
|
42
|
+
with:
|
|
43
|
+
name: dist
|
|
44
|
+
path: dist/
|
|
45
|
+
|
|
46
|
+
- name: Publish to PyPI
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
*.manifest
|
|
31
|
+
*.spec
|
|
32
|
+
|
|
33
|
+
# Installer logs
|
|
34
|
+
pip-log.txt
|
|
35
|
+
pip-delete-this-directory.txt
|
|
36
|
+
|
|
37
|
+
# Unit test / coverage reports
|
|
38
|
+
htmlcov/
|
|
39
|
+
.tox/
|
|
40
|
+
.nox/
|
|
41
|
+
.coverage
|
|
42
|
+
.coverage.*
|
|
43
|
+
.cache
|
|
44
|
+
nosetests.xml
|
|
45
|
+
coverage.xml
|
|
46
|
+
*.cover
|
|
47
|
+
*.py,cover
|
|
48
|
+
.hypothesis/
|
|
49
|
+
.pytest_cache/
|
|
50
|
+
|
|
51
|
+
# Translations
|
|
52
|
+
*.mo
|
|
53
|
+
*.pot
|
|
54
|
+
|
|
55
|
+
# Environments
|
|
56
|
+
.env
|
|
57
|
+
.venv
|
|
58
|
+
env/
|
|
59
|
+
venv/
|
|
60
|
+
ENV/
|
|
61
|
+
env.bak/
|
|
62
|
+
venv.bak/
|
|
63
|
+
|
|
64
|
+
# IDE
|
|
65
|
+
.vscode/
|
|
66
|
+
.idea/
|
|
67
|
+
*.swp
|
|
68
|
+
*.swo
|
|
69
|
+
*~
|
|
70
|
+
|
|
71
|
+
# Linting / Type checking
|
|
72
|
+
.ruff_cache/
|
|
73
|
+
.mypy_cache/
|
|
74
|
+
.dmypy.json
|
|
75
|
+
dmypy.json
|
|
76
|
+
.pyright/
|
|
77
|
+
pyrightconfig.json
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# macOS
|
|
83
|
+
.DS_Store
|
|
84
|
+
|
|
85
|
+
# Output directories (for testing)
|
|
86
|
+
linkedin_export/
|
|
87
|
+
output/
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2025-01-20
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Initial release
|
|
14
|
+
- Convert LinkedIn data exports (ZIP) to Markdown files
|
|
15
|
+
- Support for 40+ data categories:
|
|
16
|
+
- Profile (name, title, contact, summary)
|
|
17
|
+
- Experience and education
|
|
18
|
+
- Skills and certifications
|
|
19
|
+
- Recommendations and endorsements
|
|
20
|
+
- LinkedIn Learning history
|
|
21
|
+
- Connections and network
|
|
22
|
+
- Posts, comments, and reactions
|
|
23
|
+
- Job applications and saved jobs
|
|
24
|
+
- Activity history (searches, logins)
|
|
25
|
+
- Advertising and privacy data
|
|
26
|
+
- Bilingual support (English and Spanish)
|
|
27
|
+
- CLI with customizable output directory
|
|
28
|
+
- SOLID architecture for extensibility
|
|
29
|
+
- Security features (path traversal protection, URL sanitization, file size limits)
|
|
30
|
+
|
|
31
|
+
[Unreleased]: https://github.com/juanmanueldaza/linkedin2md/compare/v0.1.0...HEAD
|
|
32
|
+
[0.1.0]: https://github.com/juanmanueldaza/linkedin2md/releases/tag/v0.1.0
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
+
community a harassment-free experience for everyone, regardless of age, body
|
|
7
|
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
8
|
+
identity and expression, level of experience, education, socio-economic status,
|
|
9
|
+
nationality, personal appearance, race, religion, or sexual identity
|
|
10
|
+
and orientation.
|
|
11
|
+
|
|
12
|
+
## Our Standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to a positive environment:
|
|
15
|
+
|
|
16
|
+
* Using welcoming and inclusive language
|
|
17
|
+
* Being respectful of differing viewpoints and experiences
|
|
18
|
+
* Gracefully accepting constructive criticism
|
|
19
|
+
* Focusing on what is best for the community
|
|
20
|
+
* Showing empathy towards other community members
|
|
21
|
+
|
|
22
|
+
Examples of unacceptable behavior:
|
|
23
|
+
|
|
24
|
+
* The use of sexualized language or imagery and unwelcome sexual attention
|
|
25
|
+
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
26
|
+
* Public or private harassment
|
|
27
|
+
* Publishing others' private information without explicit permission
|
|
28
|
+
* Other conduct which could reasonably be considered inappropriate
|
|
29
|
+
|
|
30
|
+
## Enforcement Responsibilities
|
|
31
|
+
|
|
32
|
+
Project maintainers are responsible for clarifying and enforcing standards of
|
|
33
|
+
acceptable behavior and will take appropriate and fair corrective action in
|
|
34
|
+
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
35
|
+
or harmful.
|
|
36
|
+
|
|
37
|
+
## Scope
|
|
38
|
+
|
|
39
|
+
This Code of Conduct applies within all community spaces, and also applies when
|
|
40
|
+
an individual is officially representing the community in public spaces.
|
|
41
|
+
|
|
42
|
+
## Enforcement
|
|
43
|
+
|
|
44
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
45
|
+
reported to the project maintainer at juanmanueldaza@gmail.com.
|
|
46
|
+
|
|
47
|
+
All complaints will be reviewed and investigated promptly and fairly.
|
|
48
|
+
|
|
49
|
+
## Attribution
|
|
50
|
+
|
|
51
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
52
|
+
version 2.0, available at
|
|
53
|
+
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
|
54
|
+
|
|
55
|
+
[homepage]: https://www.contributor-covenant.org
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Contributing to linkedin2md
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to linkedin2md! This document provides guidelines and instructions for contributing.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
1. **Clone the repository**
|
|
8
|
+
```bash
|
|
9
|
+
git clone https://github.com/juanmanueldaza/linkedin2md.git
|
|
10
|
+
cd linkedin2md
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. **Create a virtual environment**
|
|
14
|
+
```bash
|
|
15
|
+
python -m venv .venv
|
|
16
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
3. **Install development dependencies**
|
|
20
|
+
```bash
|
|
21
|
+
pip install -e ".[dev]"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Code Style
|
|
25
|
+
|
|
26
|
+
This project uses:
|
|
27
|
+
- **Ruff** for linting and formatting
|
|
28
|
+
- **Pyright** for type checking
|
|
29
|
+
- Line length: 88 characters
|
|
30
|
+
- Target: Python 3.13+
|
|
31
|
+
|
|
32
|
+
Run checks before submitting:
|
|
33
|
+
```bash
|
|
34
|
+
ruff check .
|
|
35
|
+
ruff format .
|
|
36
|
+
pyright
|
|
37
|
+
pytest
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Architecture
|
|
41
|
+
|
|
42
|
+
The project follows SOLID principles:
|
|
43
|
+
|
|
44
|
+
- **Single Responsibility**: Each parser/formatter handles one section
|
|
45
|
+
- **Open/Closed**: Add new parsers via `@register_parser` decorator
|
|
46
|
+
- **Liskov Substitution**: All parsers implement `SectionParser` protocol
|
|
47
|
+
- **Interface Segregation**: Focused protocols for each component
|
|
48
|
+
- **Dependency Inversion**: Converter depends on protocols, not implementations
|
|
49
|
+
|
|
50
|
+
### Adding a New Parser
|
|
51
|
+
|
|
52
|
+
1. Create a file in `src/linkedin2md/parsers/`
|
|
53
|
+
2. Implement the `SectionParser` protocol
|
|
54
|
+
3. Use `@register_parser` decorator
|
|
55
|
+
4. Create matching formatter in `src/linkedin2md/formatters/`
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
```python
|
|
59
|
+
from linkedin2md.parsers.base import BaseParser
|
|
60
|
+
from linkedin2md.registry import register_parser
|
|
61
|
+
|
|
62
|
+
@register_parser
|
|
63
|
+
class MyNewParser(BaseParser):
|
|
64
|
+
section_key = "my_section"
|
|
65
|
+
csv_files = ["MyData.csv"]
|
|
66
|
+
|
|
67
|
+
def parse(self, data: dict) -> list:
|
|
68
|
+
# Parse logic here
|
|
69
|
+
return []
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Pull Request Process
|
|
73
|
+
|
|
74
|
+
1. **Fork the repository** and create your branch from `main`
|
|
75
|
+
2. **Write tests** for new functionality
|
|
76
|
+
3. **Update documentation** if needed
|
|
77
|
+
4. **Ensure all checks pass** (ruff, pyright, pytest)
|
|
78
|
+
5. **Submit a PR** with a clear description
|
|
79
|
+
|
|
80
|
+
### PR Checklist
|
|
81
|
+
|
|
82
|
+
- [ ] Code follows the project style
|
|
83
|
+
- [ ] Tests added/updated
|
|
84
|
+
- [ ] Documentation updated (if applicable)
|
|
85
|
+
- [ ] All CI checks pass
|
|
86
|
+
|
|
87
|
+
## Reporting Bugs
|
|
88
|
+
|
|
89
|
+
When reporting bugs, please include:
|
|
90
|
+
- Python version
|
|
91
|
+
- Operating system
|
|
92
|
+
- Steps to reproduce
|
|
93
|
+
- Expected vs actual behavior
|
|
94
|
+
- Sample data (if possible, anonymized)
|
|
95
|
+
|
|
96
|
+
## Feature Requests
|
|
97
|
+
|
|
98
|
+
Feature requests are welcome! Please:
|
|
99
|
+
- Check existing issues first
|
|
100
|
+
- Describe the use case
|
|
101
|
+
- Explain why it would benefit others
|
|
102
|
+
|
|
103
|
+
## Questions?
|
|
104
|
+
|
|
105
|
+
Feel free to open an issue for questions or discussions.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Juan Manuel Daza
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: linkedin2md
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Convert LinkedIn data exports to Markdown
|
|
5
|
+
Project-URL: Homepage, https://github.com/juanmanueldaza/linkedin2md
|
|
6
|
+
Project-URL: Repository, https://github.com/juanmanueldaza/linkedin2md
|
|
7
|
+
Project-URL: Issues, https://github.com/juanmanueldaza/linkedin2md/issues
|
|
8
|
+
Author-email: Juan Manuel Daza <juanmanueldaza@gmail.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: cv,export,linkedin,markdown,parser,resume
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Topic :: Text Processing :: Markup :: Markdown
|
|
22
|
+
Classifier: Topic :: Utilities
|
|
23
|
+
Requires-Python: >=3.13
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest>=9.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: ruff>=0.9; extra == 'dev'
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# linkedin2md
|
|
30
|
+
|
|
31
|
+
[](https://pypi.org/project/linkedin2md/)
|
|
32
|
+
[](https://pypi.org/project/linkedin2md/)
|
|
33
|
+
[](https://github.com/juanmanueldaza/linkedin2md/blob/main/LICENSE)
|
|
34
|
+
[](https://github.com/juanmanueldaza/linkedin2md/actions/workflows/ci.yml)
|
|
35
|
+
|
|
36
|
+
Convert LinkedIn data exports to clean Markdown files.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install linkedin2md
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Usage
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
linkedin2md Complete_LinkedInDataExport.zip
|
|
48
|
+
linkedin2md export.zip -o ./my-profile
|
|
49
|
+
linkedin2md export.zip --lang es
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Options
|
|
53
|
+
|
|
54
|
+
| Option | Description | Default |
|
|
55
|
+
|--------|-------------|---------|
|
|
56
|
+
| `source` | LinkedIn ZIP export file (required) | - |
|
|
57
|
+
| `-o, --output` | Output directory | `linkedin_export` |
|
|
58
|
+
| `--lang` | Output language (`en` or `es`) | `en` |
|
|
59
|
+
|
|
60
|
+
## How to Export Your LinkedIn Data
|
|
61
|
+
|
|
62
|
+
Follow these steps to download your LinkedIn data:
|
|
63
|
+
|
|
64
|
+
1. **Go to Settings**: Log into LinkedIn, click your profile photo in the top right, then select **"Settings & Privacy"**
|
|
65
|
+
|
|
66
|
+
2. **Navigate to Data Privacy**: In the left sidebar, click **"Data privacy"**
|
|
67
|
+
|
|
68
|
+
3. **Request your data**: Click **"Get a copy of your data"**
|
|
69
|
+
|
|
70
|
+
4. **Select data to download**:
|
|
71
|
+
- Choose **"Download larger data archive"** for complete data
|
|
72
|
+
- Or select specific categories if you only need certain data
|
|
73
|
+
|
|
74
|
+
5. **Request archive**: Click **"Request archive"**
|
|
75
|
+
|
|
76
|
+
6. **Wait for email**: LinkedIn will process your request and send an email when ready (usually within 24 hours, sometimes up to 72 hours for large archives)
|
|
77
|
+
|
|
78
|
+
7. **Download the ZIP file**: Click the download link in the email. The file will be named something like `Complete_LinkedInDataExport_01-20-2025.zip`
|
|
79
|
+
|
|
80
|
+
> **Note**: The download link expires after a few days. Download it promptly and store it safely.
|
|
81
|
+
|
|
82
|
+
## Output
|
|
83
|
+
|
|
84
|
+
Creates markdown files in the output directory, organized by category:
|
|
85
|
+
|
|
86
|
+
### Core Profile
|
|
87
|
+
- `profile.md` - Name, title, contact, summary
|
|
88
|
+
- `experience.md` - Work history with achievements
|
|
89
|
+
- `education.md` - Educational background
|
|
90
|
+
- `skills.md` - Professional skills
|
|
91
|
+
- `certifications.md` - Certifications and licenses
|
|
92
|
+
- `languages.md` - Language proficiencies
|
|
93
|
+
- `projects.md` - Personal and professional projects
|
|
94
|
+
|
|
95
|
+
### Recommendations & Endorsements
|
|
96
|
+
- `recommendations.md` - Recommendations received
|
|
97
|
+
- `endorsements.md` - Skill endorsements received
|
|
98
|
+
|
|
99
|
+
### Learning
|
|
100
|
+
- `learning.md` - LinkedIn Learning courses
|
|
101
|
+
- `learning_reviews.md` - Course reviews and ratings
|
|
102
|
+
|
|
103
|
+
### Network
|
|
104
|
+
- `connections.md` - Your connections
|
|
105
|
+
- `companies_followed.md` - Companies you follow
|
|
106
|
+
- `members_followed.md` - People you follow
|
|
107
|
+
- `invitations.md` - Connection invitations sent/received
|
|
108
|
+
- `imported_contacts.md` - Contacts imported from address book
|
|
109
|
+
|
|
110
|
+
### Content & Activity
|
|
111
|
+
- `posts.md` - Your posts and shares
|
|
112
|
+
- `comments.md` - Comments you made
|
|
113
|
+
- `reactions.md` - Likes and reactions
|
|
114
|
+
- `reposts.md` - Content you reposted
|
|
115
|
+
- `votes.md` - Poll votes
|
|
116
|
+
- `saved_items.md` - Bookmarked content
|
|
117
|
+
- `events.md` - Events attended
|
|
118
|
+
|
|
119
|
+
### Job Search
|
|
120
|
+
- `job_applications.md` - All job applications
|
|
121
|
+
- `saved_jobs.md` - Jobs you saved
|
|
122
|
+
- `job_preferences.md` - Job seeker preferences
|
|
123
|
+
- `saved_job_answers.md` - Saved application answers
|
|
124
|
+
- `screening_responses.md` - Screening question responses
|
|
125
|
+
- `saved_job_alerts.md` - Job alert settings
|
|
126
|
+
|
|
127
|
+
### Activity History
|
|
128
|
+
- `search_queries.md` - Search history
|
|
129
|
+
- `logins.md` - Login history
|
|
130
|
+
- `security_challenges.md` - Security verification events
|
|
131
|
+
|
|
132
|
+
### Advertising & Privacy
|
|
133
|
+
- `ads_clicked.md` - Ads you clicked
|
|
134
|
+
- `ad_targeting.md` - How LinkedIn targets ads to you
|
|
135
|
+
- `lan_ads.md` - LinkedIn Audience Network engagement
|
|
136
|
+
- `inferences.md` - LinkedIn's inferences about you
|
|
137
|
+
|
|
138
|
+
### Payments
|
|
139
|
+
- `receipts.md` - Premium subscription receipts
|
|
140
|
+
|
|
141
|
+
### Services Marketplace
|
|
142
|
+
- `service_engagements.md` - Service provider engagements
|
|
143
|
+
- `service_opportunities.md` - Service opportunities
|
|
144
|
+
|
|
145
|
+
### Identity
|
|
146
|
+
- `verifications.md` - Identity verifications
|
|
147
|
+
- `identity_assets.md` - Uploaded documents (resumes, etc.)
|
|
148
|
+
|
|
149
|
+
## Contributing
|
|
150
|
+
|
|
151
|
+
Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
MIT - see [LICENSE](LICENSE) for details.
|