# peg-java

> Genera gráfico de inestabilidad/abstracción para Software en Java

Latest version **2.3.3** (published 2023-05-29) · MIT license · 0 weekly downloads

## Install

```sh
npm install peg-java
pnpm add peg-java
yarn add peg-java
bun add peg-java
```

Provides the command `peg-java`.

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.3.3 |
| Published | 2023-05-29 |
| First published | 2023-03-31 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Node | >=12.0.0 |
| Dependencies | 7 |
| Unpacked size | 37.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | jmainhard |
| Maintainers | jmainhard |
| Keywords | oclif |

## Links

- npm: https://www.npmjs.com/package/peg-java
- Repository: https://gitlab.com/jmainhard/peg-java
- Issues: https://gitlab.com/jmainhard/peg-java/issues
- npm.io page: https://npm.io/package/peg-java

## Dependencies (7)

- [path](https://npm.io/package/path.md) ^0.12.7
- [@oclif/core](https://npm.io/package/@oclif/core.md) ^2
- [tree-sitter](https://npm.io/package/tree-sitter.md) ^0.20.1
- [chartjs-to-image](https://npm.io/package/chartjs-to-image.md) ^1.1.0
- [tree-sitter-java](https://npm.io/package/tree-sitter-java.md) ^0.19.1
- [console-log-level](https://npm.io/package/console-log-level.md) ^1.4.1
- [@oclif/plugin-help](https://npm.io/package/@oclif/plugin-help.md) ^5

## Alternatives

- [@salesforce/cli](https://npm.io/package/@salesforce/cli.md) — 389.7K weekly downloads
- [@mintlify/cli](https://npm.io/package/@mintlify/cli.md) — 208.9K weekly downloads
- [@grafana/e2e-selectors](https://npm.io/package/@grafana/e2e-selectors.md) — 128.7K weekly downloads
- [mintlify](https://npm.io/package/mintlify.md) — 112.0K weekly downloads
- [@intlayer/cli](https://npm.io/package/@intlayer/cli.md) — 22.8K weekly downloads

## Recent versions

- 2.3.3 (latest) — 2023-05-29
- 2.3.2 — 2023-05-29
- 2.3.1 — 2023-05-29
- 2.3.0 — 2023-05-29
- 2.1.1 — 2023-05-25
- 2.1.0 — 2023-05-25
- 2.0.4 — 2023-05-08
- 2.0.3 — 2023-05-08
- 2.0.2 — 2023-05-08
- 2.0.1 — 2023-05-08
- 2.0.0 — 2023-05-08
- 1.1.4 — 2023-03-31
- 1.1.3 — 2023-03-31
- 1.1.2 — 2023-03-31
- 1.1.1 — 2023-03-31

## README

peg-java
=================

Calcula Inestabilidad y Grado de abstracción para determinado proyecto en Java y reporta lo hallado.

**Importante**: A la hora de calcular la inestabilidad de un proyecto entero ES NECESARIO considerar tipos externos para el cálculo de acoplamiento a menos que sea entre módulos de un mismo proyecto que no es el foco de esta herramienta.

[![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io)
[![Version](https://img.shields.io/npm/v/peg-java.svg)](https://npmjs.org/package/peg-java)
[![License](https://img.shields.io/npm/l/peg-java.svg)](https://gitlab.com/jmainhard/peg-java/blob/main/package.json)


<!-- toc -->
* [Requerimientos](#requerimientos)
* [Utilización](#utilización)
* [Comandos](#comandos)
* [Descripción y referencias](#descripción-y-referencias)
* [Contribuir](#contribuir)
<!-- tocstop -->

# Requerimientos
- Node v18.15.x LTS

# Utilización
<!-- usage -->
```sh-session
$ npm install -g peg-java
$ peg-java COMMAND
running command...
$ peg-java (--version)
peg-java/2.3.3 linux-x64 node-v18.15.0
$ peg-java --help [COMMAND]
USAGE
  $ peg-java COMMAND
...
```
<!-- usagestop -->

Ejecutar en desarrollo:  
  `./bin/dev COMMAND`  

Ejecutar en producción:  
  `./bin/run COMMAND`  

Mostrar debug (aplica a los anteriores):  
  `DEBUG=peg-java:* peg-java COMMAND`  

Ejecutar pruebas:  
  `npm run test`

# Comandos
<!-- commands -->
* [`peg-java DIRECTORY`](#peg-java-directory)
* [`peg-java help [COMMANDS]`](#peg-java-help-commands)

## `peg-java DIRECTORY`

Analiza el directorio entregado cómo argumento

```
USAGE
  $ peg-java DIRECTORY [--noDistance | [--noAbstraction | --noInstability] | ]

ARGUMENTS
  DIRECTORY  Ruta directorio de proyecto. (Absoluta o relativa)

FLAGS
  --noAbstraction  Omite el cálculo de abstracción
  --noDistance     Omite el cálculo de distancia
  --noInstability  Omite el cálculo de inestabilidad

DESCRIPTION
  Analiza el directorio entregado cómo argumento

  Recorre el directorio del proyecto Maven/Gradle y parsea los archivos .java, genera
  un gráfico abstracción/inestabilidad El directorio `test` y clases que contengan la
  palabra `Test` son omitidas.

EXAMPLES
  $ peg-java ../opencsv-source/
    Analizando proyecto en: ../opencsv-source/
    Archivos java: 150
    Total Acoplamiento: 106 Ca - 217 Ce
    Inestabilidad: 0.6718
    Abstracción: 0.2632
    Distancia: 0.065
    Gráfico generado en: distance-chart.png
```

_See code: [dist/commands/index.ts](https://gitlab.com/jmainhard/peg-java/blob/v2.3.3/dist/commands/index.ts)_

## `peg-java help [COMMANDS]`

Display help for peg-java.

```
USAGE
  $ peg-java help [COMMANDS] [-n]

ARGUMENTS
  COMMANDS  Command to show help for.

FLAGS
  -n, --nested-commands  Include all nested commands in the output.

DESCRIPTION
  Display help for peg-java.
```

_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v5.2.9/src/commands/help.ts)_
<!-- commandsstop -->

# Descripción y referencias
Este programa calcula la abstracción e inestabilidad con el fin de ayudar a comprender la arquitectura de un Software, se puede encontrar material de referencia a continuación:

- https://medium.com/javarevisited/abstractness-vs-instability-neo4j-case-study-c453f46a6ea5 (Artículo de referencia para cálculo de mismas métricas para paquetes de un proyecto)
- https://www.jarchitect.com/Metrics (Herramienta)
- https://ieeexplore.ieee.org/document/491650 (Artículo sobre acoplamiento en POO)
- https://scitools.com/ (Understand, Herramienta FOSS para análisis de código)

## Arquitectura
Changelog: Release 2

### Estilo arquitectónico **microkernel**  
Cómo parte del proceso actualizar la arquitectura del proyecto se decidió utilizar el estilo arquitectónico microkernel, el cual permite separar la lógica de negocio de la lógica de la aplicación, esto permite que la lógica de negocio sea independiente de la plataforma y pueda ser reutilizada en otras aplicaciones. El enfoque principal de esta entrega es la modularidad y la extensibilidad, por lo que se considera que este estilo arquitectónico es el más adecuado para el proyecto.

- `src/commands`: Contiene los comandos de la aplicación, estos son los encargados de recibir los argumentos y opciones de la línea de comandos y delegar la ejecución a los servicios correspondientes. Es el equivalente a un cliente que accede a mecanismos en la arquitectura microkernel a través de capabilidades para comunicarse con un `service` o `Plugin`.
- `src/service`: Servicios que contienen la lógica de negocio de la aplicación, estos son los encargados de realizar los cálculos y generar las métricas solicitadas. Es el equivalente a un `Plugin` en la arquitectura microkernel. Contiene servicios que extienden de `Plugin` cómo un tipo genérico de servicio.
- `src/core`: Corresponde a el kernel o core de _peg-java_, a través de `peg-java.ts` actualiza la estadística del proyecto analizado, recibe las notificaciones generadas por los servicios, utiliza el Singleton `ProjectStats` y lo actualiza por medio de los eventos recibidos.

### Patrones de diseño
- **Singleton**: Se utiliza para mantener la estadística del proyecto analizado, esta estadística es actualizada por los servicios y es utilizada por el comando `peg-java` para mostrar los resultados. (`src/model/project-stat.ts`)
- **Observer**: Se utiliza para notificar a los servicios cuando se ha analizado un archivo, esto permite que los servicios puedan actualizar la estadística del proyecto.
  - `src/core/peg-java.ts`: Observer (Suscriptor), es notificado por los servicios cuando se ha analizado un archivo u obtenido una métrica.
  - `src/model/plugin.ts`: Subject (Publicador), clase abstracta que funciona cómo base para crear `Plugins`, notifica al kernel cuando se ha analizado un archivo u obtenido una métrica y lo asigna en `ProjectStat`.

## Diagrama

El siguiente diagrama representa las principales dependencias en el proyecto que permiten el funcionamiento descrito en la [arquitectura](#arquitectura).

![arch_img](https://i.imgur.com/mgDmZev.png)


# Contribuir
peg-java fué hecho por [@jmainhard](https://gitlab.com/jmainhard) cómo parte de una evaluación académica. Para contribuir se considera:
- UXD en Español (En medida de lo posible)
- Código en Inglés

---
_Source: https://npm.io/package/peg-java · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
