profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/akarzim/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.
François VANTOMME akarzim @synbioz Dijon, France http://akarz.im software craftsman

akarzim/capybara-bootstrap-datepicker 21

Helper for triggering date input for bootstrap-datepicker javascript library

akarzim/image-sitemaps 15

Google image sitemaps for Django

akarzim/hexo-tag-fontawesome 3

A Font Awesome plugin for Hexo

adullact/demarches-simplifiees.fr 1

Working FORK from betagouv/demarches-simplifiees.fr

akarzim/akarlahg 1

Orthographe alternative phonologique de la langue française

akarzim/babelio-pages 1

Stats on your Babelio exported data

akarzim/capybara-angular-tagselect 1

Helper for capybara to be able to trigger select on angular TagSelect directive (needed for js enabled test only)

akarzim/capybara-select2 1

Helper for capybara to be able to trigger select on select2 javascript (needed for js enabled test only)

akarzim/cv-latex 1

LaTeX source of my resume

pull request commentakarzim/image-sitemaps

fix for Django 3.2

Thanks!

PetrDlouhy

comment created time in 14 days

push eventakarzim/image-sitemaps

Petr Dlouhý

commit sha ee1fc3a227afe88840d2f8bb7e1d1daa89d6edc3

fix for Django 3.2

view details

François VANTOMME

commit sha 0ed422508f4eff4a2ede9721d2c355efbbf30f4c

Merge pull request #6 from PetrDlouhy/fix_new_django fix for Django 3.2

view details

push time in 14 days

startedkmonad/kmonad

started time in a month

startedpanorama-ed/memo_wise

started time in 2 months

issue closedakarzim/zsh-docker-aliases

For Ubuntu 20.04 LTS the docker-cli version doesn't have the docker compose command.

Maybe support both docker-compose and docker compose while docker-compose isn't deprecated

closed time in 2 months

caduvieira

issue commentakarzim/zsh-docker-aliases

For Ubuntu 20.04 LTS the docker-cli version doesn't have the docker compose command.

@caduvieira you're right ! I was too enthusiastic ^^'

It is fixed in the last commit (137a5aa) on master.

caduvieira

comment created time in 2 months

push eventakarzim/zsh-docker-aliases

François Vantomme

commit sha 137a5aaa1b59486aa8fac6311e43ad512175c7aa

Fix (Compose): fallback to docker-compose for Linux platform

view details

push time in 2 months

push eventakarzim/capybara-bootstrap-datepicker

dependabot[bot]

commit sha dfda44c323eff5d9e3d27e2d2f07fa4ca254c55f

Bump addressable from 2.7.0 to 2.8.0 (#24) Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.7.0 to 2.8.0. - [Release notes](https://github.com/sporkmonger/addressable/releases) - [Changelog](https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.7.0...addressable-2.8.0) --- updated-dependencies: - dependency-name: addressable dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

view details

push time in 2 months

PR merged akarzim/capybara-bootstrap-datepicker

Bump addressable from 2.7.0 to 2.8.0 dependencies

Bumps addressable from 2.7.0 to 2.8.0. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md">addressable's changelog</a>.</em></p> <blockquote> <h1>Addressable 2.8.0</h1> <ul> <li>fixes ReDoS vulnerability in Addressable::Template#match</li> <li>no longer replaces <code>+</code> with spaces in queries for non-http(s) schemes</li> <li>fixed encoding ipv6 literals</li> <li>the <code>:compacted</code> flag for <code>normalized_query</code> now dedupes parameters</li> <li>fix broken <code>escape_component</code> alias</li> <li>dropping support for Ruby 2.0 and 2.1</li> <li>adding Ruby 3.0 compatibility for development tasks</li> <li>drop support for <code>rack-mount</code> and remove Addressable::Template#generate</li> <li>performance improvements</li> <li>switch CI/CD to GitHub Actions</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/sporkmonger/addressable/commit/6469a232c0f1892809ff66737370c765d574e16c"><code>6469a23</code></a> Updating gemspec again</li> <li><a href="https://github.com/sporkmonger/addressable/commit/24336385de0261571b3adaad0431459edb420c79"><code>2433638</code></a> Merge branch 'main' of github.com:sporkmonger/addressable into main</li> <li><a href="https://github.com/sporkmonger/addressable/commit/e9c76b889789c75d7073c17b0ab557635d3f6704"><code>e9c76b8</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/sporkmonger/addressable/issues/378">#378</a> from ashmaroli/flat-map</li> <li><a href="https://github.com/sporkmonger/addressable/commit/56c5cf7ece9223ff4240e07078cc26d3adbbbd30"><code>56c5cf7</code></a> Update the gemspec</li> <li><a href="https://github.com/sporkmonger/addressable/commit/c1fed1ca0a44c448e74d761fd44ed94869199807"><code>c1fed1c</code></a> Require a non-vulnerable rake</li> <li><a href="https://github.com/sporkmonger/addressable/commit/0d8a3127e35886ce9284810a7f2438bff6b43cbc"><code>0d8a312</code></a> Adding note about ReDoS vulnerability</li> <li><a href="https://github.com/sporkmonger/addressable/commit/89c76130ce255c601f642a018cb5fb5a80e679a7"><code>89c7613</code></a> Merge branch 'template-regexp' into main</li> <li><a href="https://github.com/sporkmonger/addressable/commit/cf8884f815c96b646c796f707bf768cf6eb65543"><code>cf8884f</code></a> Note about alias fix</li> <li><a href="https://github.com/sporkmonger/addressable/commit/bb03f7112e8e478240a0f96e1cc7428159b41586"><code>bb03f71</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/sporkmonger/addressable/issues/371">#371</a> from charleystran/add_missing_encode_component_doc_entry</li> <li><a href="https://github.com/sporkmonger/addressable/commit/6d1d8094a66cbf932ecf69db6850bc9edaf86de0"><code>6d1d809</code></a> Adding note about :compacted normalization</li> <li>Additional commits viewable in <a href="https://github.com/sporkmonger/addressable/compare/addressable-2.7.0...addressable-2.8.0">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
  • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
  • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
  • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

You can disable automated security fix PRs for this repo from the Security Alerts page.

</details>

+2 -2

0 comment

1 changed file

dependabot[bot]

pr closed time in 2 months

push eventakarzim/.zsh

push time in 2 months

push eventakarzim/.zsh

François Vantomme

commit sha 807df5bd8f04747281c6ac2bd42680a2ad798f01

Revert "Feat (Editor): configure neovim-remote" This reverts commit ee8ba376105407a9c15e6cec0a6eb9637ed78bdf.

view details

push time in 2 months

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)

Au regard des avis exprimés ci-dessus, j'aurais tendance décliner cette proposition. Par ailleurs, le rendu me semble bien moins lisible, flexible et plus difficile à tester, déboguer et maintenir que la proposition d'origine.

L'approche que je propose tend à respecter le concept d'orthogonalité, favorisant le découplage et limitant la responsabilité de chaque classe et méthode.

source: http://www.catb.org/~esr/writings/taoup/html/ch04s02.html#orthogonality

dzc34

comment created time in 3 months

PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)+      end+    end++    def introspect+      get("../introspect") do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::Introspection.new(**data)+      end+    end++    def ping?+      get("../ping") { true }+    rescue Error::HttpError+      false+    end++    private++    attr_reader :token

Non, on l'utilise dans la méthode headers.

Ce getter est déclaré en privé car il n'a pas à être accessible en dehors de la classe. On aurait pu utiliser la variable d'instance @token directement dans la méthode headers, mais pour une meilleure évolutivité du code, il est préférable de favoriser l'usage d'un accesseur que l'on pourra surcharger au besoin, sans avoir à modifier chaque appel à la variable d'instance à travers la classe. Cela dit, ici nous n'avons qu'un unique appel. On peut donc utiliser la variable d'instance directement si vous trouvez cela préférable.

dzc34

comment created time in 3 months

PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++require_relative '../sanitizable'++module APIParticulier+  module Entities+    module CAF+      class Famille

La classe est pourvue d'une douzaine de méthodes et inclut un module, ce n'est pas tout à fait le cas d'usage idéal pour un Struct. Le Struct sera intéressant dans des situations où l'on souhaite regrouper des attributs entre eux au sein d'une notion (ex: des coordonnées longitude, latitude) ; cela évite d'avoir à déclarer des classes dans des classes et, autre avantage du Struct, ça permet de comparer deux instances sur la base de leurs attributs et non de leur object_id. Ainsi, les Struct produisent des value objects, ce qui n'est pas vraiment ce que l'on recherche ici.

source: https://www.rubyguides.com/2017/06/ruby-struct-and-openstruct/

dzc34

comment created time in 3 months

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++require_relative '../sanitizable'++module APIParticulier+  module Entities+    module CAF+      class Famille+        include Sanitizable++        class Mapper+          def self.from_api(**kwargs)+            kwargs.transform_keys do |k|+              case k.to_sym+              when :quotientFamilial then :quotient_familial+              else+                k.to_sym+              end+            end+          end+        end

Selon moi, ce n'est pas de la responsabilité du get que de formater la réponse.

À la rigueur, une méthode que l'on appellerait à la suite du get pourrait s'en charger. Mais le mapper offre une souplesse dont il serait dommage de se passer vu la vitesse à laquelle l'API Particulier évolue et se métamorphose.

dzc34

comment created time in 3 months

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)+      end+    end++    def introspect+      get("../introspect") do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::Introspection.new(**data)+      end+    end++    def ping?+      get("../ping") { true }+    rescue Error::HttpError+      false+    end++    private++    attr_reader :token++    def http_service+      @http_service || Typhoeus::Request+    end++    def api_url+      @api_url || Rails.configuration.x.api_particulier.url+    end++    def timeout+      @timeout.to_i || Rails.configuration.x.api_particulier.timeout+    end

Il n'y a pas de memoization ici, ce sont simplement des getters qui optent pour une valeur par défaut si les variables d'instance n'ont pas été assignées à l'initialisation.

Nous aurions pu déclarer la valeur par défaut directement dans l'initialiseur. J'ai cependant une préférence pour cette approche qui permet, à l'inspection de l'objet, de distinguer le cas où les valeurs par défaut sont utilisées, du cas où celles-ci sont surchargées à l'initialisation, puisqu'ici les variables d'instance ne sont pas altérées.

Ceci étant, je suis tout à fait disposé à déclarer les valeurs par défaut dans l'initialiseur si cela vous semble plus clair.

dzc34

comment created time in 3 months

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)+      end+    end++    def introspect+      get("../introspect") do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::Introspection.new(**data)+      end+    end++    def ping?+      get("../ping") { true }+    rescue Error::HttpError+      false+    end++    private++    attr_reader :token++    def http_service+      @http_service || Typhoeus::Request+    end++    def api_url+      @api_url || Rails.configuration.x.api_particulier.url+    end++    def timeout+      @timeout.to_i || Rails.configuration.x.api_particulier.timeout+    end++    def headers+      { accept: "application/json", "X-API-Key": token }+    end++    def get(base_url, **params, &block)+      url = [api_url, base_url].join("/")+      request = http_service.new(url, headers: headers, method: :get, params: params, timeout: timeout)++      request.on_complete do |response|+        if response.success?+          return yield response+        elsif response.timed_out?+          raise Error::TimedOut.new(response)+        elsif response.code == 400+          raise Error::BadFormatRequest.new(response)+        elsif response.code == 401+          raise Error::Unauthorized.new(response)+        elsif response.code == 404+          raise Error::NotFound.new(response)+        elsif response.code == 502+          raise	Error::BadGateway.new(response)+        elsif response.code == 503+          raise Error::ServiceUnavailable.new(response)+        else+          raise Error::RequestFailed.new(response)+        end+      end++      request.run

Il s'agit là d'une coïncidence, pas d'une duplication. Si demain un nouveau endpoint nécessite un traitement spécifique, il nous faudra repasser sur toutes les méthodes pour défactorisé ce qui l'a été.

De plus, pour les mêmes raisons, cela n'aurait aucune répercussion sur les mappers. Il me semble préférable d'avoir un comportement homogène (passer par un mapper pour construire l'objet final) plutôt que de multiplier les comportements pour s'éviter quelques lignes de code. Encore une fois, nous ne savons pas comment le code évoluera à l'avenir, et en termes d'évolutivité il est bien plus simple de complexifier un mapper existant que de devoir en créer un de tout pièce pour ensuite l'appliquer là où on en a besoin.

Je conseillerais donc d'éviter la factorisation dans le cas présent.

dzc34

comment created time in 3 months

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)+      end+    end++    def introspect+      get("../introspect") do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::Introspection.new(**data)+      end+    end++    def ping?+      get("../ping") { true }+    rescue Error::HttpError+      false+    end

Cette méthode ne nous est pas utile aujourd'hui, mais est fournie par l'API Particulier. Vu qu'elle n'apporte aucune complexité, je serais d'avis de la conserver de manière à ce que notre service propose l'ensemble des points d'entrée offerts par l'API Particulier. Mais on peut la supprimer si vous préférez.

dzc34

comment created time in 3 months

PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++module APIParticulier+  class API+    def initialize(**kwargs)+      attrs = kwargs.symbolize_keys+      @api_url = attrs[:api_url]+      @token = attrs[:token]+      @timeout = attrs[:timeout]+      @http_service = attrs[:http_service]+    end++    def composition_familiale(numero_d_allocataire:, code_postal:)+      params = { numeroAllocataire: numero_d_allocataire, codePostal: code_postal }++      get("composition-familiale", **params) do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::CAF::Famille.new(**data)+      end+    end++    def introspect+      get("../introspect") do |response|+        data = JSON.parse(response.body, symbolize_names: true)+        APIParticulier::Entities::Introspection.new(**data)+      end+    end++    def ping?+      get("../ping") { true }+    rescue Error::HttpError+      false+    end++    private++    attr_reader :token++    def http_service+      @http_service || Typhoeus::Request+    end++    def api_url+      @api_url || Rails.configuration.x.api_particulier.url+    end++    def timeout+      @timeout.to_i || Rails.configuration.x.api_particulier.timeout+    end++    def headers+      { accept: "application/json", "X-API-Key": token }+    end++    def get(base_url, **params, &block)

Le **params permet d'accepter des arguments nommés (keyword arguments) sans avoir à tous les citer en signature de méthode. À la place, on les regroupe dans une variable params qui sera effectivement un hash.

La déclaration de params = {} en signature de méthode revient, en revanche, à utiliser un positionnal argument. Cette manière de faire est déconseillée.

source: https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/

dzc34

comment created time in 3 months

PullRequestReviewEvent

Pull request review commentbetagouv/demarches-simplifiees.fr

#6024 - Feature: add API particulier

+# frozen_string_literal: true++require_relative '../sanitizable'++module APIParticulier+  module Entities+    module CAF+      class Famille+        include Sanitizable++        class Mapper+          def self.from_api(**kwargs)+            kwargs.transform_keys do |k|+              case k.to_sym+              when :quotientFamilial then :quotient_familial+              else+                k.to_sym+              end+            end+          end+        end++        def initialize(**kwargs)+          attrs = Mapper.from_api(**kwargs)+          @allocataires = attrs[:allocataires]+          @enfants = attrs[:enfants]+          @adresse = attrs[:adresse]+          @quotient_familial = attrs[:quotient_familial]+          @annee = attrs[:annee]+          @mois = attrs[:mois]+        end++        def allocataires+          Array(@allocataires).map { |kwargs| Personne.new(**Hash(kwargs)) }+        end++        def allocataires?+          Array(@allocataires).map { |kwargs| Hash(kwargs).transform_values(&:presence).compact.presence }.any?+        end++        def enfants+          Array(@enfants).map { |kwargs| Personne.new(**Hash(kwargs)) }+        end++        def enfants?+          Array(@enfants).map { |kwargs| Hash(kwargs).transform_values(&:presence).compact.presence }.any?+        end++        def adresse+          PosteAdresse.new(**Hash(@adresse))+        end++        def adresse?+          Hash(@adresse).compact.any?+        end++        def quotient_familial+          @quotient_familial.to_i+        end++        def quotient_familial?+          !@quotient_familial.nil?

Ce n'est pas exactement la même chose. Ici je m'assure que ce n'est pas nil, mais une chaîne vide sera considérée comme acceptable. L'idée est de distinguer une donnée non reçue (qu'il faudra ignorer) d'une donnée reçue mais vide (qu'il faudra présenter).

present? est l'opposé de blank? qui se définit ainsi :

An object is blank if it’s false, empty, or a whitespace string. For example, nil, ”, ‘ ’, [], {}, and false are all blank.

source: https://apidock.com/rails/v6.1.3.1/Object/blank%3F

dzc34

comment created time in 3 months

PullRequestReviewEvent