biblioDSL 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: