Proyecto para el Trabajo Práctico Integrador de la cursada 2020 de la materia Taller de Tecnologías de Producción de Software - Opción Ruby, de la Facultad de Informática de la Universidad Nacional de La Plata.
Ruby Notes, o simplemente rn
, es un gestor de notas concebido como un clon simplificado
de la excelente herramienta TomBoy.
Para ejecutar el comando principal de la herramienta se utiliza el script bin/rn
, el cual
puede correrse de las siguientes manera:
$ ruby bin/rn [args]
O bien:
$ bundle exec bin/rn [args]
O simplemente:
$ bin/rn [args]
Si se agrega el directorio bin/
del proyecto a la variable de ambiente PATH
de la shell,
el comando puede utilizarse sin prefijar bin/
:
# Esto debe ejecutarse estando ubicad@ en el directorio raiz del proyecto, una única vez
# por sesión de la shell
$ export PATH="$(pwd)/bin:$PATH"
$ rn [args]
$ bundle install
Nota: Bundler debería estar disponible en tu instalación de Ruby, pero si por algún motivo al intentar ejecutar el comando
bundle
obtenés un error indicando que no se encuentra el comando, podés instalarlo mediante el siguiente comando:$ gem install bundler
Una vez que la instalación de las dependencias sea exitosa (esto deberías hacerlo solamente cuando estés comenzando con la utilización del proyecto), podés comenzar a probar la herramienta y a desarrollar tu entrega.
-
lib/
: directorio que contiene todas las clases del modelo y de soporte para la ejecución del programabin/rn
.lib/rn.rb
es la declaración del namespaceRN
, y las directivas de carga de clases o módulos que estén contenidos directamente por éste (autoload
).lib/rn/
es el directorio que representa el namespaceRN
. Notá la convención de que el uso de un módulo como namespace se refleja en la estructura de archivos del proyecto como un directorio con el mismo nombre que el archivo.rb
que define el módulo, pero sin la terminación.rb
. Dentro de este directorio se ubicarán los elementos del proyecto que estén bajo el namespaceRN
- que, también por convención y para facilitar la organización, deberían ser todos. Es en este directorio donde deberías ubicar tus clases de modelo, módulos, clases de soporte, etc. Tené en cuenta que para que todo funcione correctamente, seguramente debas agregar nuevas directivas de carga en la definición del namespaceRN
(o dónde corresponda, según tus decisiones de diseño).lib/rn/commands.rb
ylib/rn/commands/*.rb
son las definiciones de comandos dedry-cli
que se utilizarán. En estos archivos es donde comenzarás a realizar la implementación de las operaciones en sí, que en esta plantilla están provistas como simples disparadores.lib/rn/version.rb
define la versión de la herramienta, utilizando SemVer.
-
bin/
: directorio donde reside cualquier archivo ejecutable, siendo el más notoriorn
que se utiliza como punto de entrada para el uso de la herramienta.-
Armado de ejemplos en las mismas llamadas a los comandos
-
https://stackoverflow.com/questions/36350321/errnoenoent-no-such-file-or-directory-rb-sysopen
-
Editor de notas "a mano"
prompt = "RN>> " eof = "EON" eof_feedback = " [End Of Note]\n" File.open(file, File::RDWR|File::CREAT, 0644) {|f| f.flock(File::LOCK_EX) f.rewind print "\nWrite the contents of the note below.\nYou can write multiple lines.\nEnd the note with '#{eof}' + [Enter].\n\n#{prompt}" content = "" input_line = STDIN.gets while input_line.chomp != eof content << input_line print "#{prompt}" input_line = STDIN.gets end print eof_feedback f.write content f.truncate(f.pos) }
-
Separar Modelo de Comandos
-
Separar manejo de archivos de Modelo
-
-
Elegir formato de texto plano:
-
Elegir formato rico:
- HTML
-
Para convertir de texto Markdown a HTML estuve probando dos liberias redcarpet y github-markdown. El problema que tenia este último es que necesita que llos archivos sean
.markdown
y tuve que hacer archivos temporales porque no queria modificar demasiado como se guardaban los archivos desde antes. Entonces a la hora de exportar un archivo se hace una copia a a una carpeta temporal con la estensión correspondiente para que pueda leerlo ese modulo. No me gustaba esta estrategia por eso termine decidiendome a último momento por redcarpet que además tiene mejor documentación y me fué mas sencillo de configurar. -
Un problema que tuve para agregar el comando
--export
fue que no sabía si ponerlo en la parte de notas, o en la parte de libros (n
yb
son los argumentos principales). El un principio pense ponerlo del lado de libro y que se use de la siguiente manera:rn b export --note unaNota --book unLibro # para exportar las notas "unaNota" de "unLibro" rn b export --global # para exportar las notas globales rn b export --book unLibro # para exportar las notas de unLibro rn b export # para exportar todas las notas
El problema era que se usaba
--book
para indicar el libro con la intención de exporar todas las notas de ese libro se podia pisar con cuando se usa esa misma opción para indicar el libro al que perteneces una nota. Por ello decidi ponerlo bajo el comando de notas (aunque pensandolo ahora podría accederse de ambos "lados"). Asi:rn n export unaNota --book unLibro # para exportar las notas "unaNota" de "unLibro" rn n export --global # para exportar las notas globales rn n export --book unLibro # para exportar las notas de unLibro rn n export # para exportar todas las notas
Por lo tanto cuando el argumento de la nota es nulo, se toma que se exportaran todas las notas de el libro indicado por la opción
--book
. De todas maneras las notas no conoces a los libros y a las otras notas, por lo que el manejo interno igualmente lo hace la claseBook
, que arma las colecciones pertinentes de notas, pidiendole los datos a la claseNote
, para luego llamar a la nueva claseExporter
que con ayuda de la claseFileManager
mueve y crea los nuevos archivos. -
Se ofrecen algunas opciones para facilitar el uso, aunque esto fue pensado con el optimismo de tener varios sistemas de marcado y varios formatos de salida, pero ya queda el cli por si en algún momento se imprementa. Para ello uso TTY-prompt
-
Al HTML que genera redcarpet se le agregan unos simples tags para indicar el título y libro de la nota. Se intento embellecerlos con unas librerías sin éxito (codeprettify parece que ya no anda mas, y rouge (tutorial) parece que hay que usarlo con rails, asi que para más adelante).
-
Para intentar la conversión a PDF se estuvo leyendo esto, esto y esto