-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Init :: Sanitize name and paths #193
base: master
Are you sure you want to change the base?
Init :: Sanitize name and paths #193
Conversation
#188 (comment) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Groso @nmigueles !!! 💯 🐫
Ahí dejé los comentarios que te había contado y me habían quedado colgado hace un montón jajaj
Entiendo que parte de esto lo charlaste con @asanzo , me gustaría que saber qué piensa de mis comentarios 🤔
@@ -55,6 +55,7 @@ | |||
"cytoscape": "^3.15.2", | |||
"express": "^4.18.1", | |||
"globby": "^11.0.4", | |||
"lodash": "^4.17.21", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uhhh polémico 😆
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Esto se usa para las funciones camelCase
y kebabCase
.
Quizá podemos encontrar alguna implementación por ahí y evitar la dependencia.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
encontré estas bibliotecas
test/assertions.ts
Outdated
Assertion.addMethod('pathExists', function () { | ||
const path = this._obj |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😨
const exampleName = name ?? 'example' | ||
logger.info(`Creating definition file ${exampleName}.${WOLLOK_FILE_EXTENSION}`) | ||
writeFileSync(join(project, `${exampleName}.${WOLLOK_FILE_EXTENSION}`), wlkDefinition) | ||
const exampleName = name && name.length > 0 ? name : 'example' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👏
logger.info(`Creating definition file ${exampleName}.${WOLLOK_FILE_EXTENSION}`) | ||
writeFileSync(join(project, `${exampleName}.${WOLLOK_FILE_EXTENSION}`), wlkDefinition) | ||
const exampleName = name && name.length > 0 ? name : 'example' | ||
const exampleFilename = sanitizeName(exampleName) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mmmm tengo dudas sobre esto...
A mí me gusta que los programas entiendan lo que quiero hacer y, o bien lo hagan, o bien me tiren un error.
No sé si este comportamiento entra en alguna de esas.
Si me la estoy mandando en el nombre que elegí, tal vez sea mejor tirar un error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bueno, bien. Esta es la discusión interesante que quería tener.
Recordando lo frustrante que es elegir una contraseña en un banco y que te la vaya rechazando hasta que le pegás a cuántas mayúsculas y números quiere que tengas, y recordando la premisa que usamos en otros lugares de desburocratizar la UX (como cuando establecimos que el creador de desafíos de Pilas Bloques debía siempre armar desafíos válidos, en lugar de tirar popups de "te falta el personaje" o "no se puede poner un personaje encima de...." etc.), se me ocurrió la propuesta de "dejame pasar todo, corregí lo que quieras, sólo dame mi proyecto Wollok"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pero no me vuelvo loco si quieren mostrar un error del estilo "recordá que los nombres de proyecto deben empezar con minúscula, no incluir caracteres raros. Pueden tener letras, números y guiones bajos pero no espacios o eñes". y listo.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sí, yo prefiero no tomar decisiones por el usuario. Si elegís un nombre incorrecto, que falle es lo más sano (salvo en el package.json que no me interesa mucho que tenga un nombre porque esa validación no es nuestra ni tampoco la queremos)
src/utils.ts
Outdated
* Replaces every symbol not allowed with a '_'. | ||
*/ | ||
export const sanitizeName = (name: string): string => camelCase(name[0].replace(/([^a-z_])/g, '_$1') + name.slice(1).replace(/[^a-zA-z1-9_-]/g, '_')) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Creo que acá se debería re-usar la misma lógica que la validación (habría que hacer un refactor de la función):
https://github.com/uqbar-project/wollok-ts/blob/6ad63ac1f8ad7b069eb61204ab897f8cd49efa0c/src/validator/index.ts#L458-L461
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
De todas formas, yo creo que el problema del issue #188 es que los archivos se están creando con el mismo nombre que el proyecto.... yo no sé si quiero eso.
Yo voto por elegir el nombre del proyecto (carpeta base) y que los archivos siempre se llamen example.wlk
, etc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, ahí me di cuenta que el init crea los archivos pero no la carpeta base... En ese caso esperaría que:
- si no le digo nada, tenga el cuenta el nombre del directorio en donde estoy
- si le doy un nombre, me cree una carpeta
No sé, tiro comments para debatir 🍡
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- El problema del issue 118 es que se están usando caracteres en lugares donde no andan, como marco en opción "name" del cli no debería dejar usar caracteres especiales #188 (comment)
- Para mí el name debería ser la cosa más safe del mundo. Acá en el código que mencionás, Rasta lindo, si entiendo bien esa regex, incluye puntos y barras, que no los quiero, como menciono en el comentario anterior.
Sobre los defaults:
- No me gusta la de tomar el nombre del directorio. Es raro el comportamiento, no siempre creo una carpeta especialmente. Es sucio, lo sé, pero haría que se llame de formas raras.
- Si vamos a crear una carpeta, el nombre debería ser obligatorio para mí.
- De todas formas, opino que no quiero crear una carpeta (el git init no lo hace, el npm init tampoco...)
- Si no creamos la carpeta, podría tener "example" como nombre de proyecto por defecto y ya, o lo que quieran.
- No tengo una opinión muy fuerte respecto de tener el nombre del proyecto en los nombres de los archivos. Siento que me gusta que los proyectos tengan nombres de archivos distintos, y por otro lado siento que me gusta la simplicidad de que se llamen todos igual.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No me gusta la de tomar el nombre del directorio. Es raro el comportamiento, no siempre creo una carpeta especialmente. Es sucio, lo sé, pero haría que se llame de formas raras.
+1 y comenté sobre el cambio de exampleFileName
. Yo separaría por un lado el proyecto del nombre del example.
De todas formas, opino que no quiero crear una carpeta
stack test sí lo hace, CRA (create-react-app) sí lo hace, svelte-kit sí lo hace. Esta cuestión es debatible, lo que por ahí tiene a favor es que obliga a una persona a crear la carpeta previamente y eso no te va a dar el error de hacer code .
en la carpeta raíz como pasa con el 20% de los pibes que reportan errores en Haskell.
Por otra parte, vas a tener el 20% de pibes que van a quejarse cuando creen su segundo proyecto porque van a olvidarse de crear la carpeta y van a tener todo en un gran directorio.
test/init.test.ts
Outdated
it('should normalize package.json name when creating with custom name', async () => { | ||
init(undefined, { ...baseOptions, name: 'Pepita Game' }) | ||
|
||
expect(join(project, 'pepitaGame.wlk')).to.pathExists() | ||
expect(join(project, 'testPepitaGame.wtest')).to.pathExists() | ||
expect(join(project, 'package.json')).to.pathExists() | ||
expect(join(project, GITHUB_FOLDER, 'ci.yml')).to.pathExists() | ||
expect(join(project, 'README.md')).to.pathExists() | ||
expect(join(project, '.gitignore')).to.pathExists() | ||
|
||
// Assert content of package.json | ||
const packageJson = readFileSync(join(project, 'package.json'), 'utf8') | ||
const { name } = JSON.parse(packageJson) | ||
expect(name).to.be.equal('pepita-game') | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sé que dije de no tener este comportamiento, pero debo admitir que este test me cabe.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seh, es hermoso.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
jajaja, banco!
Buenas, retomando este PR, para mi la cuestion se divide en 3 partes atacables: (que podrian ser prs por separado para simplificar las discuciones)
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bueno @nmigueles ahí dejé algunos comentarios sobre este PR
|
||
if (!noTest) { | ||
const testFile = `test${capitalizeFirstLetter(exampleName)}.${TEST_FILE_EXTENSION}` | ||
const testFile = `test${capitalizeFirstLetter(exampleFilename)}.${TEST_FILE_EXTENSION}` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ojo que deberíamos dejar exampleName
y en todo caso validarlo/sanitizarlo
} | ||
|
||
if (game) { | ||
const gameFile = `main${capitalizeFirstLetter(exampleName)}.${PROGRAM_FILE_EXTENSION}` | ||
const gameFile = `main${capitalizeFirstLetter(exampleFilename)}.${PROGRAM_FILE_EXTENSION}` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lo mismo acá: es exampleName
const exampleName = name && name.length > 0 ? name : 'example' | ||
const exampleFilename = sanitizeName(exampleName) | ||
|
||
const wollokDefinitionFile = `${exampleFilename}.${WOLLOK_FILE_EXTENSION}` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ver comentario más abajo exampleName
src/utils.ts
Outdated
* Replaces every symbol not allowed with a '_'. | ||
*/ | ||
export const sanitizeName = (name: string): string => camelCase(name[0].replace(/([^a-z_])/g, '_$1') + name.slice(1).replace(/[^a-zA-z1-9_-]/g, '_')) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No me gusta la de tomar el nombre del directorio. Es raro el comportamiento, no siempre creo una carpeta especialmente. Es sucio, lo sé, pero haría que se llame de formas raras.
+1 y comenté sobre el cambio de exampleFileName
. Yo separaría por un lado el proyecto del nombre del example.
De todas formas, opino que no quiero crear una carpeta
stack test sí lo hace, CRA (create-react-app) sí lo hace, svelte-kit sí lo hace. Esta cuestión es debatible, lo que por ahí tiene a favor es que obliga a una persona a crear la carpeta previamente y eso no te va a dar el error de hacer code .
en la carpeta raíz como pasa con el 20% de los pibes que reportan errores en Haskell.
Por otra parte, vas a tener el 20% de pibes que van a quejarse cuando creen su segundo proyecto porque van a olvidarse de crear la carpeta y van a tener todo en un gran directorio.
@@ -55,6 +55,7 @@ | |||
"cytoscape": "^3.15.2", | |||
"express": "^4.18.1", | |||
"globby": "^11.0.4", | |||
"lodash": "^4.17.21", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
encontré estas bibliotecas
test/assertions.ts
Outdated
const exists = existsSync(path) | ||
|
||
const pathBasePath = path.split('/').slice(0, -1).join('/') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ésto funcionará para Windows?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mismo que aca, lo voy a volar #193 (comment)
test/assertions.ts
Outdated
const pathBasePath = path.split('/').slice(0, -1).join('/') | ||
|
||
// Improve error message if path does not exist | ||
const files = !exists ? lstatSync(pathBasePath).isDirectory() ? readdirSync(pathBasePath) : [] : [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
uh, áspero el : [] : []
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See, todo esto lo pase a #205 y cuando retome esto cuando tenga un cacho lo vuelo de aca, lo simplifique para que funcione y no haga cosas raras
test/init.test.ts
Outdated
@@ -81,28 +82,80 @@ describe('testing init', () => { | |||
...baseOptions, | |||
noCI: true, | |||
noTest: true, | |||
game: true, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
qué onda? por qué se agregó game: true
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Porque estaba en un limbo el test case, en el arrange seteaba un game: false, pero en el assert comprobaba archivos de game, asi que me parecio mas copado prenderlo
test/init.test.ts
Outdated
expect(join(project, '.gitignore')).to.pathExists | ||
expect(join(project, 'README.md')).to.pathExists | ||
expect(join(project, 'pepita.wlk')).to.pathExists() | ||
expect(join(project, 'testPepita.wtest')).not.to.pathExists() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
qué loco que el flag no lo usaba y en el test no lo corregí, bien ahí detectando eso
test/init.test.ts
Outdated
it('should normalize package.json name when creating with custom name', async () => { | ||
init(undefined, { ...baseOptions, name: 'Pepita Game' }) | ||
|
||
expect(join(project, 'pepitaGame.wlk')).to.pathExists() | ||
expect(join(project, 'testPepitaGame.wtest')).to.pathExists() | ||
expect(join(project, 'package.json')).to.pathExists() | ||
expect(join(project, GITHUB_FOLDER, 'ci.yml')).to.pathExists() | ||
expect(join(project, 'README.md')).to.pathExists() | ||
expect(join(project, '.gitignore')).to.pathExists() | ||
|
||
// Assert content of package.json | ||
const packageJson = readFileSync(join(project, 'package.json'), 'utf8') | ||
const { name } = JSON.parse(packageJson) | ||
expect(name).to.be.equal('pepita-game') | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
jajaja, banco!
Qué onda esto @nmigueles @asanzo @fdodino ? Dejamos escrito alguna forma de cerrar este PR? |
Dale, el jueves nos juntamos a cerrar una definición. |
Bueno, acá nos juntamos el comité y unánimemente definimos Crear o no crear la carpeta
Caracteres incorrectos en el proyecto o el nombre
Nombres de los archivos wlk, wtest
wollok init -p proyectito -n pepita te genera una carpeta proyectito que tiene adentro pepita.wlk y testPepita.wtest, por defecto si no te deja example.wlk y testExample.wtest.
|
Fixed path assertions that were wrong, tried to make a failing test and was not failing 💀Ahora en Fix de pathAssertion #205