<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DenisC</title>
    <description>The latest articles on DEV Community by DenisC (@denisc96).</description>
    <link>https://dev.to/denisc96</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3479847%2F3336012a-3f49-449f-a2ad-162b1226b284.png</url>
      <title>DEV Community: DenisC</title>
      <link>https://dev.to/denisc96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/denisc96"/>
    <language>en</language>
    <item>
      <title>Review on My Work on Scrapy</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Sat, 13 Dec 2025 04:57:16 +0000</pubDate>
      <link>https://dev.to/denisc96/review-on-my-work-on-scrapy-2p6e</link>
      <guid>https://dev.to/denisc96/review-on-my-work-on-scrapy-2p6e</guid>
      <description>&lt;p&gt;In my previous contribution to Scrapy, I worked on &lt;a href="https://github.com/scrapy/scrapy/pull/7173" rel="noopener noreferrer"&gt;code cleanup for test configuration&lt;/a&gt; as a starting point to familiarize myself with the project structure and development workflow. That work helped me understand how Scrapy organizes its test setup and how changes are validated through its testing framework.&lt;/p&gt;

&lt;p&gt;This time, I moved a step closer to Scrapy’s &lt;strong&gt;core data extraction logic&lt;/strong&gt; by working on a &lt;a href="https://github.com/scrapy/scrapy/issues/7167" rel="noopener noreferrer"&gt;refactoring task&lt;/a&gt; related to how spiders are configured. Compared to test-related cleanup, this task required a deeper understanding of how Scrapy’s internal components interact during crawling and configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Digging into Interrelated Issues
&lt;/h3&gt;

&lt;p&gt;The main goal of the &lt;a href="https://github.com/scrapy/scrapy/issues/7167" rel="noopener noreferrer"&gt;issue&lt;/a&gt; was to &lt;strong&gt;deprecate an old attribute&lt;/strong&gt; previously used to configure spiders. This attribute has been replaced by a &lt;strong&gt;list of settings&lt;/strong&gt;, which provides a more consistent and unified configuration flow across the project.&lt;/p&gt;

&lt;p&gt;To work effectively on this task, I had to explore earlier &lt;a href="https://github.com/scrapy/scrapy/issues/7038" rel="noopener noreferrer"&gt;issues&lt;/a&gt; and &lt;a href="https://github.com/scrapy/scrapy/issues/7039" rel="noopener noreferrer"&gt;pull requests&lt;/a&gt; that introduced or discussed the change. Reading through the discussions and code changes helped me understand the motivation behind the refactor, the design decisions that were already made, and the constraints I needed to respect.&lt;/p&gt;

&lt;p&gt;This experience showed me a common pattern in large projects that changes are often interrelated. Features and refactors are often split across multiple issues and pull requests, meaning contributors must spend significant time studying project history. While this increases the initial learning curve, it also ensures that changes remain consistent and well thought out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working on the Issue
&lt;/h3&gt;

&lt;p&gt;After studying the issue and related discussions, I realized that the refactor involved more than just modifying class definitions. I also needed to &lt;strong&gt;update existing tests&lt;/strong&gt; so that they validated the new settings list instead of relying on the deprecated attribute.&lt;/p&gt;

&lt;p&gt;To make my approach clear, I created a &lt;strong&gt;draft pull request&lt;/strong&gt; outlining my plan and progress. This made my work transparent and allowed others to follow my reasoning early on.&lt;/p&gt;

&lt;p&gt;During implementation, I relied on tools like &lt;code&gt;git grep&lt;/code&gt; to locate all relevant references to the deprecated attribute. This ensured that the refactor was thorough and consistent across the codebase. After completing the changes, I updated the &lt;a href="https://github.com/scrapy/scrapy/pull/7175" rel="noopener noreferrer"&gt;pull request&lt;/a&gt; summary to explain what was changed, making it ready for review.&lt;/p&gt;

&lt;p&gt;After receiving the &lt;a href="https://github.com/scrapy/scrapy/pull/7175#issuecomment-3659396091" rel="noopener noreferrer"&gt;maintainer's comment&lt;/a&gt;, I further explained the rationale of changes and the logical flow of the updated codes. The maintainer later suggested that it would be better if &lt;a href="https://github.com/scrapy/scrapy/issues/6660" rel="noopener noreferrer"&gt;another issue&lt;/a&gt; is tackled first, so the pull request is kept open at this stage. Although the pull request has not been merged, the work I've done and the discussion may provide some insight to other contributors, or even my future self.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflection on My Work on Scrapy
&lt;/h3&gt;

&lt;p&gt;Through this contribution, I’ve become more comfortable working with &lt;strong&gt;large and complex codebases&lt;/strong&gt;. I’ve learned that progress in such projects is incremental, as the saying goes, Rome wasn’t built in a day. Understanding comes gradually through repeated exposure, patience, and continuous effort.&lt;/p&gt;

&lt;p&gt;This experience also reinforced the importance of &lt;strong&gt;refactoring and cleanup&lt;/strong&gt;. These maintenance tasks are essential for long-term project sustainability, especially as project requirements evolve and programming languages introduce new features or deprecate old ones. Without careful maintenance, projects risk being overwhelmed by technical debt or falling victim to problems like the &lt;a href="https://en.wikipedia.org/wiki/Second-system_effect" rel="noopener noreferrer"&gt;second-system effect&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking back at my initial expectations, I’m glad that I was able to improve Scrapy’s code readability and maintainability. At the same time, I now better understand that fully grasping a project of this size is a long-term process. I plan to continue contributing to Scrapy and using it in the future to deepen my understanding further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Review of My Open Source Journey
&lt;/h3&gt;

&lt;p&gt;Since September this year, I’ve been actively involved in the open source community. My journey started with working on &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;my own projects&lt;/a&gt; and collaborating with &lt;a href="https://github.com/Jongwan93/Repo_Code_packager" rel="noopener noreferrer"&gt;my classmate&lt;/a&gt;, then gradually expanded to contributing to public open source repositories on GitHub.&lt;/p&gt;

&lt;p&gt;I began with smaller contributions such as &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/986" rel="noopener noreferrer"&gt;bug fixes&lt;/a&gt;, &lt;a href="https://github.com/januschung/math-worksheet-generator/pull/52" rel="noopener noreferrer"&gt;adding features&lt;/a&gt;, and &lt;a href="https://github.com/Jongwan93/Repo_Code_packager/pull/19" rel="noopener noreferrer"&gt;writing tests&lt;/a&gt;, which helped me understand contribution workflows and project structures. Over time, I took on more involved tasks like &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/990" rel="noopener noreferrer"&gt;deprecating older Python version&lt;/a&gt;, &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018" rel="noopener noreferrer"&gt;optimizing test&lt;/a&gt;, and eventually &lt;a href="https://github.com/scrapy/scrapy/pull/7173" rel="noopener noreferrer"&gt;refactoring code in larger project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Working on open source has consistently challenged me to step outside my comfort zone. By progressing from small fixes to more complex refactors, I can clearly see my growth in both programming and problem-solving skills.&lt;/p&gt;

&lt;p&gt;Open source projects are a valuable learning resource, especially for beginners. They provide opportunities to learn from experienced developers across diverse domains. I plan to continue my open source journey, sharpen my technical skills, and build meaningful connections within the community. Looking forward to contributing to impactful projects in the future!&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Progress Updates on Contribution to Scrapy</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 11 Dec 2025 05:46:02 +0000</pubDate>
      <link>https://dev.to/denisc96/progress-updates-on-contribution-to-scrapy-21mb</link>
      <guid>https://dev.to/denisc96/progress-updates-on-contribution-to-scrapy-21mb</guid>
      <description>&lt;p&gt;Last week, I worked on code refactoring in &lt;a href="https://github.com/scrapy/scrapy" rel="noopener noreferrer"&gt;Scrapy&lt;/a&gt;, which is an essential practice in larger and more complex projects. Refactoring not only improves code maintainability but also makes it easier for other contributors to understand and extend the project. This task was a good starting point for me to verify that I had the Scrapy project correctly set up locally, as refactoring of codes should not break existing functionalities.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the Issue
&lt;/h3&gt;

&lt;p&gt;The issue I worked on is &lt;a href="https://github.com/scrapy/scrapy/issues/7141" rel="noopener noreferrer"&gt;#7141&lt;/a&gt;, which aimed to refactor the multiple autouse fixtures used for &lt;code&gt;pytest.skip()&lt;/code&gt; in &lt;code&gt;conftest.py&lt;/code&gt; into a single pytest hook. The original code had multiple small fixtures that checked for specific markers and optional dependencies, which made the code harder to maintain and less readable.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Have Done
&lt;/h3&gt;

&lt;p&gt;To tackle this issue, I first studied the use of autouse fixtures and pytest hooks in Python, which I wasn’t very familiar with before. I learned how pytest hooks could centralize repetitive logic and how they interact with test markers and configuration options.&lt;/p&gt;

&lt;p&gt;I then refactored the multiple autouse fixtures into a single &lt;code&gt;pytest_runtest_setup&lt;/code&gt; hook, which checks for reactor-specific markers and optional dependencies. Instead of importing modules and deleting them as in the original code, I used &lt;code&gt;importlib.import_module()&lt;/code&gt; to dynamically import modules only when needed to make the codes more concise.&lt;/p&gt;

&lt;p&gt;To ensure my changes did not break existing tests, I used &lt;code&gt;tox&lt;/code&gt; to run the test suite locally, before eventually submitted my &lt;a href="https://github.com/scrapy/scrapy/pull/7173" rel="noopener noreferrer"&gt;pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learnt and Future Plan
&lt;/h3&gt;

&lt;p&gt;This task reinforced the importance of code cleanup, especially in large projects, to reduce technical debt and improve readability and maintainability. I also learnt the significance of reading and following the contribution guide, which may vary between repos. For example, in Scrapy, concise commit messages and installing pre-commit hooks before submitting a pull request are essential practices. I noticed that some contributors overlook these guidelines, and maintainers frequently remind them, which highlighted the importance of carefully following project norms.&lt;/p&gt;

&lt;p&gt;Looking ahead, I realize that understanding the full crawling process in Scrapy is more complex and time-consuming than I initially thought, but I am eager to continue contributing. My goal is to work on issues related to the core crawling logic, allowing me to gradually deepen my understanding of the framework.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Contributing to Larger Open Source Project - Scrapy</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Sun, 07 Dec 2025 03:51:30 +0000</pubDate>
      <link>https://dev.to/denisc96/contributing-to-larger-open-source-project-scrapy-g84</link>
      <guid>https://dev.to/denisc96/contributing-to-larger-open-source-project-scrapy-g84</guid>
      <description>&lt;p&gt;In the past three months, I worked on various open source projects, including my own project &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;Repo Context Packager&lt;/a&gt;, &lt;a href="https://github.com/januschung/math-worksheet-generator" rel="noopener noreferrer"&gt;Math Worksheet Generator&lt;/a&gt; and &lt;a href="https://github.com/niccokunzmann/open-web-calendar" rel="noopener noreferrer"&gt;Open Web Calendar&lt;/a&gt;. This month, I want to challenge myself to work on a larger and more widely used project - &lt;a href="https://github.com/scrapy/scrapy" rel="noopener noreferrer"&gt;Scrapy&lt;/a&gt;, a Python module for web crawling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I chose Scrapy
&lt;/h3&gt;

&lt;p&gt;By working on several issues in &lt;a href="https://github.com/niccokunzmann/open-web-calendar" rel="noopener noreferrer"&gt;Open Web Calendar&lt;/a&gt;, I've gained experience in working on Python project with a comprehensive test suite and continuous integration. I want to push myself further so I tried to find a larger Python project to work on. Besides, I want to find a project that I would use on a regular basis. One of the topics I'm interested in is web crawling, and I do need to extract data from online sources sometimes for statistical analysis. I then searched for "open source web scraper", and found Scrapy, which happens to be a great choice that satisfies all the criteria, with a large user base, plenty of issues to work on, and a well organized program structure. &lt;/p&gt;

&lt;h3&gt;
  
  
  My Work Plan
&lt;/h3&gt;

&lt;p&gt;I will begin by carefully reading Scrapy’s &lt;a href="https://docs.scrapy.org/en/latest/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; and &lt;a href="https://docs.scrapy.org/en/latest/contributing.html" rel="noopener noreferrer"&gt;contribution guidelines&lt;/a&gt; to understand its core concepts, project structure, and coding standards. Next, I will install Scrapy locally and experiment with building a few small crawling projects, which will help me better understand how Scrapy components work together in practice. After gaining familiarity with both the documentation and actual usage, I will start exploring the &lt;a href="https://github.com/scrapy/scrapy/issues" rel="noopener noreferrer"&gt;issues&lt;/a&gt; on Scrapy’s GitHub repository. Since there are hundreds of open issues, I should be able to pick some issues that I'm interested in. Eventually, I should be able to submit pull requests following Scrapy’s contribution process and improve my work based on feedback from maintainers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expected Outcomes
&lt;/h3&gt;

&lt;p&gt;Through contributing to Scrapy, I expect to gain a deeper understanding of web crawling and data extraction, by learning how professional programmers design crawlers to handle data extraction efficiently. Another important outcome is being able to directly improve Scrapy itself, By fixing bugs, enhancing features, or improving documentation, I can contribute to a tool that is widely used by developers around the world, which is both meaningful and motivating. Finally, I aim to become a long-term Scrapy user. After becoming comfortable with the framework, I plan to use it for real data extraction tasks related to my own research and statistical analysis, making it a core tool in my future projects.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Packaging my Open Source Project - Release 1.0.0</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Mon, 24 Nov 2025 06:43:52 +0000</pubDate>
      <link>https://dev.to/denisc96/packaging-my-open-source-project-release-100-5h7e</link>
      <guid>https://dev.to/denisc96/packaging-my-open-source-project-release-100-5h7e</guid>
      <description>&lt;p&gt;This week, I finally published &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;my project&lt;/a&gt; to PyPI. I relied heavily on the &lt;a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/" rel="noopener noreferrer"&gt;official Python packaging tutorial&lt;/a&gt;, using hatchling as the build backend and publishing through PyPI. Following the recommended modern workflow, I generated the distribution archives using &lt;code&gt;python3 -m build&lt;/code&gt; and uploaded them with &lt;code&gt;twine&lt;/code&gt;, after creating a PyPI account and configuring an API token.&lt;/p&gt;

&lt;p&gt;Before any of that could happen, I needed to restructure my project to match the standard packaging format. This meant placing the actual source code inside a &lt;code&gt;src/&lt;/code&gt; directory and creating another package folder inside it, renamed as &lt;code&gt;src/repo_context_packager&lt;/code&gt;. I also ensured the project root contained essential files such as &lt;code&gt;LICENSE&lt;/code&gt; and &lt;code&gt;README.md&lt;/code&gt;, and I created a &lt;code&gt;pyproject.toml&lt;/code&gt; file to define the build system and project metadata. With these pieces in place, I was able to build the wheel and source distribution and prepare them for upload.&lt;/p&gt;

&lt;p&gt;The most frustrating part of the process came from re-organizing the file structure. Moving the package from &lt;code&gt;src/&lt;/code&gt; directly into &lt;code&gt;src/repo_context_packager&lt;/code&gt; meant that several parts of the project had to be updated. All internal imports needed to reference the new path, test files that depended on relative imports had to be adjusted, and usage instructions in the &lt;code&gt;README&lt;/code&gt; required rewrites as well. Even GitHub workflow files were affected because they referenced specific paths for testing and packaging. Although the changes were not complicated, together they required careful attention to ensure nothing broke.&lt;/p&gt;

&lt;p&gt;After the initial release, I also received useful feedback from early users. Someone pointed out that I had misspelled &lt;code&gt;requirements.txt&lt;/code&gt; as &lt;code&gt;requirement.txt&lt;/code&gt; in my installation command, which I quickly corrected. Another issue was that I had forgotten to update a path in the usage instructions after moving my files. The README originally told users to copy a template TOML file into &lt;code&gt;src/&lt;/code&gt;, but the correct destination after restructuring was &lt;code&gt;src/repo_context_packager/&lt;/code&gt;. I updated the documentation to reflect this so new users would not run into errors.&lt;/p&gt;

&lt;p&gt;If you want to try the package, there are several easy ways to access it. It can be downloaded directly from &lt;a href="https://pypi.org/project/repo-context-packager/1.0.0/" rel="noopener noreferrer"&gt;PyPI page&lt;/a&gt;, installed via the command &lt;code&gt;pip install repo-context-packager==1.0.0&lt;/code&gt;, or obtained by cloning the &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. Once the package is installed or downloaded, you can follow the instructions in the README to get started. Feel free to file an issue if you find any bugs or have any suggestion!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Contributing to Optimization in Open Source Project</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 20 Nov 2025 05:09:57 +0000</pubDate>
      <link>https://dev.to/denisc96/contributing-to-optimization-in-open-source-project-2fap</link>
      <guid>https://dev.to/denisc96/contributing-to-optimization-in-open-source-project-2fap</guid>
      <description>&lt;p&gt;I continue working on &lt;a href="https://github.com/niccokunzmann/open-web-calendar/" rel="noopener noreferrer"&gt;Open Web Calendar&lt;/a&gt; after I resolved an &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/953" rel="noopener noreferrer"&gt;issue&lt;/a&gt; to deprecate Python 3.9. This time, I try to work on another type of issue that I've never done before - &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/983" rel="noopener noreferrer"&gt;optimization of documentation build for testing&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the issue
&lt;/h3&gt;

&lt;p&gt;The issue is to add a quick documentation build for testing, by introducing a MkDocs configuration file (&lt;code&gt;mkdocs.test.yml&lt;/code&gt;) that inherits from the main &lt;a href="https://github.com/niccokunzmann/open-web-calendar/blob/master/mkdocs.yml" rel="noopener noreferrer"&gt;&lt;code&gt;mkdocs.yml&lt;/code&gt;&lt;/a&gt;. Using this configuration file, documentations should be built in only English and one more well-translated language using &lt;a href="https://www.mkdocs.org/" rel="noopener noreferrer"&gt;MkDocs&lt;/a&gt;, unlike building documentations in full set of languages as specified in &lt;code&gt;mkdocs.yml&lt;/code&gt;. The quick documentation build should be incorporated in a new &lt;code&gt;tox&lt;/code&gt; test, which will be integrated into GitHub Action specified in &lt;a href="https://github.com/niccokunzmann/open-web-calendar/blob/master/.github/workflows/run-tests.yml" rel="noopener noreferrer"&gt;&lt;code&gt;run-tests.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The progress of problem solving
&lt;/h3&gt;

&lt;p&gt;As I have not handled similar issues before, I didn't know how much time I would spend on this issue, but I wanted to let the maintainer and the community know that I was working on the issue and show my progress. This was the perfect scenario to create a draft pull request, to allow the community to check my work in progress while preventing accidental merges. I made the draft pull request after pushing the &lt;code&gt;mkdocs.test.yml&lt;/code&gt; file, indicating the work done and to be done, as shown in the image below.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8z5hcpyqi0h65v54dut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8z5hcpyqi0h65v54dut.png" alt="draft pull request" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The remaining work was to update &lt;code&gt;tox.ini&lt;/code&gt; and &lt;code&gt;.github/workflows/run-test.yml&lt;/code&gt; for the new documentation build as suggested by the maintainer in the issue. Given my limited knowledge to &lt;code&gt;tox&lt;/code&gt; and Github workflow, I had to do some research on how to change the files. I also found it useful to make reference to existing codes, not only could I make my codes more consistent, the codes also provided templates and comments that indicate the subtle details I should beware of. Making reference to existing codes while researching along the way, I was able to add the refined documentation build to &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-ef2cef9f88b4fe09ca3082140e67f5ad34fb65fb6e228f119d3812261ae51449" rel="noopener noreferrer"&gt;&lt;code&gt;tox.ini&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-7314d0ebbd2e9537ae4889316745b4fd2fa43cb86275c9caae18a86ba228b642" rel="noopener noreferrer"&gt;&lt;code&gt;run-test.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Errors often pop up in the progress of solving an issue, this time is no exception. The first error I encountered was the failure to build the documentations with the new &lt;code&gt;tox&lt;/code&gt; command, but thanks to the detailed logging from &lt;code&gt;tox&lt;/code&gt;, I was able to locate the incompatible dependency that blocks the build, and fix it accordingly. Everything seemed to run well, I pushed my codes and they passed the check by GitHub Actions, including the new documentation build test I added in &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-7314d0ebbd2e9537ae4889316745b4fd2fa43cb86275c9caae18a86ba228b642" rel="noopener noreferrer"&gt;&lt;code&gt;run-tests.yml&lt;/code&gt;&lt;/a&gt;, but something was still bugging me... &lt;/p&gt;

&lt;p&gt;The documentation build I added was way quicker than the original build, the full documentation build for all languages (30+) took 24 mins, but my new documentation build for 2 languages only took around 10 seconds, which was disproportionate, and the pages were not properly translated. The &lt;code&gt;tox&lt;/code&gt; command and GitHub Action worked fine, so I suspected that the &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-a1d6ca4d5ff7a6351051df909697e51c5ac91a0ddc5c77f846003b7ac0fdb8fd" rel="noopener noreferrer"&gt;&lt;code&gt;mkdocs.test.yml&lt;/code&gt;&lt;/a&gt;, which I created at the beginning, was the source of problem.&lt;/p&gt;

&lt;p&gt;Luckily, I got a hint from the maintainer, who provided a link about &lt;a href="https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance" rel="noopener noreferrer"&gt;configuration inheritance&lt;/a&gt; in the &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/983" rel="noopener noreferrer"&gt;issue&lt;/a&gt; he posted. It turned out that I had to use the key/value pair syntax for the &lt;strong&gt;plugins&lt;/strong&gt; option in both parent and child configuration file, in order to override the values, which were the language list in this case. I thereby made changes to both &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-a1d6ca4d5ff7a6351051df909697e51c5ac91a0ddc5c77f846003b7ac0fdb8fd" rel="noopener noreferrer"&gt;&lt;code&gt;mkdocs.test.yml&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018/files#diff-98d0f806abc9af24e6a7c545d3d77e8f9ad57643e27211d7a7b896113e420ed2" rel="noopener noreferrer"&gt;&lt;code&gt;mkdocs.yml&lt;/code&gt;&lt;/a&gt;, tested the new documentation build in local machine, and got the translated pages in 2 ~ 3 mins build time, which was proportional to the original build. &lt;/p&gt;

&lt;p&gt;Eventually, I pushed all my changes, passed the GitHub Actions check, edited the summary of changes, and changed &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/1018" rel="noopener noreferrer"&gt;my pull request&lt;/a&gt; to "ready for review" for the maintainer's acceptance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons learnt
&lt;/h3&gt;

&lt;p&gt;First of all, I have learnt the importance of making the work transparent to the open source community, even if the work is still in progress. This prevent the case of different people working on the same issue redundantly, while allowing others to know the progress and check the work in case things go wrong. &lt;/p&gt;

&lt;p&gt;Moreover, I realized that there was no single best way to find solutions. We often have to find different sources, such as the official documentation, existing code references, and discussion on forum, to cross-check the finding and validate the solutions, as the answers from different sources may be different and sometimes mistaken. &lt;/p&gt;

&lt;p&gt;After working on &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/983" rel="noopener noreferrer"&gt;this&lt;/a&gt; and &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/953" rel="noopener noreferrer"&gt;my last&lt;/a&gt; issue on &lt;a href="https://github.com/niccokunzmann/open-web-calendar/" rel="noopener noreferrer"&gt;Open Web Calendar&lt;/a&gt;, I have known more about the file structure, general workflow, and maintenance work of open source projects, and gained confidence in solving unfamiliar issues while acquiring new set of knowledge in the future. Looking forward to solving new issues in the next few weeks!&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Continued Journey on Open Source Projects - Deprecate Python 3.9</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Mon, 17 Nov 2025 02:05:39 +0000</pubDate>
      <link>https://dev.to/denisc96/continued-journey-on-open-source-projects-deprecate-python-39-5fi7</link>
      <guid>https://dev.to/denisc96/continued-journey-on-open-source-projects-deprecate-python-39-5fi7</guid>
      <description>&lt;p&gt;My journey on open source projects doesn't stop after making four pull requests for Hacktoberfest last month. Contrary to finding different repos to work on different issues in Hacktoberfest, I'm focusing on one repo this time, namely &lt;a href="https://github.com/niccokunzmann/open-web-calendar" rel="noopener noreferrer"&gt;Open Web Calendar&lt;/a&gt;. It is a well organized and maintained repo I worked on in Hacktoberfest, with rigorous tests and Continuous Integration(CI).&lt;/p&gt;

&lt;h3&gt;
  
  
  The issue I worked on
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/953" rel="noopener noreferrer"&gt;The issue&lt;/a&gt; I worked on is to deprecate Python 3.9, which reaches its End of Life in Oct 2025. The maintainer posted this issue giving a direction of what need to be changed, and mentioning the rationale for this issue, which is to remove Python 3.9 form tests in order to update dependencies which has deprecate Python 3.9.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges I faced
&lt;/h3&gt;

&lt;p&gt;The first challenge I faced was to understand the project structure. The issue is different from the issues I previously worked on, such as bug fixing and implementing new features, which allowed me to only focus on a part of the codes. This issue instead requires understanding the structure of the whole projects, then searching for relevant files and making changes accordingly. To get a better understanding on the repo, I used &lt;a href="https://repomix.com/" rel="noopener noreferrer"&gt;Repomix&lt;/a&gt;, a tool I studied in previously lab, to pack the info of the repo into an .xml file and send it to AI to get a brief summary of the project structure. &lt;/p&gt;

&lt;p&gt;After understanding the project structure, I had to figure out which files should be changed. Based on the brief explanation from the maintainer, I did some research on how to handle deprecating a programming language version in open source project, and was able to narrow down the scope of changes to the following files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;documentation which mention the use of Python 3.9, located in &lt;a href="https://github.com/niccokunzmann/open-web-calendar/tree/master/docs/dev" rel="noopener noreferrer"&gt;docs/dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;yml files in &lt;a href="https://github.com/niccokunzmann/open-web-calendar/tree/master/.github/workflows" rel="noopener noreferrer"&gt;.github/workflows&lt;/a&gt;, which controls the CI process&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/niccokunzmann/open-web-calendar/blob/master/tox.ini" rel="noopener noreferrer"&gt;tox.ini&lt;/a&gt;, configuration file for &lt;code&gt;tox&lt;/code&gt;, the tool used in Python testing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/niccokunzmann/open-web-calendar/blob/master/pyproject.toml" rel="noopener noreferrer"&gt;pyproject.toml&lt;/a&gt;, configuration file for the project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most tedious process was to find which part of the files should be changed. I used different approaches to do it, which include checking relevant files one by one manually, and use commands such as &lt;code&gt;git grep py39&lt;/code&gt;. I had to pay careful attentions to spot out and remove Python 3.9 in the files, as Python 3.9 might appear in different forms, such as &lt;code&gt;py39&lt;/code&gt;, &lt;code&gt;python: ["3.9", ...]&lt;/code&gt;, and &lt;code&gt;python3.9&lt;/code&gt;. Moreover, as the maintainer intended to just remove the tests for Python 3.9 while still allowing users to install the app with Python 3.9, I cannot blindly erase all &lt;code&gt;py39&lt;/code&gt; syntax. For example, &lt;code&gt;requires-python = "&amp;gt;=3.9"&lt;/code&gt; in pyproject.toml was kept.&lt;/p&gt;

&lt;p&gt;After checking all the .yml in .github/workflows/, .md in docs/dev/, tox.ini and pyproject.toml and making relevant changes, I committed those changes, but new problems arose. As &lt;code&gt;ruff&lt;/code&gt; now is run based on Python 3.10 instead of 3.9, syntax in some of the .py files need to be changed. Luckily, the logs from ruff clearly gave hints to fix the syntax, so I changed the syntax accordingly, pushed the codes, and made a &lt;a href="https://github.com/niccokunzmann/open-web-calendar/pull/990" rel="noopener noreferrer"&gt;pull request&lt;/a&gt;, which was eventually accepted by the maintainer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons learnt
&lt;/h3&gt;

&lt;p&gt;First, I've learnt the importance of utilizing tools, which can save a lot of time in software development. From automation tools such as GitHub Actions and &lt;code&gt;tox&lt;/code&gt;, to linter such as &lt;code&gt;ruff&lt;/code&gt;, an even &lt;code&gt;Repomix&lt;/code&gt; I used in the process of solving the issues, all these tools smoothen the software development process in different aspects, from running tests, fixing syntax, and solving an issue. &lt;br&gt;
Moreover, I have become more confident in solving an issues before I have full knowledge about the issues. Unprecedented issues may arise when we are working on an issue, just like how the ruff check failed at the first time, but clues will appear in the progress, and community such as the maintainer and other developers will offer a helping hand. Finally, I now better appreciate the importance of clear logging. On one hand, the logging from ruff guided me in fixing the syntax. On the other hand, my efforts in writing clear commit messages and summary of changes were acknowledged by the maintainer, who could therefore quickly understand and approve the changes.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Setting Up GitHub Actions CI Workflow for My Open Source Project</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 13 Nov 2025 06:20:46 +0000</pubDate>
      <link>https://dev.to/denisc96/setting-up-github-actions-ci-workflow-for-my-open-source-project-2g4a</link>
      <guid>https://dev.to/denisc96/setting-up-github-actions-ci-workflow-for-my-open-source-project-2g4a</guid>
      <description>&lt;p&gt;After writing tests for &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;my open source project&lt;/a&gt; last week, I've set up CI Workflow with GitHub Actions this week, to better protect my repo and automate the testing process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the Workflow
&lt;/h3&gt;

&lt;p&gt;I set up a GitHub Actions CI workflow by navigating to the “Actions” tab on my repository page in GitHub. From there, I selected a Python application workflow template, which gave me a starting point for automating testing my code.&lt;/p&gt;

&lt;p&gt;The workflow is defined in a YAML file located at &lt;a href="https://github.com/DenisC96/Repo-Context-Packager/blob/main/.github/workflows/python-app.yml" rel="noopener noreferrer"&gt;.github/workflows/python-app.yml&lt;/a&gt;, which includes steps like checking out the repository, setting up Python, installing dependencies, linting the code, and running tests. The file configures the workflow to automatically run whenever code is pushed to the main branch or a pull request targets it, ensuring that the codes are linted and tested consistently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges When Creating the Workflow
&lt;/h3&gt;

&lt;p&gt;The workflow didn’t pass at first due to some file naming and structure conventions. For instance, my &lt;code&gt;requirements.txt&lt;/code&gt; file was originally named &lt;code&gt;requirement.txt&lt;/code&gt; (missing the "s"), so the line:   &lt;code&gt;if [ -f requirements.txt ]; then pip install -r requirements.txt; fi&lt;/code&gt;&lt;br&gt;
could not find the file. Renaming the file name to requirements.txt fixed the issue.&lt;/p&gt;

&lt;p&gt;Similarly, the tests were initially in a single file called &lt;code&gt;test.py&lt;/code&gt;. Pytest could not detect this file automatically. At first, I changed the workflow step to: &lt;code&gt;pytest src/test.py -v&lt;/code&gt; to make it work. However, I wanted to follow best practices, so I moved the tests into a &lt;code&gt;tests/&lt;/code&gt; directory and split them into &lt;code&gt;test_content_writer.py&lt;/code&gt; and &lt;code&gt;test_util.py&lt;/code&gt;. Moving the tests also required setting the &lt;code&gt;PYTHONPATH&lt;/code&gt; environment variable in the workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.workspace }}/src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allowed the tests to access the code in the src/ folder. With these changes, the workflow passed using the simple pytest -v command, and the project now follows proper Python conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing Tests for Others
&lt;/h3&gt;

&lt;p&gt;Beside setting up CI workflow for my repo, I also wrote &lt;a href="https://github.com/Jongwan93/Repo_Code_packager/pull/19" rel="noopener noreferrer"&gt;tests&lt;/a&gt; for &lt;a href="https://github.com/Jongwan93/Repo_Code_packager" rel="noopener noreferrer"&gt;my classmate’s repo&lt;/a&gt;, which introduced additional challenges. The project's modules were organized differently from mine, so I had to carefully read through the codes to understand how different components interacted before writing the tests. For instance, I used &lt;code&gt;unittest&lt;/code&gt; in my project, while my classmate used &lt;code&gt;pytest&lt;/code&gt; module when writing the test, and there were subtle differences in the test files. I also had to study the logic of the codes carefully before writing the tests, to ensure that the tests correctly check for the function's intent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons learnt from CI Workflow
&lt;/h3&gt;

&lt;p&gt;I have learnt that CI workflow is a great way to provide automatic testing, where every push and pull request triggers tests to catch errors early. It's great that it gives developers immediate notifications when the workflow breaks, just like how I received the emails about failure of PR run when I was setting up the workflow. It can also promotes better team collaboration by using standardized workflows that reduce integration issues across multiple contributors.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>python</category>
    </item>
    <item>
      <title>Writing Unit Tests for My Open Source Project</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Mon, 10 Nov 2025 06:10:04 +0000</pubDate>
      <link>https://dev.to/denisc96/writing-unit-tests-for-my-open-source-project-33j3</link>
      <guid>https://dev.to/denisc96/writing-unit-tests-for-my-open-source-project-33j3</guid>
      <description>&lt;p&gt;Writing unit tests is an essential practice for ensuring code quality, reliability, and maintainability. This week, I wrote test cases for &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;my open source project&lt;/a&gt; in Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I chose &lt;code&gt;unittest&lt;/code&gt; framework
&lt;/h3&gt;

&lt;p&gt;I chose &lt;code&gt;unittest&lt;/code&gt; framework because it is included in Python standard library, which means there is no need to install external dependencies. It provides a structured way to write tests using classes, and a variety of assertions, which makes it easier to compare expected and actual results. Moreover, &lt;code&gt;unittest&lt;/code&gt; has a well established community and &lt;a href="https://docs.python.org/3/library/unittest.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, making it easy to learn and find examples when needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I set up the tests
&lt;/h3&gt;

&lt;p&gt;To set up testing in my project, I first created a test.py file to keep all my test cases organized. I imported the necessary unittest module, and other modules when writing the tests, such as tempfile, os, time, Path from pathlib, as well as the modules from my project, namely util and ContentWriter. I also organized the tests into two classes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TestUtil, for testing utility functions in util.py&lt;/li&gt;
&lt;li&gt;TestContentWriter, for testing methods in ContentWriter in content_writer.py
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, I wrote individual test methods for each function, to include the valid, invalid, and edge cases. Once the tests were written, I could run them all at once with the command &lt;code&gt;python3 -m unittest test.py -v&lt;/code&gt;, which provided a clear report of which tests passed or failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Difficulties writing the tests
&lt;/h3&gt;

&lt;p&gt;I initially struggled with finding the right modules and functions to use in my tests. For instance, I had to research the tempfile module to create temporary files and directories safely. I also learned how to use os.utime() to modify file timestamps in order to test the is_recently_modified() function. These challenges show the importance of searching the right tools in testing, not only the testing framework, but also modules that are useful in testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons learnt
&lt;/h3&gt;

&lt;p&gt;Overall, the process of writing tests demonstrates the value of testing in software development. It forced me to think about edge cases I might have overlooked and gave me confidence that my code behaves as expected. Using &lt;code&gt;unittest&lt;/code&gt; is straightforward and powerful enough for the needs of this project. From this experience, I have learned that testing should be an essential part of every project, and I plan to study how to automate the testing process in future projects to maintain code quality and catch bugs early.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Hacktoberfest Recap - A Month of Open Source Learning</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 30 Oct 2025 21:34:11 +0000</pubDate>
      <link>https://dev.to/denisc96/hacktoberfest-recap-4p9p</link>
      <guid>https://dev.to/denisc96/hacktoberfest-recap-4p9p</guid>
      <description>&lt;p&gt;After a month of coding, debugging, learning, and contributing, Hacktoberfest has finally come to an end. Throughout the month, I made four pull requests across different repositories, each focusing on a different aspect of open-source contribution, from bug fixing to adding new features and writing tests. Looking back, this month has not only improved my technical skills, but also deepened my understanding of collaboration and project management in open source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exploring and Getting Started
&lt;/h3&gt;

&lt;p&gt;In the beginning, the biggest challenge wasn’t the coding itself but finding the right repository to contribute to. With countless projects labeled #Hacktoberfest, I learned to filter by activity and relevance, by looking for well-maintained projects where my contribution would be meaningful. My &lt;a href="https://github.com/amitmerchant1990/notepad/pull/58" rel="noopener noreferrer"&gt;first pull request&lt;/a&gt; was for a &lt;a href="https://github.com/amitmerchant1990/notepad" rel="noopener noreferrer"&gt;Notepad web app&lt;/a&gt;, where I improved the title case conversion function. This first experience gave me confidence and a sense of accomplishment, proving that even small improvements can make a difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diving Deeper into Bug Fixing
&lt;/h3&gt;

&lt;p&gt;In my second week, I shifted my focus to fixing &lt;a href="https://github.com/niccokunzmann/open-web-calendar/issues/951" rel="noopener noreferrer"&gt;a reported issue&lt;/a&gt; in the &lt;a href="https://github.com/niccokunzmann/open-web-calendar" rel="noopener noreferrer"&gt;Open Web Calendar project&lt;/a&gt;. This time, the work required setting up a complex Python development environment and understanding the project’s structure. Although only a few lines of code were changed, the process taught me the importance of documentation and testing. I realized that debugging isn’t just about finding errors, it’s about understanding how all parts of the system interact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding a New Feature
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/januschung/math-worksheet-generator/pull/52" rel="noopener noreferrer"&gt;third pull request&lt;/a&gt; was both challenging and rewarding. I contributed to a &lt;a href="https://github.com/januschung/math-worksheet-generator" rel="noopener noreferrer"&gt;Math Worksheet Generator&lt;/a&gt; by adding a new front page with a date, name, and score section, plus an optional title feature. To do this, I had to learn how to use the fpdf library from scratch. This experience taught me that we don’t need to master every tool entirely, focusing on the relevant parts is often enough to create something valuable. It was also my first time proposing and implementing a feature that wasn’t previously assigned, showing me how initiative can lead to meaningful contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing Tests
&lt;/h3&gt;

&lt;p&gt;For my &lt;a href="https://github.com/januschung/math-worksheet-generator/pull/55" rel="noopener noreferrer"&gt;final pull request&lt;/a&gt;, I focused on writing a new test case for the same &lt;a href="https://github.com/januschung/math-worksheet-generator" rel="noopener noreferrer"&gt;Math Worksheet Generator project&lt;/a&gt;. This involved identifying missing test coverage, ensuring random question generation worked properly, and learning to maintain consistent coding style. I also learned a valuable lesson about Git branching after mistakenly branching off the wrong branch, I had to redo part of the work. This experience shows the importance of version control awareness when working on multiple contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Reflection
&lt;/h3&gt;

&lt;p&gt;Hacktoberfest has been a month of growth, patience, and discovery. I learned that contributing to open source isn’t only about writing code, but also about communication, organization, and adaptation to each project's own tools and ways of thinking.&lt;/p&gt;

&lt;p&gt;Although Hacktoberfest has ended, this experience has motivated me to continue contributing to open source in the future. Whether it’s fixing bugs, improving documentation, or writing tests, every contribution counts and brings me a step closer to becoming a better programmer.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Hacktoberfest Last Pull Request - Writing Test</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 30 Oct 2025 21:31:41 +0000</pubDate>
      <link>https://dev.to/denisc96/hacktoberfest-last-pull-request-writing-test-3ljj</link>
      <guid>https://dev.to/denisc96/hacktoberfest-last-pull-request-writing-test-3ljj</guid>
      <description>&lt;p&gt;The last pull request that I worked on was to add a test to &lt;a href="https://github.com/januschung/math-worksheet-generator" rel="noopener noreferrer"&gt;Math Worksheet Generator&lt;/a&gt;, which is posted in &lt;a href="https://github.com/januschung/math-worksheet-generator/issues/53" rel="noopener noreferrer"&gt;this issue&lt;/a&gt;. As opposed to bug fixing and adding new feature in my previous pull requests, this time I focused on writing the test itself, which may not have an immediate impact, but would definite improve maintainability of the project in the long run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding the missing test
&lt;/h3&gt;

&lt;p&gt;A comprehensive test set helps identify bugs and allows re-testing in the future to ensure that the program runs normally after updates, therefore, we should identify the missing piece in the current test set. I first went through &lt;a href="https://github.com/januschung/math-worksheet-generator/blob/master/tests/test_math_worksheet_generator.py" rel="noopener noreferrer"&gt;the current test cases&lt;/a&gt; in the project, and spotted that there was no test case to check for the option of mix question type, which generates math questions with random operator (+,-,x,/). It would be a good idea to add a test to check if question and answer are generated properly with the mix type.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing the test
&lt;/h3&gt;

&lt;p&gt;Now that I had decided what test to be written, I could go ahead and write the test. Similar to adding new feature, I also have to stick to original coding style when writing the test, which I have become more proficient after weeks of practice working on open source projects. A minor problem arose when I tried to push my codes after writing the test, I found that I've included the codes related to another issue that I worked on in the same repo. Then I realized that I had created a new branch from the branch for another issue instead of from the main branch. I had to re-creating a branch from the main branch, add the new test in the right branch, and eventually made a &lt;a href="https://github.com/januschung/math-worksheet-generator/pull/55" rel="noopener noreferrer"&gt;pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson learnt and future planning
&lt;/h3&gt;

&lt;p&gt;In this pull request, I've gained experience examining existing test set, and writing test that improve the comprehensiveness of the test set. Additionally, I'm more aware of branching in git, especially when working on multiple issues on the same repo at the same time. Now I've built a habit of using &lt;code&gt;git status&lt;/code&gt; to check the current branch first before creating new branch. Though this is my last pull request for Hacktoberfest, I will continuously look for open source projects that I'm interested in, and try my best to contribute to the open source community in the future.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>python</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Hacktoberfest 3rd Pull Request - Adding New Feature</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Thu, 30 Oct 2025 19:54:38 +0000</pubDate>
      <link>https://dev.to/denisc96/hacktoberfest-3rd-pull-request-adding-new-feature-5baa</link>
      <guid>https://dev.to/denisc96/hacktoberfest-3rd-pull-request-adding-new-feature-5baa</guid>
      <description>&lt;p&gt;In the previous 2 pull requests, I have been working on bug fixing either spotted by myself or by others. This time, I have worked on adding new feature to a &lt;a href="https://github.com/januschung/math-worksheet-generator" rel="noopener noreferrer"&gt;Math Worksheet Generator Project&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  New feature added
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/januschung/math-worksheet-generator/issues/51" rel="noopener noreferrer"&gt;The feature&lt;/a&gt; I worked on was to add a front page to the generated worksheet that contains a date/name/score section, which could be useful when the generated worksheets are distributed in class. I initially saw this in the TODO section in README.md but found no related issue in the repo, so I posted an issue regarding this feature and started working on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Process of adding new feature
&lt;/h3&gt;

&lt;p&gt;The output worksheets are in pdf format, generated by fpdf library in Python. As I have never used this library before, I have to first read documentation on fpdf library to get the basic idea of how it works, in order to implement the new feature of adding a new page. While I was planning on how to add the name/date/score fields on the front page, I also realized that it would make sense to have a title too, so I decided to add a default title to the front page, and implement a &lt;code&gt;--title&lt;/code&gt; option to the tool to allow customized title by user. After clearly stating my planning about the new feature in the &lt;a href="https://github.com/januschung/math-worksheet-generator/issues/51" rel="noopener noreferrer"&gt;issue&lt;/a&gt;, I started implementing the new feature while trying to stick to the original coding style. At last, I updated the README.md to add instruction for using the new &lt;code&gt;--title&lt;/code&gt; option, replaced the sample-worksheet.pdf with the new one with a front page, and made a &lt;a href="https://github.com/januschung/math-worksheet-generator/pull/52" rel="noopener noreferrer"&gt;pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson learnt and future planning
&lt;/h3&gt;

&lt;p&gt;Through working on this pull request, I have become more comfortable working with tools that I am not familiar with, such as the fpdf library this time. I realized that we don't have to fully understand everything about a tool to use it, instead, we should focus on the parts we are interested in, which would be enough for us to utilize the tools. I've also learnt the importance of having a flexible coding style, such that the codes written would be consistent to whatever projects I'm working on. So far, I've fixed bugs and added new feature in my pull requests, in my next pull request, I would like to work on a different type of issue, possibly writing a test.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>python</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Adding New Feature Inspired by Other Projects</title>
      <dc:creator>DenisC</dc:creator>
      <pubDate>Wed, 29 Oct 2025 17:07:29 +0000</pubDate>
      <link>https://dev.to/denisc96/adding-new-feature-inspired-by-other-projects-mco</link>
      <guid>https://dev.to/denisc96/adding-new-feature-inspired-by-other-projects-mco</guid>
      <description>&lt;p&gt;As mentioned in my &lt;a href="https://dev.to/denisc96/read-and-learn-from-open-source-projects-4ch5"&gt;last post&lt;/a&gt; about the feature I found in &lt;a href="https://github.com/yamadashy/repomix" rel="noopener noreferrer"&gt;Repomix&lt;/a&gt;, I am going to add the &lt;code&gt;--remove-empty-lines&lt;/code&gt; option to &lt;a href="https://github.com/DenisC96/Repo-Context-Packager" rel="noopener noreferrer"&gt;my project&lt;/a&gt; while making reference to Repomix. The feature is to remove blank lines from all files when writing file contents, which could be useful to reduce the file size and no. of lines in the output file, such that it does not exceed the size/line limit for AI analysis.&lt;/p&gt;

&lt;p&gt;The first step to add this new feature is to do a prototype. As both the structure and programming language of my project is different from those of Repomix, I had to adjust the code when prototyping. Firstly, I added the new flag to the argument parser, which is a separate module in my codes. I then added a &lt;strong&gt;remove_empty_lines&lt;/strong&gt; helper function to process the empty lines removal on the file content, which used the same logic as the removeEmptyLines in &lt;a href="https://github.com/yamadashy/repomix/blob/main/src/core/file/fileManipulate.ts" rel="noopener noreferrer"&gt;fileManipulate.ts&lt;/a&gt; of Repomix. I've also altered the &lt;strong&gt;write_file_content&lt;/strong&gt; function to receive the &lt;em&gt;empty_lines_removed&lt;/em&gt; flag as a parameter, for further processing within the function. &lt;/p&gt;

&lt;p&gt;The changes I've made for prototyping can be tracked in this &lt;a href="https://github.com/DenisC96/Repo-Context-Packager/commit/269aa774986aa11d3679cb601cead391c9a71424" rel="noopener noreferrer"&gt;commit&lt;/a&gt;. What's left now is to change the logic within &lt;strong&gt;write_file_content&lt;/strong&gt; function to cater for the case when the &lt;em&gt;empty_lines_removed&lt;/em&gt; flag is true, and to update README.md after the new feature has been implemented and tested. To document the progress of implementing this feature, I have filed &lt;a href="https://github.com/DenisC96/Repo-Context-Packager/issues/17" rel="noopener noreferrer"&gt;an issue&lt;/a&gt; that described the overall steps to implement the feature. After doing the basic prototyping, I've filed &lt;a href="https://github.com/DenisC96/Repo-Context-Packager/issues/18" rel="noopener noreferrer"&gt;a sub-issue&lt;/a&gt; that requires changes in &lt;strong&gt;write_file_content&lt;/strong&gt; function, and &lt;a href="https://github.com/DenisC96/Repo-Context-Packager/issues/19" rel="noopener noreferrer"&gt;another sub-issue&lt;/a&gt; about the changes in README.md, such that  other users can see the progress or help contribute to the issues.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
