From 42ebc293ccd847a8ae08636042fa3a3159c58a1b Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Fri, 17 Sep 2010 15:31:40 +0300 Subject: [PATCH 01/80] [Tools][createdb] * Added parameter support for followings; - username (username of the database) - password (password for the given/default username) - host (host address of the database server) - database (database name) Since optparse is deprecated (version 2.7), argparse is used instead. * removed unnecessary library inclusion and comments --- crawler/createdb.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/crawler/createdb.py b/crawler/createdb.py index a6630c8..503781b 100755 --- a/crawler/createdb.py +++ b/crawler/createdb.py @@ -1,19 +1,19 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Define your item pipelines here -# -# Don't forget to add your pipeline to the ITEM_PIPELINES setting -# See: http://doc.scrapy.org/topics/item-pipeline.html - -import sys -import sqlalchemy from sqlalchemy import create_engine -from sqlalchemy import Table, Column, Integer, Float, Unicode, MetaData, ForeignKey, or_ -from sqlalchemy.orm import mapper, sessionmaker +from sqlalchemy import Table, Column, Integer, Float, Unicode, MetaData +from argparse import ArgumentParser +parser = ArgumentParser(description='Allows to create initial books table in mysql database') +parser.add_argument('-u', '--username', nargs=1, default=['root'], help='Username of the relevant database') +parser.add_argument('-p', '--password', nargs=1, default=[''], help='Password for given or default username of the relevant database') +parser.add_argument('--host', nargs=1, default=['localhost'], help='Host address of the database') +parser.add_argument('-d', '--database', nargs=1, default=['bookcrawler'], help='Database name') +options = parser.parse_args() -engine = create_engine('mysql://root:123456@localhost/bookcrawler', echo=True) +db_dialect = "mysql://" + options.username[0] + ":" + options.password[0] + "@" + options.host[0] + "/" + options.database[0] +engine = create_engine(db_dialect, echo=True) metadata = MetaData() books_table = Table('books', metadata, From 0512d5089c75d8cf6c1d9ef2c05d5f8788e7dfe8 Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Fri, 17 Sep 2010 16:47:03 +0300 Subject: [PATCH 02/80] [ItemPipeline] * Added database config parser * ItemPipeline fetches config to communicate database Note: Modify your database config file (at datbase.cfg) --- crawler/crawler/database_config.py | 26 ++++++++++++++++++++++++++ crawler/crawler/pipelines.py | 4 +++- crawler/database.cfg | 4 ++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 crawler/crawler/database_config.py create mode 100644 crawler/database.cfg diff --git a/crawler/crawler/database_config.py b/crawler/crawler/database_config.py new file mode 100644 index 0000000..03e6288 --- /dev/null +++ b/crawler/crawler/database_config.py @@ -0,0 +1,26 @@ +from ConfigParser import SafeConfigParser + +class DatabaseConfig(object): + """ + Allows to fetch Database properties + """ + + def __init__(self, dbtype='mysql', cfg='database.cfg'): + """ + while allocating the class, dbtype can be passed as parameter, like; + db = Database(dbtype='sqlite') + """ + self.dbtype = dbtype + if self.dbtype != 'mysql': + print "Unsupported database type : '" + self.dbtype + "'" + + self.configfile = cfg + self.config = SafeConfigParser({'username':'root', 'password':'', 'host':'localhost', 'database':'bookcrawler'}) + self.config.read(self.configfile) + self.username = self.config.get(self.dbtype, 'username') + self.password = self.config.get(self.dbtype, 'password') + self.host = self.config.get(self.dbtype, 'host') + self.database = self.config.get(self.dbtype, 'database') + + def get_dialect(self): + return "%s://%s:%s@%s/%s"%(self.dbtype, self.username, self.password, self.host, self.database) diff --git a/crawler/crawler/pipelines.py b/crawler/crawler/pipelines.py index 15fe09c..d1e1746 100644 --- a/crawler/crawler/pipelines.py +++ b/crawler/crawler/pipelines.py @@ -9,6 +9,7 @@ from sqlalchemy import create_engine from sqlalchemy import Table, Column, Integer, Float, Unicode, MetaData, and_ from sqlalchemy.orm import mapper, sessionmaker +from database_config import DatabaseConfig class Book(object): def __init__(self, name, isbn, author, publisher, link, price, store): @@ -43,9 +44,10 @@ def __init__(self): dispatcher.connect(self.spider_opened, signals.spider_opened) dispatcher.connect(self.spider_closed, signals.spider_closed) self.session = None + self.database_dialect = DatabaseConfig().get_dialect() def spider_opened(self, spider): - self.session = sessionmaker(bind=create_engine('mysql://root:123456@localhost/bookcrawler', echo=True))() + self.session = sessionmaker(bind=create_engine(self.database_dialect, echo=True))() DbExportPipeline.i += 1 def spider_closed(self, spider): diff --git a/crawler/database.cfg b/crawler/database.cfg new file mode 100644 index 0000000..0b0215a --- /dev/null +++ b/crawler/database.cfg @@ -0,0 +1,4 @@ +[mysql] +username = root +password = qwe123 +database = bookcrawler \ No newline at end of file From cc25834f14e8fa4d3a8cf1306ef179e173d79b3f Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Sun, 19 Sep 2010 22:59:54 +0300 Subject: [PATCH 03/80] * added utils and settings directories to root path of the project * helper applications and libraries goes to utils/ directory * settings can be added/edited under settings/ directory !!! WARNING !!! In order to use libraries under utils dir, this path needed to be added PYTHONPATH env. variable. example from .bashrc: export PYTHONPATH=$PYTHONPATH:/home/sinan/dev/bookcrawler/utils Or you can link/add these file(s) to /usr/local/lib/python2.6/site-packages --- crawler/database.cfg | 4 ---- settings/database.cfg | 4 ++++ {crawler => utils}/createdb.py | 0 {crawler/crawler => utils}/database_config.py | 4 +++- {crawler => utils}/readdb.py | 0 utils/sys_utils.py | 6 ++++++ 6 files changed, 13 insertions(+), 5 deletions(-) delete mode 100644 crawler/database.cfg create mode 100644 settings/database.cfg rename {crawler => utils}/createdb.py (100%) rename {crawler/crawler => utils}/database_config.py (86%) rename {crawler => utils}/readdb.py (100%) create mode 100644 utils/sys_utils.py diff --git a/crawler/database.cfg b/crawler/database.cfg deleted file mode 100644 index 0b0215a..0000000 --- a/crawler/database.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[mysql] -username = root -password = qwe123 -database = bookcrawler \ No newline at end of file diff --git a/settings/database.cfg b/settings/database.cfg new file mode 100644 index 0000000..934f122 --- /dev/null +++ b/settings/database.cfg @@ -0,0 +1,4 @@ +[mysql] +username = root +password = 1234 +database = bookcrawler diff --git a/crawler/createdb.py b/utils/createdb.py similarity index 100% rename from crawler/createdb.py rename to utils/createdb.py diff --git a/crawler/crawler/database_config.py b/utils/database_config.py similarity index 86% rename from crawler/crawler/database_config.py rename to utils/database_config.py index 03e6288..26de33c 100644 --- a/crawler/crawler/database_config.py +++ b/utils/database_config.py @@ -1,4 +1,5 @@ from ConfigParser import SafeConfigParser +from sys_utils import FindRootPath class DatabaseConfig(object): """ @@ -16,7 +17,8 @@ def __init__(self, dbtype='mysql', cfg='database.cfg'): self.configfile = cfg self.config = SafeConfigParser({'username':'root', 'password':'', 'host':'localhost', 'database':'bookcrawler'}) - self.config.read(self.configfile) + self.configpath = FindRootPath() + "/settings/" + self.config.read(self.configpath + self.configfile) self.username = self.config.get(self.dbtype, 'username') self.password = self.config.get(self.dbtype, 'password') self.host = self.config.get(self.dbtype, 'host') diff --git a/crawler/readdb.py b/utils/readdb.py similarity index 100% rename from crawler/readdb.py rename to utils/readdb.py diff --git a/utils/sys_utils.py b/utils/sys_utils.py new file mode 100644 index 0000000..36b7113 --- /dev/null +++ b/utils/sys_utils.py @@ -0,0 +1,6 @@ +from os import getcwd + +def FindRootPath(): + dirlist = getcwd().split('/') + index = dirlist.index('bookcrawler') + return "/".join(dirlist[:index + 1]) From 1606596113383d0e24c48baf3866ab347df7e193 Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Sun, 19 Sep 2010 23:01:20 +0300 Subject: [PATCH 04/80] [web2py] * db path fetched from generic helper library by DatabaseConfig() --- web2py/applications/myapp/models/db.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web2py/applications/myapp/models/db.py b/web2py/applications/myapp/models/db.py index f35439c..1c4ef6d 100644 --- a/web2py/applications/myapp/models/db.py +++ b/web2py/applications/myapp/models/db.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- -db = DAL("mysql://root:123456@localhost/bookcrawler") +from database_config import DatabaseConfig + +db = DAL(DatabaseConfig().get_dialect()) db.define_table('books', Field('name'), From 1f6b97946d10d254fa190f7adddc4f1724b7048d Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Thu, 14 Oct 2010 04:30:33 +0300 Subject: [PATCH 05/80] initial commit of *not finished* firefox add-on --- firefox-addon/KitapSever.xpi | Bin 0 -> 10304 bytes firefox-addon/KitapSever/chrome.manifest | 8 +++ .../KitapSever/chrome/content/browser.xul | 24 ++++++++ .../KitapSever/chrome/content/kitapsever.js | 54 ++++++++++++++++++ .../chrome/content/kitapsever.js.yedek | 44 ++++++++++++++ .../KitapSever/chrome/content/options.xul | 34 +++++++++++ .../KitapSever/defaults/preferences/pref.js | 1 + firefox-addon/KitapSever/install.rdf | 23 ++++++++ .../KitapSever/locale/en-US/translations.dtd | 1 + firefox-addon/KitapSever/skin/skin.css | 12 ++++ firefox-addon/KitapSever/skin/status-bar.png | Bin 0 -> 423 bytes .../KitapSever/skin/toolbar-large.png | Bin 0 -> 1067 bytes 12 files changed, 201 insertions(+) create mode 100644 firefox-addon/KitapSever.xpi create mode 100644 firefox-addon/KitapSever/chrome.manifest create mode 100644 firefox-addon/KitapSever/chrome/content/browser.xul create mode 100644 firefox-addon/KitapSever/chrome/content/kitapsever.js create mode 100644 firefox-addon/KitapSever/chrome/content/kitapsever.js.yedek create mode 100644 firefox-addon/KitapSever/chrome/content/options.xul create mode 100644 firefox-addon/KitapSever/defaults/preferences/pref.js create mode 100644 firefox-addon/KitapSever/install.rdf create mode 100644 firefox-addon/KitapSever/locale/en-US/translations.dtd create mode 100644 firefox-addon/KitapSever/skin/skin.css create mode 100644 firefox-addon/KitapSever/skin/status-bar.png create mode 100644 firefox-addon/KitapSever/skin/toolbar-large.png diff --git a/firefox-addon/KitapSever.xpi b/firefox-addon/KitapSever.xpi new file mode 100644 index 0000000000000000000000000000000000000000..285baf0f9f8ea14d2d01207bb835618856268591 GIT binary patch literal 10304 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 MfgiVcLWlVFe^?ke7ytkO literal 0 HcmV?d00001 diff --git a/firefox-addon/KitapSever/chrome.manifest b/firefox-addon/KitapSever/chrome.manifest new file mode 100644 index 0000000..54a55ea --- /dev/null +++ b/firefox-addon/KitapSever/chrome.manifest @@ -0,0 +1,8 @@ +content kitapsever chrome/content/ +content kitapsever chrome/content/ contentaccessible=yes +overlay chrome://browser/content/browser.xul chrome://kitapsever/content/browser.xul + +locale kitapsever en-US locale/en-US/ + +skin kitapsever classic/1.0 skin/ +style chrome://global/content/customizeToolbar.xul chrome://kitapsever/skin/skin. \ No newline at end of file diff --git a/firefox-addon/KitapSever/chrome/content/browser.xul b/firefox-addon/KitapSever/chrome/content/browser.xul new file mode 100644 index 0000000..8aaeafb --- /dev/null +++ b/firefox-addon/KitapSever/chrome/content/browser.xul @@ -0,0 +1,24 @@ + + + + + +