kamisaku 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.
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.4.3
data/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
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
+ ### Added
11
+
12
+ ### Changed
13
+
14
+ ### Removed
@@ -0,0 +1,84 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8
+
9
+ ## Our Standards
10
+
11
+ Examples of behavior that contributes to a positive environment for our community include:
12
+
13
+ * Demonstrating empathy and kindness toward other people
14
+ * Being respectful of differing opinions, viewpoints, and experiences
15
+ * Giving and gracefully accepting constructive feedback
16
+ * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
17
+ * Focusing on what is best not just for us as individuals, but for the overall community
18
+
19
+ Examples of unacceptable behavior include:
20
+
21
+ * The use of sexualized language or imagery, and sexual attention or
22
+ advances of any kind
23
+ * Trolling, insulting or derogatory comments, and personal or political attacks
24
+ * Public or private harassment
25
+ * Publishing others' private information, such as a physical or email
26
+ address, without their explicit permission
27
+ * Other conduct which could reasonably be considered inappropriate in a
28
+ professional setting
29
+
30
+ ## Enforcement Responsibilities
31
+
32
+ Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
33
+
34
+ Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
35
+
36
+ ## Scope
37
+
38
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
39
+
40
+ ## Enforcement
41
+
42
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at sinaru@gmail.com. All complaints will be reviewed and investigated promptly and fairly.
43
+
44
+ All community leaders are obligated to respect the privacy and security of the reporter of any incident.
45
+
46
+ ## Enforcement Guidelines
47
+
48
+ Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
49
+
50
+ ### 1. Correction
51
+
52
+ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
53
+
54
+ **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
55
+
56
+ ### 2. Warning
57
+
58
+ **Community Impact**: A violation through a single incident or series of actions.
59
+
60
+ **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
61
+
62
+ ### 3. Temporary Ban
63
+
64
+ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
65
+
66
+ **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
67
+
68
+ ### 4. Permanent Ban
69
+
70
+ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
71
+
72
+ **Consequence**: A permanent ban from any sort of public interaction within the community.
73
+
74
+ ## Attribution
75
+
76
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
77
+ available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
78
+
79
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
80
+
81
+ [homepage]: https://www.contributor-covenant.org
82
+
83
+ For answers to common questions about this code of conduct, see the FAQ at
84
+ https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ ruby "3.4.3"
6
+
7
+ # Specify your gem's dependencies in kamisaku.gemspec
8
+ gemspec
9
+
10
+ gem "rake", "~> 13.0"
11
+
12
+ gem "minitest", "~> 5.0"
13
+
14
+ gem "rubocop", "1.57.2", require: false
15
+ gem "rubocop-rake", "~> 0.6.0"
16
+ gem "rubocop-minitest", "~> 0.33.0"
17
+
18
+ gem "prawn"
19
+ gem "pdfkit"
data/Gemfile.lock ADDED
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kamisaku (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.3)
10
+ bigdecimal (3.1.9)
11
+ json (2.12.0)
12
+ language_server-protocol (3.17.0.5)
13
+ matrix (0.4.2)
14
+ minitest (5.25.5)
15
+ parallel (1.27.0)
16
+ parser (3.3.8.0)
17
+ ast (~> 2.4.1)
18
+ racc
19
+ pdf-core (0.10.0)
20
+ pdfkit (0.8.7.3)
21
+ prawn (2.5.0)
22
+ matrix (~> 0.4)
23
+ pdf-core (~> 0.10.0)
24
+ ttfunk (~> 1.8)
25
+ prism (1.4.0)
26
+ racc (1.8.1)
27
+ rainbow (3.1.1)
28
+ rake (13.2.1)
29
+ regexp_parser (2.10.0)
30
+ rexml (3.4.1)
31
+ rubocop (1.57.2)
32
+ json (~> 2.3)
33
+ language_server-protocol (>= 3.17.0)
34
+ parallel (~> 1.10)
35
+ parser (>= 3.2.2.4)
36
+ rainbow (>= 2.2.2, < 4.0)
37
+ regexp_parser (>= 1.8, < 3.0)
38
+ rexml (>= 3.2.5, < 4.0)
39
+ rubocop-ast (>= 1.28.1, < 2.0)
40
+ ruby-progressbar (~> 1.7)
41
+ unicode-display_width (>= 2.4.0, < 3.0)
42
+ rubocop-ast (1.44.1)
43
+ parser (>= 3.3.7.2)
44
+ prism (~> 1.4)
45
+ rubocop-minitest (0.33.0)
46
+ rubocop (>= 1.39, < 2.0)
47
+ rubocop-rake (0.6.0)
48
+ rubocop (~> 1.0)
49
+ ruby-progressbar (1.13.0)
50
+ ttfunk (1.8.0)
51
+ bigdecimal (~> 3.1)
52
+ unicode-display_width (2.6.0)
53
+
54
+ PLATFORMS
55
+ arm64-darwin-22
56
+ x86_64-linux
57
+
58
+ DEPENDENCIES
59
+ kamisaku!
60
+ minitest (~> 5.0)
61
+ pdfkit
62
+ prawn
63
+ rake (~> 13.0)
64
+ rubocop (= 1.57.2)
65
+ rubocop-minitest (~> 0.33.0)
66
+ rubocop-rake (~> 0.6.0)
67
+
68
+ RUBY VERSION
69
+ ruby 3.4.3p32
70
+
71
+ BUNDLED WITH
72
+ 2.3.7
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2025 Sinaru Gunawardena
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
13
+ all 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
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # 📃 Kamisaku
2
+
3
+ *Build a CV PDF from a yaml text file.*
4
+
5
+ ![Kamisaku](kamisaku.png)
6
+
7
+ See [examples](/examples) directory for sample generated PDF files based of [templates](/lib/templates).
8
+
9
+ ## Usage
10
+
11
+ First we need to have a `yaml` file with the CV data. The yaml file supports following sections.
12
+
13
+ ```yaml
14
+ version: 1
15
+ profile:
16
+ name: # Your name
17
+ title: # Your current job title
18
+ about: # Some sleek details about your experience
19
+
20
+ contact:
21
+ github: # Github username
22
+ mobile: # Mobile number
23
+ email: # email address
24
+ linkedin: # Linkedin username
25
+ location:
26
+ country: # country name
27
+ city: # city name
28
+
29
+ skills:
30
+ - area: # specific skill area you are specialized in
31
+ items:
32
+ - # sub item such as a technology you have the skill in under the specialized area
33
+
34
+ experiences:
35
+ - title: # job title
36
+ organisation: # Name of the place you worked
37
+ location:
38
+ city: # city name
39
+ country: # country name
40
+ from:
41
+ month: # month number that you started
42
+ year: # year number that you started
43
+ # if following is not given, it is assumed you are still working
44
+ to:
45
+ month: # month number that you stopped
46
+ year: # year number that you stopped
47
+ skills:
48
+ - # a short name for a specialized skilled you gained
49
+ achievements:
50
+ - # Things you have achieved or did
51
+
52
+ education:
53
+ - institute: # name of the place you studied
54
+ location:
55
+ city: # city name
56
+ country: # country name
57
+ qualification: # name of the degree/diploma qualification
58
+ field: # name of the field such as Computer Science
59
+ from:
60
+ month: # month number that you started
61
+ year: # year number that you started
62
+ # if following is not given, it is assumed you are still studying
63
+ to:
64
+ month: # month number that you stopped
65
+ year: # year number that you stopped
66
+ achievements:
67
+ - # Things you have achieved or did
68
+ ```
69
+ See [examples](/examples) directory for sample generated PDF files based of [templates](/lib/templates).
70
+
71
+ ## Installation
72
+
73
+ This is a Ruby gem. So you can either install as a gem or clone the repo and use `bin/console` file run from terminal.
74
+
75
+ ### Dependency Requirement
76
+ - Ruby 3.4.3
77
+ - Ensure that [Google Chrome](https://www.google.com/chrome/) is installed.
78
+ - Chrome must be accessible from the terminal as `google-chrome`.
79
+ - Kamisaku uses Chrome's [headless mode](https://developer.chrome.com/docs/chromium/headless/) to generate PDF files.
80
+
81
+ Add this line to your application's Gemfile:
82
+
83
+ ```ruby
84
+ gem 'kamisaku'
85
+ ```
86
+
87
+ And then execute:
88
+ ```bash
89
+ $ bundle install
90
+ ```
91
+ Or install it yourself as:
92
+ ```bash
93
+ $ gem install kamisaku
94
+ ```
95
+
96
+ ## Generating PDF
97
+
98
+ ### Using terminal
99
+
100
+ Once you have the YAML text file, feed it into the `bin/console` and specify the output location.
101
+
102
+ ```bash
103
+ bin/console -c examples/john_doe.yml -o examples/plain/john_doe.pdf -t plain
104
+ ```
105
+
106
+ #### Bash options
107
+
108
+ - `-c` the YAML file
109
+ - `-o` output location for the PDF file including the name
110
+ - `-t` template to use
111
+
112
+ ## Development
113
+
114
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
115
+
116
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
117
+
118
+ ## Contributing
119
+
120
+ Bug reports and pull requests are welcome on GitHub at https://github.com/sinaru/kamisaku. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/kamisaku/blob/main/CODE_OF_CONDUCT.md).
121
+
122
+ ## License
123
+
124
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/mit).
125
+
126
+ ## Code of Conduct
127
+
128
+ Everyone interacting in the Kamisaku project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/kamisaku/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/test_*.rb"]
10
+ end
11
+
12
+ require "rubocop/rake_task"
13
+
14
+ RuboCop::RakeTask.new
15
+
16
+ task default: %i[test rubocop]
@@ -0,0 +1,157 @@
1
+ version: 1
2
+
3
+ profile:
4
+ name: John Doe
5
+ title: Senior Software Engineer
6
+ about: >
7
+ Seasoned software engineer with more than a decade of experience
8
+ in designing and developing scalable web applications. Passionate
9
+ about building clean, maintainable code and driving best practices
10
+ in software development. Experienced in leading teams, mentoring
11
+ developers, and collaborating with cross-functional teams to deliver
12
+ high-quality solutions.
13
+
14
+ contact:
15
+ github: johndoe
16
+ mobile: +44 7912345678
17
+ website: https://johndoe.dev
18
+ email: john.doe@example.com
19
+ linkedin: john-doe
20
+ location:
21
+ country: United Kingdom
22
+ city: London
23
+
24
+ skills:
25
+ - area: Development
26
+ items:
27
+ - Python
28
+ - Django
29
+ - ReactJS
30
+ - TypeScript
31
+ - Node.js
32
+ - area: Database
33
+ items:
34
+ - PostgreSQL
35
+ - MySQL
36
+ - Redis
37
+ - area: Testing
38
+ items:
39
+ - PyTest
40
+ - Jest
41
+ - Cypress
42
+ - Selenium
43
+ - area: Version Control
44
+ items:
45
+ - Git
46
+ - GitHub
47
+ - GitLab
48
+ - area: Platforms/OS
49
+ items:
50
+ - AWS
51
+ - Google Cloud
52
+ - Linux
53
+
54
+ interests:
55
+ - Yoga
56
+ - Travelling
57
+ - Photography
58
+ - Hiking
59
+ - Chess
60
+ - Reading
61
+ - Cooking
62
+ - Gardening
63
+ - Running
64
+ - Fitness
65
+ - Volunteering
66
+
67
+ experiences:
68
+ - title: Senior Software Engineer
69
+ organisation: CloudCore Solutions
70
+ location:
71
+ city: London
72
+ country: United Kingdom
73
+ from:
74
+ month: 3
75
+ year: 2021
76
+ skills:
77
+ - Django
78
+ - React
79
+ - GraphQL
80
+ - AWS Lambda
81
+ - PostgreSQL
82
+ - Docker
83
+ - Terraform
84
+ achievements:
85
+ - >
86
+ Led the migration from a monolithic system to a microservices
87
+ architecture, significantly improving scalability and performance.
88
+ - >
89
+ Designed and implemented a serverless data processing pipeline
90
+ using AWS Lambda and S3, reducing operational costs by 30%.
91
+ - Established CI/CD workflows for automated deployments and testing.
92
+
93
+ - title: Lead Backend Engineer
94
+ organisation: FinEdge Technologies
95
+ location:
96
+ city: Manchester
97
+ country: United Kingdom
98
+ from:
99
+ month: 5
100
+ year: 2018
101
+ to:
102
+ month: 2
103
+ year: 2021
104
+ skills:
105
+ - Python
106
+ - FastAPI
107
+ - PostgreSQL
108
+ - Redis
109
+ - Kafka
110
+ - Kubernetes
111
+ - Jenkins
112
+ achievements:
113
+ - >
114
+ Spearheaded the development of a real-time financial analytics
115
+ platform, handling millions of transactions per second.
116
+ - >
117
+ Improved API response times by optimizing database queries and
118
+ implementing Redis caching.
119
+ - Led a team of backend engineers, conducting code reviews and
120
+ mentoring junior developers.
121
+
122
+ - title: Software Engineer
123
+ organisation: NextGen Media
124
+ location:
125
+ city: Birmingham
126
+ country: United Kingdom
127
+ from:
128
+ month: 7
129
+ year: 2015
130
+ to:
131
+ month: 4
132
+ year: 2018
133
+ skills:
134
+ - Node.js
135
+ - Express.js
136
+ - MongoDB
137
+ - WebSockets
138
+ - AWS
139
+ achievements:
140
+ - Developed a high-traffic video streaming platform, implementing
141
+ WebSockets for real-time interactions.
142
+ - Built a recommendation engine using machine learning models to
143
+ personalize user content.
144
+ - Automated deployment processes with AWS CodePipeline and Docker.
145
+
146
+ education:
147
+ - institute: Brighton Institute of Technology
148
+ location:
149
+ city: Brighton
150
+ country: United Kingdom
151
+ qualification: Bachelor of Science in Computer Science
152
+ field: Software Engineering
153
+ to:
154
+ month: 5
155
+ year: 2013
156
+ achievements:
157
+ - Awarded a scholarship for outstanding academic performance.
Binary file
Binary file
data/kamisaku.png ADDED
Binary file
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+
5
+ module Kamisaku
6
+ module ArgParser
7
+ def self.parse!
8
+ options = {}
9
+
10
+ OptionParser.new do |parser|
11
+ parser.on("--html-debug-path HTML_OUTPUT") do |html_output|
12
+ options[:html_output] = html_output
13
+ end
14
+
15
+ parser.on("-c", "--cv-info INFO", "Require the INFO") do |cv_info|
16
+ options[:cv_info] = cv_info
17
+ end
18
+
19
+ parser.on("-o", "--output-path OUTPUT", "Require the OUTPUT") do |output_path|
20
+ options[:output_path] = output_path
21
+ end
22
+
23
+ parser.on("-t", "--template-path TEMPLATE", "Provide the TEMPLATE name") do |template|
24
+ options[:template] = template
25
+ end
26
+ end.parse!
27
+
28
+ raise OptionParser::MissingArgument.new("Provide the location of CV yaml file") if options[:cv_info].nil?
29
+ raise OptionParser::MissingArgument.new("Provide a valid path to generate the CV pdf file") if options[:output_path].nil?
30
+
31
+ options
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kamisaku
4
+ class CvData
5
+ DATA_SECTION_CLASSES = [
6
+ CvDataSection::Skill,
7
+ CvDataSection::Experience,
8
+ CvDataSection::Education,
9
+ CvDataSection::Interest
10
+ ]
11
+ def initialize(hash)
12
+ @hash = hash
13
+ end
14
+
15
+ def get_bindings
16
+ binding
17
+ end
18
+
19
+ def has?(*path)
20
+ if DATA_SECTION_CLASSES.any? { |klass| path.first.instance_of? klass }
21
+ return path.first.has?(*path[1..])
22
+ end
23
+
24
+ path_s = path.map(&:to_s)
25
+ !@hash.dig(*path_s).nil?
26
+ end
27
+
28
+ def dig(*path)
29
+ if DATA_SECTION_CLASSES.any? { |klass| path.first.instance_of? klass }
30
+ return path.first.dig(*path[1..])
31
+ end
32
+
33
+ path_s = path.map(&:to_s)
34
+ case path_s.first
35
+ when "skills"
36
+ @hash[path_s.first].each do |skill_hash|
37
+ yield CvDataSection::Skill.new(skill_hash)
38
+ end
39
+ when "experiences"
40
+ @hash[path_s.first].each do |skill_hash|
41
+ yield CvDataSection::Experience.new(skill_hash)
42
+ end
43
+ when "education"
44
+ @hash[path_s.first].each do |skill_hash|
45
+ yield CvDataSection::Education.new(skill_hash)
46
+ end
47
+ when "interests"
48
+ @hash[path_s.first].each do |skill_hash|
49
+ CvDataSection::Interest.new(skill_hash)
50
+ end
51
+ else
52
+ @hash.dig(*path_s)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CvDataSection
4
+ class Base
5
+ def initialize(hash)
6
+ @hash = hash
7
+ end
8
+
9
+ def get_bindings
10
+ binding
11
+ end
12
+
13
+ def has?(*path)
14
+ path_s = path.map(&:to_s)
15
+ data = @hash.dig(*path_s)
16
+ !data.nil?
17
+ end
18
+
19
+ def dig(*path)
20
+ path_s = path.map(&:to_s)
21
+ @hash.dig(*path_s)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CvDataSection
4
+ class Education < Base
5
+ include ParseHelper::Date
6
+
7
+ def dig(*path)
8
+ data = super
9
+ return [] if data.nil? && path.first == :achievements
10
+ return to_month(data) if path[-2..] == [:from, :month]
11
+ return to_month(data) if path[-2..] == [:to, :month]
12
+ data
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CvDataSection
4
+ class Experience < Base
5
+ include ParseHelper::Date
6
+ def dig(*path)
7
+ data = super
8
+ return [] if data.nil? && path.first == :technologies
9
+ return [] if data.nil? && path.first == :achievements
10
+ return to_month(data) if path[-2..] == [:from, :month]
11
+ return to_month(data) if path[-2..] == [:to, :month]
12
+ data
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CvDataSection
4
+ class Interest < Base
5
+ def dig(*_path)
6
+ super
7
+ end
8
+ end
9
+ end