biblioDSL 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 514df1d6ff15300b562940feed3861ca542f4f81
4
+ data.tar.gz: f4878250baaf27d16bb5557cd9c8224725801e52
5
+ SHA512:
6
+ metadata.gz: 6a79e06151e1baae25a2e23f64fa82cfe972273cb0547e2afca5980bcf4e91ea35935b0b205ed5f14a22db0424fa352f71034c93c1853187dc4b66edebee3556
7
+ data.tar.gz: f9f2a625ff1b032e2a156c8fb24c9cbf6a0b100a1577bc5c1c8fcbb29236695316e28032b614479e6032171d984cb0be2ce9d07ba76dc76d70ee588c60d7665a
@@ -0,0 +1 @@
1
+ service_name: travis-ci
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *~
11
+ *.sublime*
12
+ .DS_Store
13
+ ._.DS_Store
14
+ ._*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4 # La versión de ruby de mi ordenador
4
+ - 2.2.0
5
+ - 1.9.3
6
+ - jruby-19mode # JRuby in 1.9 mode
7
+ - rbx-19mode
8
+ before_install: gem install bundler -v 1.10.6
9
+ notifications:
10
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in biblioDSL.gemspec
4
+ gemspec
@@ -0,0 +1,89 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard :bundler do
19
+ require 'guard/bundler'
20
+ require 'guard/bundler/verify'
21
+ helper = Guard::Bundler::Verify.new
22
+
23
+ files = ['Gemfile']
24
+ files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }
25
+
26
+ # Assume files are symlinked from somewhere
27
+ files.each { |file| watch(helper.real_path(file)) }
28
+ end
29
+
30
+ # Note: The cmd option is now required due to the increasing number of ways
31
+ # rspec may be run, below are examples of the most common uses.
32
+ # * bundler: 'bundle exec rspec'
33
+ # * bundler binstubs: 'bin/rspec'
34
+ # * spring: 'bin/rspec' (This will use spring if running and you have
35
+ # installed the spring binstubs per the docs)
36
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
37
+ # * 'just' rspec: 'rspec'
38
+
39
+ guard :rspec, cmd: "bundle exec rspec" do
40
+ require "guard/rspec/dsl"
41
+ dsl = Guard::RSpec::Dsl.new(self)
42
+
43
+ # Feel free to open issues for suggestions and improvements
44
+
45
+ # RSpec files
46
+ rspec = dsl.rspec
47
+ watch(rspec.spec_helper) { rspec.spec_dir }
48
+ watch(rspec.spec_support) { rspec.spec_dir }
49
+ watch(rspec.spec_files)
50
+
51
+ watch(/.*/) do |m|
52
+ fichero = m.join(" ").sub("lib/biblioDSL","").sub(".rb", "")
53
+ "spec#{fichero}_spec.rb"
54
+ end
55
+
56
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
57
+
58
+ # Ruby files
59
+ ruby = dsl.ruby
60
+ dsl.watch_spec_files_for(ruby.lib_files)
61
+
62
+ # Rails files
63
+ rails = dsl.rails(view_extensions: %w(erb haml slim))
64
+ dsl.watch_spec_files_for(rails.app_files)
65
+ dsl.watch_spec_files_for(rails.views)
66
+
67
+ watch(rails.controllers) do |m|
68
+ [
69
+ rspec.spec.("routing/#{m[1]}_routing"),
70
+ rspec.spec.("controllers/#{m[1]}_controller"),
71
+ rspec.spec.("acceptance/#{m[1]}")
72
+ ]
73
+ end
74
+
75
+ # Rails config changes
76
+ watch(rails.spec_helper) { rspec.spec_dir }
77
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
78
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
79
+
80
+ # Capybara features specs
81
+ watch(rails.view_dirs) { |m| rspec.spec.("features/#{m[1]}") }
82
+ watch(rails.layouts) { |m| rspec.spec.("features/#{m[1]}") }
83
+
84
+ # Turnip features and steps
85
+ watch(%r{^spec/acceptance/(.+)\.feature$})
86
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
87
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
88
+ end
89
+ end
@@ -0,0 +1,129 @@
1
+ # LPP: Práctica 11 - Lenguajes de Dominio Específico
2
+ [![Build Status](https://travis-ci.org/DanielRamosAcosta/prct11.svg?branch=master)](https://travis-ci.org/DanielRamosAcosta/prct11) [![Coverage Status](https://coveralls.io/repos/DanielRamosAcosta/prct11/badge.svg?branch=master&service=github)](https://coveralls.io/github/DanielRamosAcosta/prct11?branch=master)
3
+ ## Enunciado
4
+ Se nos pide crear un Lenguaje de Dominio Específico para representar bibliografías.
5
+ ## Implementación
6
+ Voy a usar la implentación que está en el enunciado del ejercicio, y usando el mismo formato que el de la [práctica 10](https://github.com/DanielRamosAcosta/prct10).
7
+
8
+ ###Libro:
9
+
10
+ * **Título**: Crónicas de una Muerte Anunciada
11
+ * **Autor**: Gabriel García Márquez
12
+ * **Año de publicación**: 1981
13
+ * **Edición**: 4
14
+ * **Volumen**: 1
15
+ * **Lugar de publicación**: Colombia
16
+ * **Editorial**: La Oveja Negra
17
+ * **Resultado esperado**: `García, M. G. (1981). Crónicas de una Muerte Anunciada (4) (1). Colombia: La Oveja Negra.`
18
+ * **Instanciación**:
19
+
20
+ ``` ruby
21
+ @libro = DRA::Libro.new("Crónicas de una muerte anunciada") do
22
+ autores :apellido => "García",
23
+ :apellido2 => "Márquez",
24
+ :nombre => "Gabriel"
25
+ fecha :anio=>1981
26
+ pais "Colombia"
27
+ editorial "La Oveja Negra"
28
+ edicion 4
29
+ volumen 1
30
+ end
31
+ ```
32
+
33
+ ###Artículo/Capítulo de un libro
34
+
35
+ * **Título de la obra**: Acreditación en Chile: La experiencia de un lustro
36
+ * **Autor 1**: María Persico Jiménez
37
+ * **Autor 2**: Pablo Perisco Jiménez
38
+ * **Año de publicación**: 1997
39
+ * **Título del artículo o capítulo**: El Estado
40
+ * **Editor 1**: Eduardo Villalba García
41
+ * **Editor 2**: Godalupe Magana Gonzáles
42
+ * **Número de páginas del capítulo**: 27.
43
+ * **Edición**: 8
44
+ * **Volumen**: 2
45
+ * **Lugar de publicación**: Chile.
46
+ * **Editorial**: Creatividad, educación y desarrollo
47
+ * **Resultado esperado**: `Perisco, J. M. & Perisco, J. P. (1997). El Estado. En Villalba, G. E. & Magana, G. G. (Eds.), Acreditación en Chile: la Experiencia de un Lustro (27) (8) (2). Chile: Creatividad, educación y desarrollo.`
48
+ * **Instanciación**:
49
+
50
+ ```ruby
51
+ @capitulo = DRA::Capitulo.new("Acreditación en Chile: La experiencia de un lustro") do
52
+ autores :apellido => "Perisco",
53
+ :apellido2 => "Jiménez",
54
+ :nombre => "Maria"
55
+ autores :apellido => "Perisco",
56
+ :apellido2 => "Jiménez",
57
+ :nombre => "Pablo"
58
+ fecha :anio=>1997
59
+ pais "Chile"
60
+ editorial "Creatividad, educación y desarrollo"
61
+ edicion 8
62
+ volumen 2
63
+ capitulo "El Estado"
64
+ paginas 27
65
+ editores :apellido => "Villalba",
66
+ :apellido2 => "García",
67
+ :nombre => "Eduardo"
68
+ editores :apellido => "Magana",
69
+ :apellido2 => "Gonzáles",
70
+ :nombre => "Godalupe"
71
+ end
72
+ ```
73
+
74
+ ### Artículo de periódico
75
+
76
+ * **Título**: El primer móvil con Android One
77
+ * **Autor 1**: Javier Palazón
78
+ * **Autor 2**: Laura Pajuelo
79
+ * **Fecha**: 15-11-2015
80
+ * **Periódico**: El País
81
+ * **Páginas del periódico**: 68
82
+ * **Resultado esperado**: `Palazon, J. & Pajuelo, L. (15 de noviembre de 2015). El Primer Móvil con Android one. El País, pp. 68.`
83
+ * **Instanciación**:
84
+
85
+ ```ruby
86
+ @periodico = DRA::Periodico.new("El primer móvil con Android One") do
87
+ autores :apellido => "Palazón",
88
+ :nombre => "Javier"
89
+ autores :apellido => "Pajuelo",
90
+ :nombre => "Laura"
91
+ fecha :dia=>15,
92
+ :mes=>11,
93
+ :anio=>2015
94
+ periodico "El País"
95
+ paginas 68
96
+ end
97
+ ```
98
+
99
+ ###Documentos electrónicos
100
+
101
+ * **Título**: Evaluación del impacto de los proyectos de desarrollo en la pobreza: Manual para profesionales
102
+ * **Autor 1**: James Baker
103
+ * **Fecha**: 25-7-2000
104
+ * **Edición**: 6
105
+ * **Tipo de medio**: Web
106
+ * **Lugar de publicación**: España
107
+ * **Editor**: Banco Internacional de Reconstrucción y Fomento/BANCO MUNDIAL
108
+ * **Disponible en**: http://siteresources.worldbank.org/INTISPMA/Resources/Impact-Evaluation-Handbook--Spanish-/manual.pdf
109
+ * **Fecha de acceso**: 3-12-2015
110
+ * **Resultado esperado**: `Backer. J. (25 de Julio de 2000). Evaluación del impacto de los proyectos de desarrollo en la pobreza: Manual para profesionales (6), Web. España: Banco Internacional de Reconstrucción y Fomento/BANCO MUNDIAL. Disponible en: http://siteresources.worldbank.org/INTISPMA/Resources/Impact-Evaluation-Handbook--Spanish-/manual.pdf (3-12-2015).`
111
+ * **Instanciación**:
112
+
113
+ ```ruby
114
+ @documentoElectronico = DRA::DocumentoElectronico.new("Evaluación del impacto de los proyectos de desarrollo en la pobreza: Manual para profesionales") do
115
+ autores :apellido => "Baker",
116
+ :nombre => "James"
117
+ fecha :dia=>25,
118
+ :mes=>7,
119
+ :anio=>2000
120
+ edicion 6
121
+ formato "Web"
122
+ pais "España"
123
+ editor "Banco Internacional de Reconstrucción y Fomento/BANCO MUNDIAL"
124
+ disponible "http://siteresources.worldbank.org/INTISPMA/Resources/Impact-Evaluation-Handbook--Spanish-/manual.pdf"
125
+ fecha_acc :dia=>3,
126
+ :mes=>12,
127
+ :anio=>2015
128
+ end
129
+ ```
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'biblioDSL/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "biblioDSL"
8
+ spec.version = BiblioDSL::VERSION
9
+ spec.authors = ["Daniel Ramos"]
10
+ spec.email = ["danielramosacosta@hotmail.com"]
11
+
12
+ spec.summary = %q{Esta es una gema para representar referencias en forma de una bilbiografía}
13
+ spec.description = %q{Tiene su propopio DSL así que es super mega fácil de usar}
14
+ spec.homepage = "https://github.com/DanielRamosAcosta/prct11"
15
+
16
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
+ # delete this section to allow pushing this gem to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.10"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec"
32
+ spec.add_development_dependency "guard"
33
+ spec.add_development_dependency "guard-rspec"
34
+ spec.add_development_dependency "guard-bundler"
35
+ spec.add_development_dependency "coveralls"
36
+ spec.add_development_dependency "yard"
37
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "biblioDSL"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+ require "biblioDSL/version"
3
+ require 'biblioDSL/referencias/referencia'
4
+ require 'biblioDSL/referencias/libro'
5
+ require 'biblioDSL/referencias/capitulo'
6
+ require 'biblioDSL/referencias/periodico'
7
+ require 'biblioDSL/referencias/documentoElectronico'
8
+ require 'biblioDSL/bibliografia'
9
+
10
+ # Módulo por defecto creado por bundler
11
+ module BiblioDSL
12
+ # Your code goes here...
13
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ require_relative 'referencias/documentoElectronico'
3
+ require_relative 'referencias/periodico'
4
+ require_relative 'referencias/capitulo'
5
+ require_relative 'referencias/libro'
6
+
7
+ module DRA
8
+ # Esta clase representa una lista de referencias.
9
+ # @author Daniel Ramos Acossta <alu0100843095@ull.edu.es>
10
+ class Bibliografia
11
+ include Enumerable
12
+ # Constructor de la clase
13
+ def initialize
14
+ @lista = []
15
+ end
16
+ # Inserta una referencia en nuestra lista de forma ordenada
17
+ # @param [Referencia] referencia Es la referencia que se desea insertar. El ancestro en común debe ser referencia.
18
+ # @raise [ArgumentError] si el parámetro no es de tipo referencia
19
+ def insertar(referencia)
20
+ raise ArgumentError, "El tipo para insertar debe ser Referencia" unless referencia.kind_of?(Referencia)
21
+ @lista << referencia
22
+ @lista.sort!
23
+ end
24
+ # Método para que la clase sea enumerable.
25
+ # @yield [i] Cada elemento de la lista de referencias.
26
+ def each
27
+ @lista.each{ |i| yield i}
28
+ end
29
+ # Saca la bibliografía formateada
30
+ # @return la bibliografía como string
31
+ def to_s
32
+ str = ""
33
+ @lista.each { |i| str << "#{i.to_s}\n" } #Quitar las comillas de aqui
34
+ return str
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,86 @@
1
+ # encoding: UTF-8
2
+ require_relative 'referencia'
3
+
4
+ module DRA
5
+ # Esta es la clase que representa una referencia hacia un capítulo de un libro.
6
+ # @author Daniel Ramos Acossta <alu0100843095@ull.edu.es>
7
+ class Capitulo < Referencia
8
+ # Constructor de la clase
9
+ # @param [String] título de la obra
10
+ # @param [Proc] block bloque se evalúa como DSL si no se pasa implícitamente
11
+ # @raise [ArgumentError] cuando no se especifica el país
12
+ # @raise [ArgumentError] cuando no se especifica la editorial
13
+ # @raise [ArgumentError] cuando no se especifica la edición
14
+ # @raise [ArgumentError] cuando no se especifica el volumen
15
+ # @raise [ArgumentError] cuando no se especifica el capítulo
16
+ # @raise [ArgumentError] cuando no se especifica el número de páginas
17
+ # @raise [ArgumentError] cuando no se especifican los editores
18
+ def initialize(titulo, &block)
19
+ if block_given? #En esta parte revisamos si se le pasa un bloque
20
+ if block.arity == 1 #Si tiene un parámetro, entoces lazamos un yield de nosotros mismos
21
+ yield self
22
+ else
23
+ instance_eval &block #en otro caso, evaluamos el bloque de código que se nos pasa. NO USAMOS EVAL porque es peligroso
24
+ end
25
+ end
26
+ raise ArgumentError, "No se ha especificado el país" if @pais.nil?
27
+ raise ArgumentError, "No se ha especificado la editorial" if @editorial.nil?
28
+ raise ArgumentError, "No se ha especificado la edición" if @edicion.nil?
29
+ raise ArgumentError, "No se ha especificado el volumen" if @volumen.nil?
30
+ raise ArgumentError, "No se ha especificado el capítulo" if @capitulo.nil?
31
+ raise ArgumentError, "No se ha especificado el número de páginas" if @paginas.nil?
32
+ raise ArgumentError, "No se ha especificado los editores" if @editores.nil?
33
+ @editores = @editores[0...-3] unless @editores.nil?
34
+ super(titulo)
35
+ end
36
+ # Establece la editorial
37
+ # @param [String] editorial la editorial a establecer
38
+ # @raise [ArgumentError] si el tipo de la editorial es incorrecto
39
+ def editorial(editorial)
40
+ raise ArgumentError, "El tipo de la editorial es incorrecto" unless editorial.is_a?(String)
41
+ @editorial = editorial
42
+ end
43
+ # Establece la edición
44
+ # @param [Integer] edicion la edición a establecer
45
+ # @raise [ArgumentError] si el tipo de la edición es incorrecto
46
+ def edicion(edicion)
47
+ raise ArgumentError, "El tipo de la edición es incorrecto" unless edicion.is_a?(Integer)
48
+ @edicion = edicion
49
+ end
50
+ # Establece el volumen
51
+ # @param [Integer] volumen el volumen a establecer
52
+ # @raise [ArgumentError] si el tipo del volumen es incorrecto
53
+ def volumen(volumen)
54
+ raise ArgumentError, "El tipo del volumen es incorrecto" unless volumen.is_a?(Integer)
55
+ @volumen = volumen
56
+ end
57
+ # Establece el capítulo
58
+ # @param [String] capitulo el capítulo a establecer
59
+ # @raise [ArgumentError] si el tipo del capítulo es incorrecto
60
+ def capitulo(capitulo)
61
+ raise ArgumentError, "El tipo del capítulo es incorrecto" unless capitulo.is_a?(String)
62
+ @capitulo = capitulo
63
+ end
64
+ # Establece los editores
65
+ # @param [Hash] editores los editores a establecer
66
+ # @option editores [String] :nombre el nombre del autor
67
+ # @option editores [String] :apellido el primer apellido del autor
68
+ # @option editores [String] :apellido2 el segundo apellido del autor
69
+ def editores(editores)
70
+ #No hay que hacer raise de nada, ya que se encarga normalize_autores
71
+ @editores = "" if @editores.nil?
72
+ @editores << normalize_autores(editores[:nombre], editores[:apellido], editores[:apellido2])
73
+ end
74
+ # Establece el número de páginas
75
+ # @param [Integer] paginas el número de páginas a establecer
76
+ # @raise [ArgumentError] si el tipo del número de páginas es incorrecto
77
+ def paginas(paginas)
78
+ raise ArgumentError, "El tipo del número de páginas es incorrecto" unless paginas.is_a?(Integer)
79
+ @paginas = paginas
80
+ end
81
+ # Convierte la referencia en una cadena de carácteres bien formateada
82
+ def to_s
83
+ "#{@autores} (#{fecha_anio()}). #{@capitulo}. En #{@editores} (Eds.), #{@titulo} (#{@paginas.to_s}) (#{@edicion.to_s}) (#{@volumen.to_s}). #{@pais}: #{@editorial}."
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: UTF-8
2
+ require_relative 'referencia'
3
+ require 'date'
4
+
5
+ module DRA
6
+ # Esta clase representa una referencia hacia un documento electrónico
7
+ # @author Daniel Ramos Acossta <alu0100843095@ull.edu.es>
8
+ class DocumentoElectronico < Referencia
9
+ # @param [String] título de la obra
10
+ # @param [Proc] block bloque se evalúa como DSL si no se pasa implícitamente
11
+ # @raise [ArgumentError] cuando no se especifica la edición
12
+ # @raise [ArgumentError] cuando no se especifica el formato
13
+ # @raise [ArgumentError] cuando no se especifica el país
14
+ # @raise [ArgumentError] cuando no se especifica el editor
15
+ # @raise [ArgumentError] cuando no se especifica la disponibilidad
16
+ # @raise [ArgumentError] cuando no se especifica la última fecha de acceso
17
+ def initialize(titulo, &block)
18
+ if block_given? #En esta parte revisamos si se le pasa un bloque
19
+ if block.arity == 1 #Si tiene un parámetro, entoces lazamos un yield de nosotros mismos
20
+ yield self
21
+ else
22
+ instance_eval &block #en otro caso, evaluamos el bloque de código que se nos pasa. NO USAMOS EVAL porque es peligroso.
23
+ end
24
+ end
25
+ raise ArgumentError, "No se ha especificado la edición" if @edicion.nil?
26
+ raise ArgumentError, "No se ha especificado el formato" if @formato.nil?
27
+ raise ArgumentError, "No se ha especificado el país" if @pais.nil?
28
+ raise ArgumentError, "No se ha especificado el editor" if @editor.nil?
29
+ raise ArgumentError, "No se ha especificado la disponibilidad" if @disponible.nil?
30
+ raise ArgumentError, "No se ha especificado la última fecha de acceso" if @fecha_acc.nil?
31
+ super(titulo)
32
+ end
33
+ # Establece la edición
34
+ # @param [Integer] edicion la edición a establecer
35
+ # @raise [ArgumentError] si el tipo de la edición es incorrecto
36
+ def edicion(edicion)
37
+ raise ArgumentError, "El tipo de la edición es incorrecto" unless edicion.is_a?(Integer)
38
+ @edicion = edicion
39
+ end
40
+ # Establece el formato
41
+ # @param [String] formato el formato a establecer
42
+ # @raise [ArgumentError] si el tipo del formato es incorrecto
43
+ def formato(formato)
44
+ raise ArgumentError, "El tipo del formato es incorrecto" unless formato.is_a?(String)
45
+ @formato = formato
46
+ end
47
+ # Establece el editor
48
+ # @param [String] editor el editor a establecer
49
+ # @raise [ArgumentError] si el tipo del editor es incorrecto
50
+ def editor(editor)
51
+ raise ArgumentError, "El tipo del editor es incorrecto" unless editor.is_a?(String)
52
+ @editor = editor
53
+ end
54
+ # Establece la fuente de la referencia
55
+ # @param [String] disponible la url de la fuente
56
+ # @raise [ArgumentError] si el tipo de la fuente es incorrecto
57
+ def disponible(disponible)
58
+ raise ArgumentError, "El tipo de la disponibilidad es incorrecto" unless disponible.is_a?(String)
59
+ @disponible = disponible
60
+ end
61
+ # Establece la fecha de acceso de la referencia
62
+ # @param [Hash] fecha_acc la fecha de acceso a establecer
63
+ # @option fecha [Integer] :dia el día
64
+ # @option fecha [Integer] :mes el mes
65
+ # @option fecha [Integer] :anio el año
66
+ # @raise [ArgumentError] si el tipo de la fecha no es hash
67
+ # @raise [ArgumentError] si el tipo del día es incorrecto
68
+ # @raise [ArgumentError] si el tipo del mes es incorrecto
69
+ # @raise [ArgumentError] si el tipo del año es incorrecto
70
+ def fecha_acc(fecha_acc)
71
+ raise ArgumentError, "El tipo de la última fecha de acceso es incorrecto" unless fecha_acc.is_a?(Hash)
72
+ raise ArgumentError, "El día es de tipo incorrecto o no se especifica" unless fecha_acc[:dia].is_a?(Integer)
73
+ raise ArgumentError, "El mes es de tipo incorrecto o no se especifica" unless fecha_acc[:mes].is_a?(Integer)
74
+ raise ArgumentError, "El año es de tipo incorrecto o no se especifica" unless fecha_acc[:anio].is_a?(Integer)
75
+ @fecha_acc = Date.new(fecha_acc[:anio], fecha_acc[:mes], fecha_acc[:dia])
76
+ end
77
+ # Método para formatear esta referencia como se pide en el PDF
78
+ # @return [String] la referencia formateada
79
+ def to_s
80
+ "#{@autores} (#{fecha_completa}). #{@titulo} (#{@edicion.to_s}), #{@formato}. #{@pais}: #{@editor}. Disponible en: #{@disponible} (#{@fecha_acc.day.to_s}-#{@fecha_acc.mon.to_s}-#{@fecha_acc.year.to_s})."
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: UTF-8
2
+ require_relative 'referencia'
3
+
4
+ module DRA
5
+ # Clase que representa una referencia hacia un libro
6
+ # @author Daniel Ramos Acossta <alu0100843095@ull.edu.es>
7
+ class Libro < Referencia
8
+ # Constructor de la clase
9
+ # @param [String] título de la obra
10
+ # @param [Proc] block bloque se evalúa como DSL si no se pasa implícitamente
11
+ # @raise [ArgumentError] cuando no se especifica el país
12
+ # @raise [ArgumentError] cuando no se especifica la editorial
13
+ # @raise [ArgumentError] cuando no se especifica la edición
14
+ # @raise [ArgumentError] cuando no se especifica el volumen
15
+ def initialize(titulo, &block)
16
+ if block_given? #En esta parte revisamos si se le pasa un bloque
17
+ if block.arity == 1 #Si tiene un parámetro, entoces lazamos un yield de nosotros mismos
18
+ yield self
19
+ else
20
+ instance_eval &block #en otro caso, evaluamos el bloque de código que se nos pasa. NO USAMOS EVAL porque es peligroso.
21
+ end
22
+ end
23
+ raise ArgumentError, "No se ha especificado el país" if @pais.nil?
24
+ raise ArgumentError, "No se ha especificado la editorial" if @editorial.nil?
25
+ raise ArgumentError, "No se ha especificado la edición" if @edicion.nil?
26
+ raise ArgumentError, "No se ha especificado el volumen" if @volumen.nil?
27
+ super(titulo)
28
+ end
29
+ # Establece la editorial
30
+ # @param [String] editorial la editorial a establecer
31
+ # @raise [ArgumentError] si el tipo de la editorial es incorrecto
32
+ def editorial(editorial)
33
+ raise ArgumentError, "El tipo de la editorial es incorrecto" unless editorial.is_a?(String)
34
+ @editorial = editorial
35
+ end
36
+ # Establece la edición
37
+ # @param [Integer] edicion la edición a establecer
38
+ # @raise [ArgumentError] si el tipo de la edición es incorrecto
39
+ def edicion(edicion)
40
+ raise ArgumentError, "El tipo de la edición es incorrecto" unless edicion.is_a?(Integer)
41
+ @edicion = edicion
42
+ end
43
+ # Establece el volumen
44
+ # @param [Integer] volumen el volumen a establecer
45
+ # @raise [ArgumentError] si el tipo del volumen es incorrecto
46
+ def volumen(volumen)
47
+ raise ArgumentError, "El tipo del volumen es incorrecto" unless volumen.is_a?(Integer)
48
+ @volumen = volumen
49
+ end
50
+ # Método para formatear esta referencia como se pide en el PDF
51
+ # @return [String] la referencia formateada
52
+ def to_s
53
+ "#{@autores} (#{fecha_anio()}). #{@titulo} (#{@edicion.to_s}) (#{@volumen.to_s}). #{@pais}: #{@editorial}."
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: UTF-8
2
+ require_relative 'referencia'
3
+
4
+ module DRA
5
+ # Esta clase representa una referencia a un periódico
6
+ # @author Daniel Ramos Acossta <alu0100843095@ull.edu.es>
7
+ class Periodico < Referencia
8
+ # @param [String] título de la obra
9
+ # @param [Proc] block bloque se evalúa como DSL si no se pasa implícitamente
10
+ # @raise [ArgumentError] cuando no se especifica el periódico
11
+ # @raise [ArgumentError] cuando no se especifica el número de páginas
12
+ def initialize(titulo, &block)
13
+ if block_given? #En esta parte revisamos si se le pasa un bloque
14
+ if block.arity == 1 #Si tiene un parámetro, entoces lazamos un yield de nosotros mismos
15
+ yield self
16
+ else
17
+ instance_eval &block #en otro caso, evaluamos el bloque de código que se nos pasa. NO USAMOS EVAL porque es peligroso.
18
+ end
19
+ end
20
+ raise ArgumentError, "No se ha especificado el periódico" if @periodico.nil?
21
+ raise ArgumentError, "No se ha especificado el número de páginas" if @paginas.nil?
22
+ super(titulo)
23
+ end
24
+ # Establece el periódico
25
+ # @param [String] periodico el periódico a establecer
26
+ # @raise [ArgumentError] si el tipo del periódico es incorrecto
27
+ def periodico(periodico)
28
+ raise ArgumentError, "El tipo del periódico es incorrecto" unless periodico.is_a?(String)
29
+ @periodico = periodico
30
+ end
31
+ # Establece el número de páginas
32
+ # @param [String] paginas el número de páginas a establecer
33
+ # @raise [ArgumentError] si el tipo del número de páginas es incorrecto
34
+ def paginas(paginas)
35
+ raise ArgumentError, "El tipo del número de páginas es incorrecto" unless paginas.is_a?(Integer)
36
+ @paginas = paginas
37
+ end
38
+ # Método para formatear esta referencia como se pide en el PDF
39
+ # @return [String] la referencia formateada
40
+ def to_s
41
+ "#{@autores} (#{fecha_completa(@fecha)}). #{@titulo}. #{@periodico}, pp. #{@paginas.to_s}."
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,154 @@
1
+ # encoding: UTF-8
2
+ require "date"
3
+
4
+ # Abriendo la clase Date para traducir los nombres de los meses.
5
+ class Date
6
+ # Array que contiene los nombres de los meses. Es una simplificación bastante grande respecto del switch
7
+ NOMBREMES = ["DUMMY", "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]
8
+ end
9
+
10
+ module DRA
11
+ # Esta es la clase que representa una referencia bibliográfica. Tiene los atributos comunes a cualquier referencia bilbiográfica.
12
+ # @abstract Aunque se puede instanciar para realizar pruebas
13
+ # @author Daniel Ramos Acosta <alu0100843095@ull.edu.es>
14
+ class Referencia
15
+ include Comparable
16
+ # Este es el constructor de la clase
17
+ # @param titulo [String] Título de la obra
18
+ def initialize(titulo)
19
+ #Declaramos las variables de instancia que vamos a usar
20
+ @titulo = normalize_titulo(titulo)
21
+ @autores = @autores[0...-3] unless @autores.nil? #Eliminamos los 3 últimos carácteres para evitar el ' & '
22
+ end
23
+ # Inserta un nuevo autor
24
+ # @param [Hash] autor el autor que se quiere insertar
25
+ # @option autor [String] :nombre el nombre del autor
26
+ # @option autor [String] :apellido el primer apellido del autor
27
+ # @option autor [String] :apellido2 el segundo apellido del autor
28
+ def autores(autor)
29
+ @autores = "" if @autores.nil?
30
+ @autores << normalize_autores(autor[:nombre], autor[:apellido], autor[:apellido2])
31
+ end
32
+ # Establece la fecha de publicación
33
+ # @param [Hash] fecha la fecha que se quiere establecer
34
+ # @option fecha [Integer] :dia el día
35
+ # @option fecha [Integer] :mes el mes
36
+ # @option fecha [Integer] :anio el año
37
+ # @raise [ArgumentError] si el día no es de tipo entero
38
+ # @raise [ArgumentError] si el mes no es de tipo entero
39
+ # @raise [ArgumentError] si el año no es de tipo entero o no se especifica
40
+ def fecha(fecha)
41
+ # Todo: comprobar que nos viene como mínimo el año
42
+ raise ArgumentError, "No se ha especificado el año o es de tipo incorrecto" unless fecha[:anio].is_a?(Integer)
43
+ raise ArgumentError, "El mes es de tipo incorrecto" unless fecha[:mes].is_a?(Integer) or fecha[:mes].nil?
44
+ raise ArgumentError, "El día es de tipo incorrecto" unless fecha[:dia].is_a?(Integer) or fecha[:dia].nil?
45
+ unless fecha[:mes].nil? or fecha[:dia].nil?
46
+ @fecha = Date.new(fecha[:anio], fecha[:mes], fecha[:dia])
47
+ else
48
+ @fecha = Date.new(fecha[:anio])
49
+ end
50
+ end
51
+ # Establece el nombre del país
52
+ # @param pais [String] el país nombre del país que se quiere establecer
53
+ # @raise [ArgumentError] si el país no es de tipo string
54
+ def pais(pais)
55
+ raise ArgumentError, "El país es de tipo incorrecto" unless pais.is_a?(String)
56
+ @pais = pais
57
+ end
58
+ # Devuelve el título
59
+ # @return [String] el título
60
+ def get_titulo
61
+ @titulo
62
+ end
63
+ # Devuelve los autores
64
+ # @return [String] el/los autores
65
+ def get_autores
66
+ @autores
67
+ end
68
+ # Devuelve el país
69
+ # @return [String|NilClass] el país, o nulo si no se ha establecido
70
+ def get_pais
71
+ @pais
72
+ end
73
+ # Devuelve la fecha
74
+ # @return [Date] la fecha
75
+ def get_fecha
76
+ @fecha
77
+ end
78
+ # Devuelve la fecha (día, mes y año) formateado en español, PE: 14 de enero de 2015
79
+ # @param fecha optional [Date] fecha que se quiere convertir
80
+ # @return [String] Fecha larga formateada
81
+ def fecha_completa(fecha=@fecha)
82
+ "#{fecha.day.to_s} de #{Date::NOMBREMES[fecha.mon]} de #{fecha.year.to_s}"
83
+ end
84
+ # Devuelve únicamente el año como string
85
+ # @param fecha optional [Date] fecha que se quiere convertir
86
+ # @return [String] Fecha con sólo el mes y el año
87
+ def fecha_anio(fecha=@fecha)
88
+ fecha.year.to_s
89
+ end
90
+ # Método para poder usar las funciones del módulo Enumerable. Se ordena según el PDF de la práctica 10.
91
+ # @param other El segundo miembro de la comparación
92
+ # @return [Integer] Devuelve -1, 0 o 1 dependiendo del orden que se ha implementado
93
+ def <=>(other)
94
+ if(@autores == other.get_autores)
95
+ if(@fecha == other.get_fecha)
96
+ if(@titulo == other.get_titulo)
97
+ return 0 #Son iguales
98
+ else
99
+ arr = [@titulo, other.get_titulo]
100
+ arr.sort_by!{|t| t.downcase}
101
+ if(arr.first == @titulo)
102
+ return 1
103
+ end
104
+ return -1
105
+ end
106
+ elsif get_fecha > other.get_fecha
107
+ return -1
108
+ else
109
+ return 1
110
+ end
111
+ else
112
+ arr = [@autores, other.get_autores]
113
+ arr.sort_by!{|t| t.downcase}
114
+ if(arr.first == @autores)
115
+ return -1
116
+ end
117
+ return 1
118
+ end
119
+ end
120
+ # Se le pasa un autor con su nombre y apellido/s, y lo devuelve formateado correctamente con un '&' a la derecha
121
+ # @param nombre el nombre del autor
122
+ # @param apellido1 el primer apellido del autor
123
+ # @param apellido2 el segundo apellido del autor
124
+ # @raise [ArgumentError] si no se especifica el primer apellido, o no es un String
125
+ # @raise [ArgumentError] si no se especifica el nombre, o no es un String
126
+ # @raise [ArgumentError] si el tipo del segundo apellido es incorrecto
127
+ # @return [String] el autor formateado
128
+ def normalize_autores(nombre, apellido1, apellido2=nil)
129
+ raise ArgumentError, "No se ha especificado el primer apellido o es de tipo incorrecto" unless apellido1.is_a?(String)
130
+ raise ArgumentError, "El tipo del segundo apellido es incorrecto" unless apellido2.is_a?(String) or apellido2.nil?
131
+ raise ArgumentError, "No se ha especificado el nombre o es de tipo incorrecto" unless nombre.is_a?(String)
132
+ str = "#{apellido1}, "
133
+ str << "#{apellido2[0]}. " unless apellido2.nil?
134
+ str << "#{nombre[0]}."
135
+ str << " & "
136
+ end
137
+ # Se le pasa un título, y se devuelve correctamente formateado
138
+ # @param titulo el título que se desea formatear
139
+ # @return [String] el título formateado
140
+ # @raise [ArgumentError] si el título no es un string
141
+ def normalize_titulo(titulo)
142
+ raise ArgumentError, "El titulo es de tipo incorrecto" unless titulo.is_a?(String)
143
+ titarr = titulo.split(' ')
144
+ titarr.each do |palabra|
145
+ if palabra.length > 3
146
+ palabra.capitalize!
147
+ else
148
+ palabra.downcase! unless palabra == titarr[0]
149
+ end
150
+ end
151
+ return titarr.join(' ')
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,4 @@
1
+ module BiblioDSL
2
+ # Versión de la gema
3
+ VERSION = "0.1.0"
4
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: biblioDSL
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Ramos
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Tiene su propopio DSL así que es super mega fácil de usar
126
+ email:
127
+ - danielramosacosta@hotmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".coveralls.yml"
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - Guardfile
138
+ - README.md
139
+ - Rakefile
140
+ - biblioDSL.gemspec
141
+ - bin/console
142
+ - bin/setup
143
+ - lib/biblioDSL.rb
144
+ - lib/biblioDSL/bibliografia.rb
145
+ - lib/biblioDSL/referencias/capitulo.rb
146
+ - lib/biblioDSL/referencias/documentoElectronico.rb
147
+ - lib/biblioDSL/referencias/libro.rb
148
+ - lib/biblioDSL/referencias/periodico.rb
149
+ - lib/biblioDSL/referencias/referencia.rb
150
+ - lib/biblioDSL/version.rb
151
+ homepage: https://github.com/DanielRamosAcosta/prct11
152
+ licenses: []
153
+ metadata:
154
+ allowed_push_host: https://rubygems.org
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 2.4.8
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: Esta es una gema para representar referencias en forma de una bilbiografía
175
+ test_files: []
176
+ has_rdoc: