# Week 7 & 8 - CircuitVerse@GSOC'23

Finally, On July 14, I received this email about passing the midterm evaluation 🎉🎉.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1690095830442/f3a80b48-1b6c-4fdb-abfc-8f045c4de561.png align="center")

You can check out the blog on the phase 1 report here: [https://blog.circuitverse.org/posts/tanmoy\_sarkar\_phase\_1\_report/](https://blog.circuitverse.org/posts/tanmoy_sarkar_phase_1_report/)

You should check other blogs here: [https://blog.circuitverse.org](https://blog.circuitverse.org/posts/tanmoy_sarkar_phase_1_report/)/

---

These two weeks were full of debugging and much more learning. Finally, many issues were resolved in these weeks. So, let's get started.

---

### Week 7

#### RBS Rails

Finally, the `rbs_rails` issue was resolved. Discussion thread [here](https://github.com/pocke/rbs_rails/issues/260).

The main issue was this -

The project previously uses `ActionMailer` for notifications. While migrating to `Noticed` Gem, we can't use the same table for notifications as we don't want to drop the data. So used `has_noticed_notifications` to override the model name to use `NoticedNotifications` the table.

There were some associations -

```ruby
 has_many :notifications, as: :notifiable 
```

This line was causing the issue of preventing `rbs_rails` gem from generating signatures for models.

After replacing the association with

```ruby
has_many :noticed_notifications
```

All the issues are fixed!

Running this task `rbs_rails:generate_rbs_for_models` will generate the signature for models and the signature for dependencies as well.

After this, we can customize those signature files according to our need to add the custom functions we wrote in our models.

As we have previously set up `steep` gem to verify rbs signature, that speed up the process of writing rbs annotations.

If you haven't yet checked out RBS installation and CI integration with `steep`, you should check out this blog: [https://tanmoy.online/week-4-circuitversegsoc23](https://tanmoy.online/week-4-circuitversegsoc23)

The docs provided by **RBS** [https://github.com/ruby/rbs/blob/master/docs/rbs\_by\_example.md](https://github.com/ruby/rbs/blob/master/docs/rbs_by_example.md) and this blog [https://www.honeybadger.io/blog/ruby-rbs-type-annotation/](https://www.honeybadger.io/blog/ruby-rbs-type-annotation/) helps a lot to understand **RBS** easily.

<mark>All PR: </mark> [<mark>https://github.com/CircuitVerse/CircuitVerse/issues/3792</mark>](https://github.com/CircuitVerse/CircuitVerse/issues/3792)

---

### Week 8

This week's main target was to work on Remote Development Platform integrations.

Many changes have been made in the development environment over the last few weeks. So it was necessary to verify the Gitpod setup and integrate new features. As well as integrate Github Codespaces for Remote Development.

We also will look into the improvement of docker-based local development.

#### Gitpod Remote Development

There is already gitpod setup in the project, but it has broken due to old version of Redis.

Universal APT repository hasn't the latest version of Redis, and sidekiq requires Redis &gt; v7.0. So we added the Redis repository and gpg key, and it was fixed.

```ruby
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
apt-get update && apt-get install redis
```

Now the GitPod is running, but it's missing all extensions.

After searching, I found that, due to Microsoft's latest Terms & Conditions, external editors or open source VSCode alternatives like VsCodium or Theia IDE can't use Visual Studio Marketplace to fetch Extensions. So there comes [Open-VSX Registry](https://open-vsx.org/), which hosts and distributes VSCode Extension without restriction. For more details, read this blog [https://www.gitpod.io/blog/open-vsx](https://www.gitpod.io/blog/open-vsx)

So we move the extensions from Visual Studio Marketplace to Open-VSX Registry.

```yaml
vscode:
  extensions:
    - dbaeumer.vscode-eslint
    - rebornix.ruby
    - castwide.solargraph
    - wingrunr21.vscode-ruby
```

But some extensions like `Ruby debugger` & `Ruby Rubocop Revived` The extension is still not available on [Open-VSX Registry](https://open-vsx.org/). So here is the workaround, we can generate **VSIX** file and provide the links.

We can generate VSIX files very quickly.

* Clone extension repository & do `npm install`
    
* Install **vsce** plugin `npm install -g @vscode/vsce`
    
* Run `vsce package` to generate vsix file
    
* Now, we can upload it somewhere and provide the URL in the extension list.
    

<mark>For more, check this PR: </mark> [<mark>https://github.com/CircuitVerse/CircuitVerse/pull/3892/</mark>](https://github.com/CircuitVerse/CircuitVerse/pull/3892/files)

#### Github CodeSpaces Remote Development

Currently, the repository has no Github Codespace configuration so that we will introduce that.

Github Codespaces call this dev container, and we need the dev container configuration to be available to launch the project in the Github Codespaces environment.

We need a docker compose-based setup for our use case because we need Redis & PostgreSQL as databases to start the project.

This documentation was beneficial to understand the configuration - [https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)

* First, we create a Dockerfile, which will hold only the Environment to run our project.
    
    ```dockerfile
    FROM ruby:3.2.1
    # install dependencies
    RUN apt-get update -qq && apt-get install -y imagemagick shared-mime-info libvips && apt-get clean
    RUN curl -sL https://deb.nodesource.com/setup_14.x | bash \
     && apt-get update && apt-get install -y nodejs && rm -rf /var/lib/apt/lists/* \
     && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
     && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
     && apt-get update && apt-get install -y yarn && rm -rf /var/lib/apt/lists/* \
     && apt-get update && apt-get -y install cmake && rm -rf /var/lib/apt/lists/* \
     && apt-get update && apt-get -y install netcat && rm -rf /var/lib/apt/lists/
    ```
    
* Then we make a `docker-compose.yml` file that will contain the service's details
    
    ```yaml
    version: "3.1"
    services:
      db:
        image: postgres
        environment:
          POSTGRES_DB: circuitverse_development
          POSTGRES_PASSWORD: postgres
      web:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
          - "3000:3000"
        depends_on:
          - db
          - redis
        environment:
          REDIS_URL: "redis://redis:6379/0"
          CIRCUITVERSE_USE_SOLR: "false"
          DOCKER_ENVIRONMENT: 'true'
        command: sleep infinity
      redis:
        image: redis:7.0-alpine
    ```
    
* You can see the `web` service will start, and Github Codespace will attach to it. To prevent it from terminating, we used `sleep infinity` the command
    
* Now, we require two scripts.
    
    * **setup.sh** -&gt; This script will be called when the container starts. Like database migration, dependency installation, etc.
        
    * **boot.sh** -&gt; After the successful container setup, this script will start the application.
        
* Now, we can write `devcontainer.json` to complete the setup.
    
    ```json
    {
        "hostRequirements": {
          "cpus": 4
        },
        "workspaceFolder": "/workspaces/CircuitVerse/",
        "dockerComposeFile": "docker-compose.yml",
        "service": "web",
        "features": {
    		"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}
    	},
        "waitFor": "onCreateCommand",
        "postCreateCommand": ".devcontainer/setup.sh",
        "postAttachCommand": {
          "server": ".devcontainer/boot.sh"
        },
        "customizations": {
          "vscode": {
            "extensions": [
                "dbaeumer.vscode-eslint",
                "LoranKloeze.ruby-rubocop-revived",
                "rebornix.Ruby",
                "wingrunr21.vscode-ruby",
                "KoichiSasada.vscode-rdbg"
            ]
          }
        },
    
        "forwardPorts": [3000]
      }
    ```
    
* `service` Key takes the service name, which should the process will attach.
    
* `postAttachCommand` Key declares the script, which should will after the setup process.
    
* We have also configured various extensions to provide convenience for developers. AS Microsoft powers Github Codespace, we have no issue using the extension from Visual Studio Code Marketplace.
    

For more details, check this PR: [https://github.com/CircuitVerse/CircuitVerse/pull/3894/](https://github.com/CircuitVerse/CircuitVerse/pull/3894/)

#### Docker-based development environment

I have started working on this. Currently, the setup contains Docker configuration to run the app locally. But this is not suitable for faster development.

I have listed the issues here: [https://github.com/CircuitVerse/CircuitVerse/issues/3914](https://github.com/CircuitVerse/CircuitVerse/issues/3914)

I am trying to rebuild the Docker configuration to build a local environment by using the same concept that Github Codespaces used.

Here is the draft PR: [https://github.com/CircuitVerse/CircuitVerse/pull/3913](https://github.com/CircuitVerse/CircuitVerse/pull/3913)

In the next blog, I will explain these stuffs in detail.

---

🏂 Thank you for getting it a read
