Libraries.io monitoriza más de dos millones de librerías / paquetes de software libre disponibles en muchos de los package managers más conocidos (npm, maven, PyPI, etc). Para cada proyecto da datos sobre su licencia, releases y, muy importante, las dependencias entre ellos.  El proyecto libraries.io fue creado por Andrew Nesbitt y Benjamin Nickolls y es ahora parte de Tidelift.

La gran contribución de Libraries.io es el ir más allá de dar información de proyectos individuales (para eso ya tenemos  otras herramientas de análisis de repositorios) y ofrecer una visión del conjunto del ecosistema alrededor del proyecto. Podemos definir un ecosistema software como el conjuntod de proyectos que se desarrollan y evolucionan conjuntamente  en un mismo entorno debido a dependencias técnicas entre ellos.

El dataset que proporciona libraries.io incluye más de 2.5 millones de componentes software, 9 millones de versiones, 39 millones de releases y 100 millones de dependencias declaradas en el código de esos proyectos. Los datos completos pesan aproximadamente 5GB (comprimidos, 25GB sin comprimir). Puedes acceder a ellos a través de su API pero también te lo puedes descargar entero en formato CVS desde Zenodo . La licencia de los datos es Creative Commons Attribution, Sharealike 4.0 . Más fácil no te lo pueden poner para empezar a jugar 🙂 .

El modelo de datos de Libraries.io

Para que tengáis una idea más clara de los datos que os váis a encontrar os resumo un poco su estructura interna (id a https://libraries.io/data para una descripción completa, tened en cuenta que no todos los datos están disponibles para todos los package managers, ya que no todos ofrecen el mismo tipo de acceso). Los datos están organizados en seis paquetes.

Datos de Proyectos

Un proyecto corresponde a la definición de un paquete o librería alojado en uno de los package managers. Datos disponibles:

  • Package manager donde se encuentra el proyecto
  • Nombre del proyecto
  • Fecha de creación y modificación
  • Palabras clave
  • Página web del proyecto y del repositorio
  • Licencia
  • Lenguage de programación
  • Estado

Datos de Versiones

Una versión es una publicación immutable del proyecto en un cierto instante de tiempo. Algunos proyectos más que trabajar explícitamente con el concepto de versión utilizan un sistema de tags/branches en el repositorio. Incluye:

  • Proyecto
  • Número de versión  (especialmente útil si el proyecto sigue un versionado semántico)
  • Fecha de creación y modificación

Tags

Con datos acerca de:

  • Nombre
  • Tipo de Host
  • Repositorio
  • Tag git sha
  • Fechas de creación, pubicación y modificación

Repositorios

Un repositorio en Libraries.io corresponde a un repositorio público con el código fuente del proyecto disponible en GitHub, GitLab o BitBucket.

  • Tipo de Host
  • Nombre
  • IsAFork?
  • Fechas de creación y última modificación
  • Tamaño
  • Número de estrellas
  • Número de “watchers”
  • Lenguaje
  • IssuesEnabled?
  • WikiEnabled?
  • PagesEnabled?
  • ForkCount
  • OpenIssuesCount
  • DefaultBranch
  • Licencia
  • Número de contribuidores
  • PullRequestsEnabled

Dependencias

Dependencias entre proyectos. Las dependencias se registran a nivel de versiones ya que cada versión de un mismo proyecto puede tener dependencias diferentes.  La gran mayoría de dependencias son internas al propio package manager y se descubren analizando el archivo manifest (una gemfile, package.json, o similares) del proyecto. Datos para cada dependencia:

  • Nombre del repositorio
  • Tipo de archivo Manifest, camino al archivo y software de gestión de configuraciones usad
  • Proyecto del que se depende y requisitos de la dependencia (e.j. versión mínima)
  • Tipo de dependencia (runtime, build, test, development,…)

Oportunidades de investigación

Estoy seguro que tener todos estos datos de ecosistemas enteros disponibles va a facilitar un buen número de investigaciones interesantes. Hasta la fecha, estos datos eran difíciles de encontrar y se requería un gran esfuerzo manual sólo para llegar a construir el dataset como paso previo a toda investigación. Ahora se abre un buen número de preguntas interesantes que se podrían contestar mirando estos datos. Algunos ejemplos de investigaciones que considero interesantes:

  • Clasificación de proyectos: ¿Podemos clasificar los proyectos open source (según diferentes dimensiones: madurez, riesgo, calidad,…) en función de sus dependencias y relaciones con otros proyectos? ¿Podemos mejorar la búsqueda y recomendación de proyectos en base a estos datos?
  • Comparación: ¿Vemos patrones de comportamientos similares que se repiten en cada package manager? ¿O para proyectos desarrollados con el mismo lenguaje? ¿O del mismo tamaño? ¿Podemos detectar algún patrón común que se repite en todos los proyectos populares? ¿Qué proyectos son más valuosos para un ecosistema? ¿Qué pasa en un ecosistema si un cierto proyecto se elimina?
  • Evolución temporal: ¿es el software cada vez más complejo?  ¿se nota más en proyectos programados con algunos lenguajes concretos?
  • Licencias: ¿Cuáles son las licencias más populares? ¿Cambian los proyectos sus licencias? ¿Respetan los proyectos las licencias de los proyectos de los que dependen?

Algunos prototipos que hacen ya cosas interesantes con estos datos los podéis encontrar ya en la sección de Experimentos de la web. ¡A ver si os animáis a hacer vosotros mimos algun otro experimento con estos ecosistemas de software libre!