piola 0.0.7
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.
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.rvmrc +3 -0
- data/Gemfile +8 -0
- data/LICENSE +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/lib/piola.rb +10 -0
- data/lib/piola/encoding.rb +37 -0
- data/lib/piola/html.rb +85 -0
- data/lib/piola/importance.rb +58 -0
- data/lib/piola/numbers.rb +21 -0
- data/lib/piola/parsing.rb +55 -0
- data/lib/piola/special_chars.rb +123 -0
- data/lib/piola/splitting.rb +49 -0
- data/lib/piola/sql.rb +210 -0
- data/lib/piola/uri.rb +25 -0
- data/lib/piola/version.rb +3 -0
- data/piola.gemspec +20 -0
- data/spec/encoding_spec.rb +38 -0
- data/spec/html_spec.rb +83 -0
- data/spec/importance_spec.rb +56 -0
- data/spec/numbers_spec.rb +49 -0
- data/spec/parsing_spec.rb +42 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/special_chars_spec.rb +93 -0
- data/spec/splitting_spec.rb +94 -0
- data/spec/sql_spec.rb +62 -0
- data/spec/uri_spec.rb +24 -0
- metadata +117 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::Numbers do
|
5
|
+
|
6
|
+
describe '#valid_number?' do
|
7
|
+
|
8
|
+
it "should return true for whole number" do
|
9
|
+
'15'.should be_valid_number
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return true for fractions" do
|
13
|
+
'7.50'.should be_valid_number
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return true for negative numbers" do
|
17
|
+
'-7.50'.should be_valid_number
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return true for big numbers" do
|
21
|
+
'15000000.55'.should be_valid_number
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return false for text" do
|
25
|
+
'foo'.should_not be_valid_number
|
26
|
+
end
|
27
|
+
|
28
|
+
it "shoul return false for text with numbers" do
|
29
|
+
'foo 15'.should_not be_valid_number
|
30
|
+
'foo 15 bar'.should_not be_valid_number
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#remove_numbers' do
|
36
|
+
|
37
|
+
it "should correctly remove number parragraphs from a text" do
|
38
|
+
text = "15\nthis is a test line\n30\nanother test line"
|
39
|
+
text.remove_numbers.should eql("this is a test line\nanother test line")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should ignore numbers that are part of sentences" do
|
43
|
+
text = "15\nthis is a 30 test line\n30\nanother 40 test line"
|
44
|
+
text.remove_numbers.should eql("this is a 30 test line\nanother 40 test line")
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::Parsing do
|
5
|
+
|
6
|
+
describe '#remove_all_parenthesis' do
|
7
|
+
|
8
|
+
it "should remove all parenthesis" do
|
9
|
+
txt = '(foo) [bar] {baz} test'
|
10
|
+
txt.remove_all_parenthesis.should eql('test')
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#remove_enters' do
|
16
|
+
|
17
|
+
it "should remove all kinds of enters" do
|
18
|
+
txt = "foo\nbar\rbaz#{10.chr}test#{13.chr}another<br />line<br>yet<br/>not<BR />over<BR>never<BR/>ever"
|
19
|
+
txt.remove_enters.should eql('foo bar baz test another line yet not over never ever')
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#remove_extra_enters' do
|
25
|
+
|
26
|
+
it "should only leave one enter per parragraph" do
|
27
|
+
txt = "foo\n\nbar\n\n\nbaz test"
|
28
|
+
txt.remove_extra_enters.should eql("foo\nbar\nbaz test")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#remove_quotes' do
|
34
|
+
|
35
|
+
it "should remove all kinds of quotes" do
|
36
|
+
txt = %Q{"foo" 'bar' baz}
|
37
|
+
txt.remove_quotes.should eql('foo bar baz')
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::SpecialChars do
|
5
|
+
|
6
|
+
describe '#spanish_char?' do
|
7
|
+
|
8
|
+
%w(á é í ó ö ú ñ Á É Í Ö Ó Ú Ñ).each do |char|
|
9
|
+
|
10
|
+
it "identifies `#{char}` as spanish char" do
|
11
|
+
char.should be_spanish_char
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#only_letters' do
|
19
|
+
|
20
|
+
it "should remove all weird chars" do
|
21
|
+
txt = "foóo báar bañz ñoün FÓO BÁAR ÑOÜN 123test"
|
22
|
+
txt.only_letters.should eql('foóo báar bañz ñoün FÓO BÁAR ÑOÜN test')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#clean_chars' do
|
28
|
+
|
29
|
+
it "returns a clean string with no weird chars" do
|
30
|
+
txt = "RT @ipbc79: Pasajes de avion ✔ hotel reservado ✔ boletos ✔ .... 🔜 Nos vemos el 31 de octubre @justinbieber #Ecuador"
|
31
|
+
txt.clean_chars.should eql "RT @ipbc79: Pasajes de avion hotel reservado boletos Nos vemos el 31 de octubre @justinbieber #Ecuador"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "leaves periods when opted in" do
|
35
|
+
txt = "Debate del Código Penal inicia con ‘cabos sueltos’ http://t.co/5pDpYJoKZz"
|
36
|
+
txt.clean_chars.should eql "Debate del Código Penal inicia con cabos sueltos http://t co/5pDpYJoKZz"
|
37
|
+
|
38
|
+
txt = "Debate del Código Penal inicia con ‘cabos sueltos’ http://t.co/5pDpYJoKZz"
|
39
|
+
txt.clean_chars(keep_periods: true).should eql "Debate del Código Penal inicia con cabos sueltos http://t.co/5pDpYJoKZz"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "leaves commas when opted in" do
|
43
|
+
txt = "Debate del Código Penal inicia, con ‘cabos sueltos’ http://t.co/5pDpYJoKZz"
|
44
|
+
txt.clean_chars.should eql "Debate del Código Penal inicia con cabos sueltos http://t co/5pDpYJoKZz"
|
45
|
+
|
46
|
+
txt = "Debate del Código Penal inicia, con ‘cabos sueltos’ http://t.co/5pDpYJoKZz"
|
47
|
+
txt.clean_chars(keep_commas: true).should eql "Debate del Código Penal inicia, con cabos sueltos http://t co/5pDpYJoKZz"
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#downcase_special_chars' do
|
53
|
+
|
54
|
+
it "downcases all special chars" do
|
55
|
+
txt = 'ÁÉÍÓÚÜÑ'
|
56
|
+
txt.downcase_special_chars.should eql('áéíóúüñ')
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#remove_special_chars' do
|
62
|
+
|
63
|
+
it "should replace spanish special chars" do
|
64
|
+
txt = 'áéíóúüñÁÉÍÓÚÜÑ'
|
65
|
+
txt.remove_special_chars.should eql('aeiouunAEIOUUN')
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#clean_text' do
|
71
|
+
|
72
|
+
let(:txt) { " foo bar baz áñ test (another test)\n\nsome enters " }
|
73
|
+
|
74
|
+
it "should return a clean string" do
|
75
|
+
txt.clean_text.should eql('foo bar baz áñ test some enters')
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should leave parenthesis when specified" do
|
79
|
+
txt.clean_text(false).should eql('foo bar baz áñ test (another test) some enters')
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#remove_tabs' do
|
85
|
+
|
86
|
+
it "should correctly remove tabs" do
|
87
|
+
txt = "\t\t foo bar \t baz "
|
88
|
+
txt.remove_tabs.should eql('foo bar baz')
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::Splitting do
|
5
|
+
|
6
|
+
describe '#to_arr' do
|
7
|
+
|
8
|
+
it "should convert a string to an array" do
|
9
|
+
txt = "foo bar baz\n\ntest\nwith enters"
|
10
|
+
txt.to_arr.should eql(%w(foo bar baz test with enters))
|
11
|
+
end
|
12
|
+
|
13
|
+
it "it converts to uniq" do
|
14
|
+
txt = "test1 test2 test3 test2"
|
15
|
+
txt.to_arr.should eql(%w(test1 test2 test3))
|
16
|
+
end
|
17
|
+
|
18
|
+
it "doesn't uniq when option" do
|
19
|
+
txt = "test1 test2 test3 test2"
|
20
|
+
txt.to_arr(non_unique: true).should eql(%w(test1 test2 test3 test2))
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#string_to_parragraph_arr' do
|
26
|
+
|
27
|
+
it "should convert a string into an array of parragraphs" do
|
28
|
+
txt = " Normal\r 0\r \r \r \r \r false\r false\r false\r \r EN-US\r X-NONE\r X-NONE\n\n, edición del domingo 28 de octubre de 2012\n\nUna espesa neblina inunda los campos. Llovizna. Los vidrios de un autoferro se empañan y el frío entumece las manos. El clima no resulta favorable ese miércoles 24 de octubre. Así sucede; es cuestión de suerte, dicen. Si todo estuviera despejado, un imponente Chimborazo deslumbraría a las personas.\n\nLos más de 35 pasajeros, en su mayoría niños, están emocionados. Es su primera vez en un tren. Y van bien abrigados con suéteres, gorros de lana, bufandas y guantes. Es que el frío es intenso. Hace honor a la denominación de la ruta que recorre el autoferro: Tren del Hielo.\n\n "
|
29
|
+
txt.string_to_parragraph_arr.should eql(["Normal", "0", "false", "false", "false", "EN-US", "X-NONE", "X-NONE", "edición del domingo 28 de octubre de 2012", "Una espesa neblina inunda los campos Llovizna Los vidrios de un autoferro se empañan y el frío entumece las manos El clima no resulta favorable ese miércoles 24 de octubre Así sucede; es cuestión de suerte dicen Si todo estuviera despejado un imponente Chimborazo deslumbraría a las personas", "Los más de 35 pasajeros en su mayoría niños están emocionados Es su primera vez en un tren Y van bien abrigados con suéteres gorros de lana bufandas y guantes Es que el frío es intenso Hace honor a la denominación de la ruta que recorre el autoferro: Tren del Hielo"])
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#string_to_important_parragraph_arr' do
|
35
|
+
|
36
|
+
it 'returns unique lines only' do
|
37
|
+
txt = "this is gonna be a repeated line\nthis is gonna be a repeated line\nanother line that should be unique"
|
38
|
+
|
39
|
+
txt.string_to_important_parragraph_arr.should eql(["this is gonna be a repeated line", "another line that should be unique"])
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should convert a string into an array of important parragraphs" do
|
43
|
+
txt = " Normal\r 0\r \r \r \r \r false\r false\r false\r \r EN-US\r X-NONE\r X-NONE\n\n, edición del domingo 28 de octubre de 2012\n\nUna espesa neblina inunda los campos. Llovizna. Los vidrios de un autoferro se empañan y el frío entumece las manos. El clima no resulta favorable ese miércoles 24 de octubre. Así sucede; es cuestión de suerte, dicen. Si todo estuviera despejado, un imponente Chimborazo deslumbraría a las personas.\n\nLos más de 35 pasajeros, en su mayoría niños, están emocionados. Es su primera vez en un tren. Y van bien abrigados con suéteres, gorros de lana, bufandas y guantes. Es que el frío es intenso. Hace honor a la denominación de la ruta que recorre el autoferro: Tren del Hielo.\n\n "
|
44
|
+
txt.string_to_important_parragraph_arr.should eql(["edición del domingo 28 de octubre de 2012", "Una espesa neblina inunda los campos Llovizna Los vidrios de un autoferro se empañan y el frío entumece las manos El clima no resulta favorable ese miércoles 24 de octubre Así sucede; es cuestión de suerte dicen Si todo estuviera despejado un imponente Chimborazo deslumbraría a las personas", "Los más de 35 pasajeros en su mayoría niños están emocionados Es su primera vez en un tren Y van bien abrigados con suéteres gorros de lana bufandas y guantes Es que el frío es intenso Hace honor a la denominación de la ruta que recorre el autoferro: Tren del Hielo"])
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should not include parragraphs with html leftovers' do
|
48
|
+
txt = %Q{Presidente de la República estará en Azogues este viernes
|
49
|
+
Miércoles 31 de Octubre de 2012 00:00
|
50
|
+
El presidente de la República Rafael Correa llegará a la ciudad de Azogues este viernes en la tarde con el propósito de grabar el enlace ciudadano que se trasmitirá el sábado 3 de noviembre
|
51
|
+
La visita del mandatario estaba confirmada hasta la tarde de ayer según informó la gobernadora del Cañar Bertha Molina
|
52
|
+
La llegada del jefe de Estado a la capital provincial está prevista entre las 15:30 y 16:00 La grabación se llevará a cabo en el coliseo tipo mil ubicado en la Ciudadela del Chofer
|
53
|
+
Desde la mañana del viernes en los alrededores del nuevo coliseo se instalará una feria ciudadana en la que se colocarán los diferentes estantes del Ejecutivo descentralizado en la jurisdicción cañari
|
54
|
+
Según Molina la actividad que desarrollará el presidente figura como un acto de homenaje un saludo a San Francisco de Peleusí de Azogues y a sus habitantes
|
55
|
+
A decir de la primera autoridad de la provincia el alcalde Eugenio Morocho deberá estar presente y ser un miembro activo en este evento pues el día de ayer iban a dialogar con la autoridad cantonal para solicitarle su participación
|
56
|
+
Hasta ayer no se confirmó que el mandatario vaya a ofrecer alguna rueda de prensa o visite algún medio de comunicación tampoco se conoce sobre la agenda que vaya a tener luego de culminada la grabación del programa sabatino
|
57
|
+
Personal encargado de los enlaces ciudadanos están desde ayer en la ciudad Para hoy se prevé que llegue todo el equipo y la seguridad del presidente
|
58
|
+
Por su parte el Ministro del Interior José Serrano a
|
59
|
+
los patios de la Sub Zona 3 del Comando de Policía del Cañar
|
60
|
+
hará la entrega del uniformes (chaleco gorra y credencial) a cada uno 1 175
|
61
|
+
/* Style Definitions */ table MsoNormalTable mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5 4pt 0cm 5 4pt; mso-para-margin:0cm; mso-para-margin-bottom: 0001pt; mso-pagination:widow-orphan; font-size:10 0pt; font-family:"Calibri" "sans-serif"; mso-bidi-font-family:"Times New Roman";
|
62
|
+
/* Style Definitions */ table MsoNormalTable mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5 4pt 0cm 5 4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10 0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11 0pt; font-family:"Calibri" "sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;
|
63
|
+
/* Style Definitions */ table MsoNormalTable mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5 4pt 0cm 5 4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10 0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11 0pt; font-family:"Calibri" "sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}
|
64
|
+
|
65
|
+
txt.string_to_important_parragraph_arr.should eql([
|
66
|
+
"Presidente de la República estará en Azogues este viernes",
|
67
|
+
"Miércoles 31 de Octubre de 2012 00:00",
|
68
|
+
"El presidente de la República Rafael Correa llegará a la ciudad de Azogues este viernes en la tarde con el propósito de grabar el enlace ciudadano que se trasmitirá el sábado 3 de noviembre",
|
69
|
+
"La visita del mandatario estaba confirmada hasta la tarde de ayer según informó la gobernadora del Cañar Bertha Molina",
|
70
|
+
"La llegada del jefe de Estado a la capital provincial está prevista entre las 15:30 y 16:00 La grabación se llevará a cabo en el coliseo tipo mil ubicado en la Ciudadela del Chofer",
|
71
|
+
"Desde la mañana del viernes en los alrededores del nuevo coliseo se instalará una feria ciudadana en la que se colocarán los diferentes estantes del Ejecutivo descentralizado en la jurisdicción cañari",
|
72
|
+
"Según Molina la actividad que desarrollará el presidente figura como un acto de homenaje un saludo a San Francisco de Peleusí de Azogues y a sus habitantes",
|
73
|
+
"A decir de la primera autoridad de la provincia el alcalde Eugenio Morocho deberá estar presente y ser un miembro activo en este evento pues el día de ayer iban a dialogar con la autoridad cantonal para solicitarle su participación",
|
74
|
+
"Hasta ayer no se confirmó que el mandatario vaya a ofrecer alguna rueda de prensa o visite algún medio de comunicación tampoco se conoce sobre la agenda que vaya a tener luego de culminada la grabación del programa sabatino",
|
75
|
+
"Personal encargado de los enlaces ciudadanos están desde ayer en la ciudad Para hoy se prevé que llegue todo el equipo y la seguridad del presidente",
|
76
|
+
"Por su parte el Ministro del Interior José Serrano a",
|
77
|
+
"los patios de la Sub Zona 3 del Comando de Policía del Cañar",
|
78
|
+
"hará la entrega del uniformes (chaleco gorra y credencial) a cada uno 1 175"
|
79
|
+
])
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should not include parragraphs with mysql warnings' do
|
83
|
+
txt = %Q{Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /nfs/c03/h06/mnt/51770/domains/sonorama.com.ec/html/sistema/noticias/cuarto_hora.php on line 113. Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /nfs/c03/h06/mnt/51770/domains/sonorama.com.ec/html/sistema/noticias/cuarto_hora.php on line 117.}
|
84
|
+
txt.string_to_important_parragraph_arr.should eql([])
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should not include parragraphs with mysql errors' do
|
88
|
+
txt = %Q{Error: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /nfs/c03/h06/mnt/51770/domains/sonorama.com.ec/html/sistema/noticias/cuarto_hora.php on line 113. Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /nfs/c03/h06/mnt/51770/domains/sonorama.com.ec/html/sistema/noticias/cuarto_hora.php on line 117.}
|
89
|
+
txt.string_to_important_parragraph_arr.should eql([])
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/spec/sql_spec.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::Sql do
|
5
|
+
|
6
|
+
describe '#sql_search' do
|
7
|
+
|
8
|
+
it "should convert the string to a sql search query" do
|
9
|
+
txt = "foo bar baz"
|
10
|
+
fields = %w(title description)
|
11
|
+
txt.sql_search(fields).should eql("((title LIKE \"%foo%\") AND (title LIKE \"%bar%\") AND (title LIKE \"%baz%\")) OR ((description LIKE \"%foo%\") AND (description LIKE \"%bar%\") AND (description LIKE \"%baz%\"))")
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#searchify' do
|
17
|
+
|
18
|
+
let(:fields) { %w(title description) }
|
19
|
+
|
20
|
+
it "should convert the string sql search query" do
|
21
|
+
txt = "foo bar baz"
|
22
|
+
txt.searchify(fields).should eql("(title LIKE \"%foo%\" AND title LIKE \"%bar%\" AND title LIKE \"%baz%\" OR description LIKE \"%foo%\" AND description LIKE \"%bar%\" AND description LIKE \"%baz%\")")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should permit exact matching" do
|
26
|
+
txt = 'foo bar "exact phrase"'
|
27
|
+
txt.searchify(fields).should eql("(title LIKE \"%exact phrase%\" AND title LIKE \"%foo%\" AND title LIKE \"%bar%\" OR description LIKE \"%exact phrase%\" AND description LIKE \"%foo%\" AND description LIKE \"%bar%\")")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should permit exact word matching" do
|
31
|
+
txt = 'foo bar "exact phrase" `football`'
|
32
|
+
txt.searchify(fields).should eql("((title LIKE \"% football %\" OR title LIKE \"% football.%\" OR title LIKE \"% football,%\") AND title LIKE \"%exact phrase%\" AND title LIKE \"%foo%\" AND title LIKE \"%bar%\" OR (description LIKE \"% football %\" OR description LIKE \"% football.%\" OR description LIKE \"% football,%\") AND description LIKE \"%exact phrase%\" AND description LIKE \"%foo%\" AND description LIKE \"%bar%\")")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should permit excluding words" do
|
36
|
+
txt = "foo bar -baz"
|
37
|
+
txt.searchify(fields).should eql("(title LIKE \"%foo%\" AND title LIKE \"%bar%\" OR description LIKE \"%foo%\" AND description LIKE \"%bar%\") AND (title NOT LIKE \"%baz%\" AND description NOT LIKE \"%baz%\")")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should permit exact excludes" do
|
41
|
+
txt = 'foo bar -"exact phrase"'
|
42
|
+
txt.searchify(fields).should eql("(title LIKE \"%foo%\" AND title LIKE \"%bar%\" OR description LIKE \"%foo%\" AND description LIKE \"%bar%\") AND (title NOT LIKE \"%exact phrase%\" AND description NOT LIKE \"%exact phrase%\")")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should permit exact word excludes" do
|
46
|
+
txt = 'foo bar -`exact phrase`'
|
47
|
+
txt.searchify(fields).should eql("(title LIKE \"%foo%\" AND title LIKE \"%bar%\" OR description LIKE \"%foo%\" AND description LIKE \"%bar%\") AND ((title NOT LIKE \"% exact phrase %\" OR title NOT LIKE \"% exact phrase.%\" OR title NOT LIKE \"% exact phrase,%\") AND (description NOT LIKE \"% exact phrase %\" OR description NOT LIKE \"% exact phrase.%\" OR description NOT LIKE \"% exact phrase,%\"))")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should permit mixing all the options" do
|
51
|
+
txt = 'foo -bar "exact phrase" -"exact exclude phrase"'
|
52
|
+
txt.searchify(fields).should eql("(title LIKE \"%exact phrase%\" AND title LIKE \"%foo%\" OR description LIKE \"%exact phrase%\" AND description LIKE \"%foo%\") AND (title NOT LIKE \"%exact exclude phrase%\" AND title NOT LIKE \"%bar%\" AND description NOT LIKE \"%exact exclude phrase%\" AND description NOT LIKE \"%bar%\")")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should allow setting the operator" do
|
56
|
+
txt = "foo bar baz"
|
57
|
+
txt.searchify(fields, operator: :or).should eql("(title LIKE \"%foo%\" OR title LIKE \"%bar%\" OR title LIKE \"%baz%\" OR description LIKE \"%foo%\" OR description LIKE \"%bar%\" OR description LIKE \"%baz%\")")
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/spec/uri_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Piola::Uri do
|
5
|
+
|
6
|
+
describe '#uri_escape' do
|
7
|
+
|
8
|
+
it "should correctly escape uris" do
|
9
|
+
url = 'http://andes.info.ec/economía/8150.html'
|
10
|
+
url.uri_escape.should eql('http://andes.info.ec/econom%C3%ADa/8150.html')
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#uri_unescape' do
|
16
|
+
|
17
|
+
it "should correctly unescape uris" do
|
18
|
+
url = 'http://andes.info.ec/econom%C3%ADa/8150.html'
|
19
|
+
url.uri_unescape.should eql('http://andes.info.ec/economía/8150.html')
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: piola
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Jairala
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: htmlentities
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 4.3.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 4.3.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.0.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.0.0
|
46
|
+
description: String extensions and quality of life methods
|
47
|
+
email:
|
48
|
+
- davidjairala@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- .rspec
|
55
|
+
- .rvmrc
|
56
|
+
- Gemfile
|
57
|
+
- LICENSE
|
58
|
+
- README.md
|
59
|
+
- Rakefile
|
60
|
+
- lib/piola.rb
|
61
|
+
- lib/piola/encoding.rb
|
62
|
+
- lib/piola/html.rb
|
63
|
+
- lib/piola/importance.rb
|
64
|
+
- lib/piola/numbers.rb
|
65
|
+
- lib/piola/parsing.rb
|
66
|
+
- lib/piola/special_chars.rb
|
67
|
+
- lib/piola/splitting.rb
|
68
|
+
- lib/piola/sql.rb
|
69
|
+
- lib/piola/uri.rb
|
70
|
+
- lib/piola/version.rb
|
71
|
+
- piola.gemspec
|
72
|
+
- spec/encoding_spec.rb
|
73
|
+
- spec/html_spec.rb
|
74
|
+
- spec/importance_spec.rb
|
75
|
+
- spec/numbers_spec.rb
|
76
|
+
- spec/parsing_spec.rb
|
77
|
+
- spec/spec_helper.rb
|
78
|
+
- spec/special_chars_spec.rb
|
79
|
+
- spec/splitting_spec.rb
|
80
|
+
- spec/sql_spec.rb
|
81
|
+
- spec/uri_spec.rb
|
82
|
+
homepage: ''
|
83
|
+
licenses: []
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 1.8.24
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: Provides a bunch of extensions for Strings, HTML manipulation methods, splitting,
|
106
|
+
spanish language quality of life, etc.
|
107
|
+
test_files:
|
108
|
+
- spec/encoding_spec.rb
|
109
|
+
- spec/html_spec.rb
|
110
|
+
- spec/importance_spec.rb
|
111
|
+
- spec/numbers_spec.rb
|
112
|
+
- spec/parsing_spec.rb
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
- spec/special_chars_spec.rb
|
115
|
+
- spec/splitting_spec.rb
|
116
|
+
- spec/sql_spec.rb
|
117
|
+
- spec/uri_spec.rb
|