OpenTRFoundation / OpenTR

OpenTR website
https://opentr.foundation/
Apache License 2.0
4 stars 6 forks source link

Stratejik proje tanımı #29

Closed aliok closed 7 months ago

aliok commented 11 months ago

@altuga nın çok mantıklı bir sorusu var:

Şu commentimde bahsettiğim gibi, bir stratejik proje tanımı yapmamız gerekiyor: https://github.com/OpenTRFoundation/OpenTR/issues/20#issuecomment-1722555345

Bugün biraz projeleri inceledim ve şu tarz bir tanım yapılabilir diye düşünüyorum:

repository'ler stratejik projeler olarak tanımlanabilir.

Bununla beraber bazı projeler birden fazla repository'den oluşuyor (bundan sonra bahsedeceğim).

Yukarıdaki kriterlerden çoğu, doğrudan GitHub search api'ye verilebiliyor. (*) ile işearetlenenler verilemiyor. Bunun için de, GitHub search api'den dönen sonuçları, GitHub api ile teker teker çekmek gerekiyor.

Örnek bir search şurada: https://github.com/search?q=stars%3A%3E50+forks%3A%3E10++is%3Apublic+pushed%3A%3E2023-08-19+created%3A%3C%3D2022-09-19+size%3A%3E1000+template%3Afalse+archived%3Afalse+&type=repositories&ref=advsearch

Arama sonucunda bugün itibariyle, 57000 repository dönüyor. (*) ile belirtilen kriterler de eklenince bu sayının %20'sine düşmesini bekliyorum (denemedim).

Birden fazla repo'dan oluşan projeler konusu

Bazı projeler birden fazla repository'den oluşuyor. Örneğin Knative, 20'den fazla repository'den oluşuyor. Bu repository'lerin bazısı üstteki kriterleri sağlıyor, bazısı sağlamıyor. Ama, genelde OpenTR için önemli olan projelerde, organizasyondaki en azından 1 proje bu kriterleri sağlayacaktır. Sonrasında, bu repoların organizasyonunun altındaki tüm projeleri dahil edebiliriz diye düşünüyorum.

Yani stratejik proje tanımımız şöyle olabilir:

Hatta bazı durumlarda, bir proje birden fazla organizasyona sahip olabiliyor. Knative'de hem "knative" hem de "knative-extensions" organizasyonları var. Bu iki organizasyonu iki ayrı proje şeklinde düşünmek işimizi kolaylaştıracaktır.

Proje != Repository ve Proje != Organizasyon

Proje denilen şey aslında biraz soyut bir şey. Yani, "Knative contributor'uyum" dediğimde, repository'lerin hepsine katkıda bulunmuş olmuyorum. Bir tanesine katkıda bulunmuş olmam yeterli. Ya da, hatta doğrudan "knative" organizasyonu altında değil de "knative-extensions" organizasyonu altındaki bir repository'ye katkıda bulunmuş olmam da yeterli.

(Bu katkının miktarı da önemli, ama o ayrı bir tartışma konusu.)

aliok commented 11 months ago

Projeleri çekme implementasyonu

Sınırlamalar:

Screenshot 2023-09-19 at 01 09 11

Implementasyon şu şekilde olabilir:

  1. stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2010-01-01..2010-01-07
  2. stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2010-01-08..2010-01-14 ... N. stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2023-09-13..2023-09-19

Sırasıyla bu şekilde bir haftalık tarih aralığında oluşturulmuş repo'ları çekeriz, ta ki, 1 yıl öncesine kadar. Oluşturulma tarihi sabit olduğu için, (1) ve (2) nolu request'lerin kesişen bir sonucu olmayacak.

Her query'nin page'lerini çekerken yine de page'ler arasında sonuçlar değişebilir. Mesela, tam 2. page'i çekerken sırada bir repo'nun star sayısı artabilir ve 1. page'e düşebilir. Ama bunun gibi durumlar ihmal edilebilir çok uç örnekler.

Bunu GraphQL API'si ile birleştirirsek, tek seferde aggregation işini de yapmış oluruz.

Örnek bir GraphQL query'si:

query {
  search(type:REPOSITORY, query:"stars:>50 forks:>10 is:public pushed:>2023-06-19 created:2010-01-01..2010-01-15 size:>1000 template:false archived:false", first:100){
    repositoryCount
    nodes{
      ...on Repository{
        nameWithOwner
        isInOrganization
        owner{
          login
        }
        watchers{
          totalCount
        }
        forkCount
        stargazerCount
        pullRequests(states:[OPEN, MERGED]){
          totalCount
        }
        issues(states:[OPEN, CLOSED]){
          totalCount
        }
        mentionableUsers{
          totalCount
        }
      }
    }
  }
}

Çıktı:

{
  "data": {
    "search": {
      "repositoryCount": 24,
      "nodes": [
        {
          "nameWithOwner": "symfony/symfony",
          "isInOrganization": true,
          "owner": {
            "login": "symfony"
          },
          "watchers": {
            "totalCount": 1127
          },
          "forkCount": 9236,
          "stargazerCount": 28688,
          "pullRequests": {
            "totalCount": 20936
          },
          "issues": {
            "totalCount": 18895
          },
          "mentionableUsers": {
            "totalCount": 2828
          }
        },
        {
          "nameWithOwner": "facebook/hhvm",
          "isInOrganization": true,
          "owner": {
            "login": "facebook"
          },
          "watchers": {
            "totalCount": 1002
          },
          "forkCount": 3144,
          "stargazerCount": 17808,
          "pullRequests": {
            "totalCount": 182
          },
          "issues": {
            "totalCount": 5914
          },
          "mentionableUsers": {
            "totalCount": 1050
          }
        },
      ...

Burada hem proje aramasını, hem de watcher sayısı, PR sayısı gibi aggregation'ları tek seferde yapmış oluyoruz.

mentionableUsers'un tam tanımını bulamadım. Ama, projelerin GitHub'da görünen "contributors" sayısına yakın bir değer görünüyor manuel yaptığım kontrollerde.

Keşke filtreleme de desteklenseydi. O zaman aggregation'ların sonucuna göre filtreleme yapabilirdik ve mesela 50 PR'ın altında PR'ı olanlar gelmezdi. Şu anda bunlar geliyor ve bunları elle filtrelememiz gerekecek.

aliok commented 7 months ago

Şurada yazıldığı üzere, raporda stratejik proje tanımı yapıldı: https://github.com/OpenTRFoundation/OpenTR/issues/20#issuecomment-1880179046

Kriterler raporda mevcut: https://state.opentr.foundation/

aliok commented 7 months ago

Kriterler

Odak organizasyonlar:

Aşağıdaki kriterleri karşılayan en az bir repository'si var:

Odak repository'ler: