Skip to content

Commit

Permalink
Merge branch 'remove_python2'
Browse files Browse the repository at this point in the history
  • Loading branch information
PabloCastellano committed Apr 16, 2017
2 parents 1f9e486 + d833c47 commit 1de4c23
Show file tree
Hide file tree
Showing 23 changed files with 273 additions and 312 deletions.
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
language: python

python:
- "2.7"
- "3.4"
- "3.6"

branches:
only:
Expand All @@ -11,7 +11,6 @@ branches:
# command to install requirements
install:
- pip install coveralls
- if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements/python2.txt; fi
- if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements/python3.txt; fi
- python setup.py -q develop

Expand Down
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Changelog
Version 0.3.0 [unreleased]
--------------------------

- Eliminado soporte de Python 2
- Cambios en el formato BORME-JSON
- Parser thread-safe (issue #7)
- Nombres de actos repetidos en el mismo anuncio (issue #3)
Expand Down
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
bormeparser
===========

**bormeparser** es una librería de Python para parsear los archivos del BORME (Boletín Oficial del Registro Mercantil en España).
**bormeparser** es una librería de **Python 3** para parsear los archivos del BORME (Boletín Oficial del Registro Mercantil en España).

[![Travis bormeparser](https://travis-ci.org/PabloCastellano/bormeparser.svg?branch=master)](https://travis-ci.org/PabloCastellano/bormeparser)
[![Pypi bormeparser](https://badge.fury.io/py/bormeparser.png)]( https://pypi.python.org/pypi/bormeparser)
Expand Down Expand Up @@ -55,8 +55,6 @@ Puedes instalar bormeparser descargándolo y ejecutando:
cd bormeparser
python setup.py install

Para Python 2, cambiar python3-dev por python-dev.


Instalación desde Pip
=====================
Expand All @@ -75,8 +73,6 @@ La carpeta scripts/ contiene algunos scripts útiles para tratar archivos BORME.
python scripts/check_bormes.py -d /tmp/bormemadrid -p MADRID -f 2016-06-01 -t 2016-06-30
python scripts/borme_json_all.py -d /tmp/bormemadrid

No está garantizado que todos los scripts sean compatibles con Python 2.

Tests
=====

Expand Down
6 changes: 0 additions & 6 deletions README_en.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@ Compiling

lxml package has some parts that need to be compiled and you need the following dependencies:

For Python 2:

sudo apt-get install python-dev libxslt1-dev

For Python 3:

sudo apt-get install python3-dev libxslt1-dev


Expand Down
136 changes: 67 additions & 69 deletions bormeparser/acto.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import six


class ACTO:
NOMBRAMIENTOS = 1
Expand Down Expand Up @@ -80,95 +78,95 @@ class ACTO:

# Palabras clave con argumentos
_arg_keywords = {
u'Nombramientos': NOMBRAMIENTOS,
u'Revocaciones': REVOCACIONES,
u'Ceses/Dimisiones': CESES_DIMISIONES,
u'Modificaciones estatutarias': MODIFICACIONES_ESTATUTARIAS,
u'Cambio de objeto social': CAMBIO_DE_OBJETO_SOCIAL,
u'Cambio de denominación social': CAMBIO_DE_DENOMINACION_SOCIAL,
u'Cambio de domicilio social': CAMBIO_DE_DOMICILIO_SOCIAL,
u'Ampliacion del objeto social': AMPLIACION_DEL_OBJETO_SOCIAL,
u'Disolución': DISOLUCION,
u'Reelecciones': REELECCIONES,
u'Constitución': CONSTITUCION,
u'Apertura de sucursal': APERTURA_DE_SUCURSAL,
u'Empresario Individual': EMPRESARIO_INDIVIDUAL,
u'Articulo 378.5 del Reglamento del Registro Mercantil': ARTICULO_378_5_DEL_RRM,
u'Otros conceptos': OTROS_CONCEPTOS,
u'Ampliación de capital': AMPLIACION_DE_CAPITAL,
u'Reducción de capital': REDUCCION_DE_CAPITAL,
u'Situación concursal': SITUACION_CONCURSAL,
u'Fusión por absorción': FUSION_POR_ABSORCION,
u'Suspensión de pagos': SUSPENSION_DE_PAGOS,
u'Transformación de sociedad': TRANSFORMACION_DE_SOCIEDAD,
u'Cancelaciones de oficio de nombramientos': CANCELACIONES_DE_OFICIO_DE_NOMBRAMIENTOS,
u'Desembolso de dividendos pasivos': DESEMBOLSO_DE_DIVIDENDOS_PASIVOS,
u'Página web de la sociedad': PAGINA_WEB_DE_LA_SOCIEDAD,
u'Primera sucursal de sociedad extranjera': PRIMERA_SUCURSAL_DE_SOCIEDAD_EXTRANJERA,
u'Emisión de obligaciones': EMISION_OBLIGACIONES,
u'Modificación de poderes': MODIFICACION_PODERES,
u'Escisión parcial': ESCISION_PARCIAL,
u'Fusión por unión': FUSION_UNION,
u'Quiebra': QUIEBRA,
u'Sucursal': SUCURSAL,
u'Cesión global de activo y pasivo': CESION_GLOBAL_ACTIVO_PASIVO,
u'Segregación': SEGREGACION,
u'Primera inscripcion (O.M. 10/6/1.997)': PRIMERA_INSCRIPCION,
u'Anotación preventiva. Demanda de impugnación de acuerdos sociales': ANOTACION_PREVENTIVA_DEMANDA,
u'Anotación preventiva. Declaración de deudor fallido': ANOTACION_PREVENTIVA_DECLARACION,
'Nombramientos': NOMBRAMIENTOS,
'Revocaciones': REVOCACIONES,
'Ceses/Dimisiones': CESES_DIMISIONES,
'Modificaciones estatutarias': MODIFICACIONES_ESTATUTARIAS,
'Cambio de objeto social': CAMBIO_DE_OBJETO_SOCIAL,
'Cambio de denominación social': CAMBIO_DE_DENOMINACION_SOCIAL,
'Cambio de domicilio social': CAMBIO_DE_DOMICILIO_SOCIAL,
'Ampliacion del objeto social': AMPLIACION_DEL_OBJETO_SOCIAL,
'Disolución': DISOLUCION,
'Reelecciones': REELECCIONES,
'Constitución': CONSTITUCION,
'Apertura de sucursal': APERTURA_DE_SUCURSAL,
'Empresario Individual': EMPRESARIO_INDIVIDUAL,
'Articulo 378.5 del Reglamento del Registro Mercantil': ARTICULO_378_5_DEL_RRM,
'Otros conceptos': OTROS_CONCEPTOS,
'Ampliación de capital': AMPLIACION_DE_CAPITAL,
'Reducción de capital': REDUCCION_DE_CAPITAL,
'Situación concursal': SITUACION_CONCURSAL,
'Fusión por absorción': FUSION_POR_ABSORCION,
'Suspensión de pagos': SUSPENSION_DE_PAGOS,
'Transformación de sociedad': TRANSFORMACION_DE_SOCIEDAD,
'Cancelaciones de oficio de nombramientos': CANCELACIONES_DE_OFICIO_DE_NOMBRAMIENTOS,
'Desembolso de dividendos pasivos': DESEMBOLSO_DE_DIVIDENDOS_PASIVOS,
'Página web de la sociedad': PAGINA_WEB_DE_LA_SOCIEDAD,
'Primera sucursal de sociedad extranjera': PRIMERA_SUCURSAL_DE_SOCIEDAD_EXTRANJERA,
'Emisión de obligaciones': EMISION_OBLIGACIONES,
'Modificación de poderes': MODIFICACION_PODERES,
'Escisión parcial': ESCISION_PARCIAL,
'Fusión por unión': FUSION_UNION,
'Quiebra': QUIEBRA,
'Sucursal': SUCURSAL,
'Cesión global de activo y pasivo': CESION_GLOBAL_ACTIVO_PASIVO,
'Segregación': SEGREGACION,
'Primera inscripcion (O.M. 10/6/1.997)': PRIMERA_INSCRIPCION,
'Anotación preventiva. Demanda de impugnación de acuerdos sociales': ANOTACION_PREVENTIVA_DEMANDA,
'Anotación preventiva. Declaración de deudor fallido': ANOTACION_PREVENTIVA_DECLARACION,
}

# Palabras clave sin argumentos
_noarg_keywords = {
u'Crédito incobrable': CREDITO_INCOBRABLE,
u'Sociedad unipersonal': SOCIEDAD_UNIPERSONAL,
u'Extinción': EXTINCION,
u'Pérdida del caracter de unipersonalidad': PERDIDA_DEL_CARACTER_DE_UNIPERSONALIDAD,
u'Reapertura hoja registral': REAPERTURA_HOJA_REGISTRAL,
u'Adaptación Ley 2/95': ADAPTACION_LEY_2_95,
u'Adaptada segun D.T. 2 apartado 2 Ley 2/95': ADAPTACION_LEY_2_95,
u'Cierre provisional hoja registral por baja en el índice de Entidades Jurídicas': CIERRE_PROVISIONAL_BAJA_EN_EL_INDICE_DE_ENTIDADES_JURIDICAS,
u'Cierre provisional de la hoja registral por revocación del NIF': CIERRE_PROVISIONAL_REVOCACION_NIF,
u'Cierre provisional hoja registral por revocación del NIFde Entidades Jurídicas': CIERRE_PROVISIONAL_REVOCACION_NIF,
u'Cierre provisional hoja registral art. 137.2 Ley 43/1995 Impuesto de Sociedades': CIERRE_PROVISIONAL_IMPUESTO_SOCIEDADES,
u'Reactivación de la sociedad (Art. 242 del Reglamento del Registro Mercantil)': REACTIVACION_DE_LA_SOCIEDAD,
u'Adaptación de sociedad': ADAPTACION_DE_LA_SOCIEDAD,
u'Cierre de Sucursal': CIERRE_SUCURSAL,
'Crédito incobrable': CREDITO_INCOBRABLE,
'Sociedad unipersonal': SOCIEDAD_UNIPERSONAL,
'Extinción': EXTINCION,
'Pérdida del caracter de unipersonalidad': PERDIDA_DEL_CARACTER_DE_UNIPERSONALIDAD,
'Reapertura hoja registral': REAPERTURA_HOJA_REGISTRAL,
'Adaptación Ley 2/95': ADAPTACION_LEY_2_95,
'Adaptada segun D.T. 2 apartado 2 Ley 2/95': ADAPTACION_LEY_2_95,
'Cierre provisional hoja registral por baja en el índice de Entidades Jurídicas': CIERRE_PROVISIONAL_BAJA_EN_EL_INDICE_DE_ENTIDADES_JURIDICAS,
'Cierre provisional de la hoja registral por revocación del NIF': CIERRE_PROVISIONAL_REVOCACION_NIF,
'Cierre provisional hoja registral por revocación del NIFde Entidades Jurídicas': CIERRE_PROVISIONAL_REVOCACION_NIF,
'Cierre provisional hoja registral art. 137.2 Ley 43/1995 Impuesto de Sociedades': CIERRE_PROVISIONAL_IMPUESTO_SOCIEDADES,
'Reactivación de la sociedad (Art. 242 del Reglamento del Registro Mercantil)': REACTIVACION_DE_LA_SOCIEDAD,
'Adaptación de sociedad': ADAPTACION_DE_LA_SOCIEDAD,
'Cierre de Sucursal': CIERRE_SUCURSAL,
}

# Palabras clave seguidas por :
_colon_keywords = {
u'Modificación de duración': MODIFICACION_DE_DURACION,
u'Fe de erratas': FE_DE_ERRATAS,
'Modificación de duración': MODIFICACION_DE_DURACION,
'Fe de erratas': FE_DE_ERRATAS,
}

_bold_keywords = {
u'Declaración de unipersonalidad': DECLARACION_DE_UNIPERSONALIDAD,
u'Sociedad unipersonal': SOCIEDAD_UNIPERSONAL,
u'Acuerdo de ampliación de capital social sin ejecutar. Importe del acuerdo': ACUERDO_AMPLIACION_CAPITAL_SOCIAL_SIN_EJECUTAR,
u'Escisión total': ESCISION_TOTAL,
'Declaración de unipersonalidad': DECLARACION_DE_UNIPERSONALIDAD,
'Sociedad unipersonal': SOCIEDAD_UNIPERSONAL,
'Acuerdo de ampliación de capital social sin ejecutar. Importe del acuerdo': ACUERDO_AMPLIACION_CAPITAL_SOCIAL_SIN_EJECUTAR,
'Escisión total': ESCISION_TOTAL,
}

# Palabra clave
_ending_keywords = {
u'Datos registrales': DATOS_REGISTRALES
'Datos registrales': DATOS_REGISTRALES
}

ARG_KEYWORDS = list(six.viewkeys(_arg_keywords))
NOARG_KEYWORDS = list(six.viewkeys(_noarg_keywords))
COLON_KEYWORDS = list(six.viewkeys(_colon_keywords))
BOLD_KEYWORDS = list(six.viewkeys(_bold_keywords))
ENDING_KEYWORDS = list(six.viewkeys(_ending_keywords))
ARG_KEYWORDS = list(_arg_keywords.keys())
NOARG_KEYWORDS = list(_noarg_keywords.keys())
COLON_KEYWORDS = list(_colon_keywords.keys())
BOLD_KEYWORDS = list(_bold_keywords.keys())
ENDING_KEYWORDS = list(_ending_keywords.keys())
ALL_KEYWORDS = ARG_KEYWORDS + NOARG_KEYWORDS + COLON_KEYWORDS + BOLD_KEYWORDS + ENDING_KEYWORDS

"""
DICT_KEYWORDS = {kw: remove_accents(kw).replace(' del ', ' ').replace(' por ', ' ').replace(' de ', ' ')
.replace(' ', '_').replace('/', '_').replace('.', '_').lower() for kw in ALL_KEYWORDS}
>>> DICT_KEYWORDS.values()
[u'revocaciones', u'cambio_objeto_social', u'reelecciones', u'otros_conceptos', u'fe_erratas', u'sociedad_unipersonal', u'declaracion_unipersonalidad', u'constitucion', u'suspension_pagos', u'
perdida_caracter_unipersonalidad', u'cancelaciones_oficio_nombramientos', u'datos_registrales', u'cambio_domicilio_social', u'disolucion', u'ampliacion_objeto_social', u'cierre_provisional_hoj
a_registral_baja_en_el_indice_entidades_juridicas', u'ceses_dimisiones', u'nombramientos', u'situacion_concursal', u'modificaciones_estatutarias', u'ampliacion_capital', u'adaptacion_ley_2_95'
, u'cambio_denominacion_social', u'extincion', u'reduccion_capital', u'cambio_identidad_socio_unico', u'transformacion_sociedad', u'reapertura_hoja_registral', u'socio_unico', u'articulo_378_5
_reglamento_registro_mercantil', u'fusion_absorcion']
['revocaciones', 'cambio_objeto_social', 'reelecciones', 'otros_conceptos', 'fe_erratas', 'sociedad_unipersonal', 'declaracion_unipersonalidad', 'constitucion', 'suspension_pagos', '
perdida_caracter_unipersonalidad', 'cancelaciones_oficio_nombramientos', 'datos_registrales', 'cambio_domicilio_social', 'disolucion', 'ampliacion_objeto_social', 'cierre_provisional_hoj
a_registral_baja_en_el_indice_entidades_juridicas', 'ceses_dimisiones', 'nombramientos', 'situacion_concursal', 'modificaciones_estatutarias', 'ampliacion_capital', 'adaptacion_ley_2_95'
, 'cambio_denominacion_social', 'extincion', 'reduccion_capital', 'cambio_identidad_socio_unico', 'transformacion_sociedad', 'reapertura_hoja_registral', 'socio_unico', 'articulo_378_5
_reglamento_registro_mercantil', 'fusion_absorcion']
"""
6 changes: 1 addition & 5 deletions bormeparser/backends/seccion_c/lxml/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import datetime
import logging
import re
import six

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARN)
Expand All @@ -49,10 +48,7 @@ def _clean_cif(self, companies):
return cifs

def parse(self):
if six.PY2:
fp = open(self.filename)
else:
fp = open(self.filename, 'r', encoding='iso-8859-1')
fp = open(self.filename, 'r', encoding='iso-8859-1')

content = fp.read()
fp.close()
Expand Down
27 changes: 9 additions & 18 deletions bormeparser/borme.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import os.path
import re
import requests
import six

from lxml import etree

Expand Down Expand Up @@ -93,7 +92,7 @@ def _set_name(self, name):
self.name = name

def _set_value(self, value):
if not (value is None or isinstance(value, six.string_types)):
if not (value is None or isinstance(value, str)):
raise ValueError('value must be str or None: %s' % value)
self.value = value

Expand Down Expand Up @@ -135,7 +134,7 @@ class BormeAnuncio(object):
"""

def __init__(self, id, empresa, actos, extra, datos_registrales=None):
logger.debug(u"new BormeAnuncio({}) {} ({})".format(id, empresa, extra))
logger.debug("new BormeAnuncio({}) {} ({})".format(id, empresa, extra))
self.id = id
self.empresa = empresa
self.registro = extra["registro"]
Expand Down Expand Up @@ -288,7 +287,7 @@ def get_provincias(self, seccion):

xpath = '//sumario/diario/seccion[@num="{}"]/emisor/item/titulo/text()'.format(seccion)
provincias = self.xml.xpath(xpath)
provincias.remove(u"ÍNDICE ALFABÉTICO DE SOCIEDADES")
provincias.remove("ÍNDICE ALFABÉTICO DE SOCIEDADES")
return provincias

# TODO: Los nombres en el XML vienen en sus respectivos idiomas
Expand All @@ -298,11 +297,11 @@ def _build_xpath(self, seccion=None, provincia=None):
Devuelve una lista con los elementos item
"""
if seccion and provincia:
xpath = u'//sumario/diario/seccion[@num="{}"]/emisor/item/titulo[text()="{}"]'.format(seccion, provincia)
xpath = '//sumario/diario/seccion[@num="{}"]/emisor/item/titulo[text()="{}"]'.format(seccion, provincia)
elif seccion:
xpath = '//sumario/diario/seccion[@num="{}"]/emisor/item'.format(seccion)
elif provincia:
xpath = u'//sumario/diario/seccion/emisor/item/titulo[text()="{}"]'.format(provincia)
xpath = '//sumario/diario/seccion/emisor/item/titulo[text()="{}"]'.format(provincia)
else:
xpath = '//sumario/diario/seccion/emisor/item'

Expand Down Expand Up @@ -387,24 +386,16 @@ def save_to_file(self, path):

self.xml.write(path, encoding='iso-8859-1', pretty_print=True)

if six.PY3:
with open(path, 'r', encoding='iso-8859-1') as fp:
content = fp.read()
else:
with open(path, 'r') as fp:
content = fp.read()
with open(path, 'r', encoding='iso-8859-1') as fp:
content = fp.read()

content = content.replace("<?xml version='1.0' encoding='ISO-8859-1'?>", '<?xml version="1.0" encoding="ISO-8859-1"?>')
if not self.is_final:
logger.warning('Está guardando un archivo no definitivo')
content = content.replace('<fechaSig/>', '<fechaSig></fechaSig>')

if six.PY3:
with open(path, 'w', encoding='iso-8859-1') as fp:
fp.write(content)
else:
with open(path, 'w') as fp:
fp.write(content)
with open(path, 'w', encoding='iso-8859-1') as fp:
fp.write(content)

return True

Expand Down

0 comments on commit 1de4c23

Please sign in to comment.