def layout(self, client, userdata): fixtures = os.path.join(ROOT, 'test/fixtures') profile = webdriver.FirefoxProfile(os.path.join(fixtures, 'profile', client)) for xpi in glob.glob(os.path.join(ROOT, 'xpi/*.xpi')): profile.add_extension(xpi) profile.set_preference('extensions.zotero.translators.better-bibtex.testing', True) with open(os.path.join(os.path.dirname(__file__), 'preferences.toml')) as f: preferences = toml.load(f) for p, v in nested_dict_iter(preferences['general']): profile.set_preference(p, v) if userdata.get('locale', '') == 'fr': for p, v in nested_dict_iter(preferences['fr']): profile.firefox.set_preference(p, v) if userdata.get('first-run', 'false') == 'false': profile.set_preference('extensions.zotero.translators.better-bibtex.citekeyFormat', '[auth][shorttitle][year]') if client == 'jurism': print('\n\n** WORKAROUNDS FOR JURIS-M IN PLACE -- SEE https://github.com/Juris-M/zotero/issues/34 **\n\n') #profile.set_preference('extensions.zotero.dataDir', os.path.join(self.path, 'jurism')) #profile.set_preference('extensions.zotero.useDataDir', True) #profile.set_preference('extensions.zotero.translators.better-bibtex.removeStock', False) profile.update_preferences() shutil.rmtree(self.path, ignore_errors=True) shutil.move(profile.path, self.path)
def layout(self, client, userdata, password, db): fixtures = os.path.join(ROOT, 'test/fixtures') profile = webdriver.FirefoxProfile( os.path.join(fixtures, 'profile', client)) for xpi in glob.glob(os.path.join(ROOT, 'xpi/*.xpi')): profile.add_extension(xpi) profile.set_preference( 'extensions.zotero.translators.better-bibtex.testing', True) profile.set_preference('extensions.zotero.debug-bridge.password', password) with open(os.path.join(os.path.dirname(__file__), 'preferences.toml')) as f: preferences = toml.load(f) for p, v in nested_dict_iter(preferences['general']): profile.set_preference(p, v) if userdata.get('locale', '') == 'fr': for p, v in nested_dict_iter(preferences['fr']): profile.firefox.set_preference(p, v) if userdata.get('first-run', 'false') == 'false': profile.set_preference( 'extensions.zotero.translators.better-bibtex.citekeyFormat', '[auth][shorttitle][year]') if client == 'jurism': print( '\n\n** WORKAROUNDS FOR JURIS-M IN PLACE -- SEE https://github.com/Juris-M/zotero/issues/34 **\n\n' ) #profile.set_preference('extensions.zotero.dataDir', os.path.join(self.path, 'jurism')) #profile.set_preference('extensions.zotero.useDataDir', True) #profile.set_preference('extensions.zotero.translators.better-bibtex.removeStock', False) profile.update_preferences() shutil.rmtree(self.path, ignore_errors=True) shutil.move(profile.path, self.path) if db: shutil.copy( db.zotero, os.path.join(self.path, client, os.path.basename(db.zotero))) shutil.copy( db.bbt, os.path.join(self.path, client, os.path.basename(db.bbt)))
def create_profile(self): profile = Munch( name='BBTZ5TEST' ) profile.path = os.path.expanduser(f'~/.{profile.name}') profile.profiles = { # 'Linux': os.path.expanduser(f'~/.{self.client}/{self.client}'), 'Linux': os.path.expanduser(f'~/.{self.client}/zotero'), 'Darwin': os.path.expanduser('~/Library/Application Support/' + {'zotero': 'Zotero', 'jurism': 'Juris-M'}[self.client]), }[platform.system()] os.makedirs(profile.profiles, exist_ok = True) beta = '' if self.beta: beta = '-beta' profile.binary = { 'Linux': f'/usr/lib/{self.client}{beta}/{self.client}', 'Darwin': f'/Applications/{self.client.title()}{beta}.app/Contents/MacOS/{self.client}', }[platform.system()] # create profile profile.ini = os.path.join(profile.profiles, 'profiles.ini') ini = configparser.RawConfigParser() ini.optionxform = str if os.path.exists(profile.ini): ini.read(profile.ini) if not ini.has_section('General'): ini.add_section('General') profile.id = None for p in ini.sections(): for k, v in ini.items(p): if k == 'Name' and v == profile.name: profile.id = p if not profile.id: free = 0 while True: profile.id = f'Profile{free}' if not ini.has_section(profile.id): break free += 1 ini.add_section(profile.id) ini.set(profile.id, 'Name', profile.name) ini.set(profile.id, 'IsRelative', 0) ini.set(profile.id, 'Path', profile.path) ini.set(profile.id, 'Default', None) with open(profile.ini, 'w') as f: ini.write(f, space_around_delimiters=False) # layout profile if self.config.profile: profile.firefox = webdriver.FirefoxProfile(os.path.join(ROOT, 'test/db', self.config.profile)) profile.firefox.set_preference('extensions.zotero.dataDir', os.path.join(profile.path, self.client)) profile.firefox.set_preference('extensions.zotero.useDataDir', True) profile.firefox.set_preference('extensions.zotero.translators.better-bibtex.removeStock', False) else: profile.firefox = webdriver.FirefoxProfile(os.path.join(FIXTURES, 'profile', self.client)) self.install_xpis(os.path.join(ROOT, 'xpi'), profile.firefox) self.install_xpis(os.path.join(ROOT, 'other-xpis'), profile.firefox) if self.config.db: self.install_xpis(os.path.join(ROOT, 'test/db', self.config.db, 'xpis'), profile.firefox) if self.config.profile: self.install_xpis(os.path.join(ROOT, 'test/db', self.config.profile, 'xpis'), profile.firefox) profile.firefox.set_preference('extensions.zotero.translators.better-bibtex.testing', self.testing) profile.firefox.set_preference('extensions.zotero.translators.better-bibtex.workers', self.workers) profile.firefox.set_preference('extensions.zotero.debug-bridge.password', self.password) profile.firefox.set_preference('dom.max_chrome_script_run_time', self.config.timeout) utils.print(f'dom.max_chrome_script_run_time={self.config.timeout}') with open(os.path.join(os.path.dirname(__file__), 'preferences.toml')) as f: preferences = toml.load(f) for p, v in nested_dict_iter(preferences['general']): profile.firefox.set_preference(p, v) if self.config.locale == 'fr': for p, v in nested_dict_iter(preferences['fr']): profile.firefox.firefox.set_preference(p, v) if not self.config.first_run: profile.firefox.set_preference('extensions.zotero.translators.better-bibtex.citekeyFormat', '[auth][shorttitle][year]') if self.client == 'jurism': utils.print('\n\n** WORKAROUNDS FOR JURIS-M IN PLACE -- SEE https://github.com/Juris-M/zotero/issues/34 **\n\n') profile.firefox.set_preference('extensions.zotero.dataDir', os.path.join(profile.path, 'jurism')) profile.firefox.set_preference('extensions.zotero.useDataDir', True) profile.firefox.set_preference('extensions.zotero.translators.better-bibtex.removeStock', False) profile.firefox.update_preferences() shutil.rmtree(profile.path, ignore_errors=True) shutil.move(profile.firefox.path, profile.path) profile.firefox = None if self.config.db: self.needs_restart = True utils.print(f'restarting using {self.config.db}') dbs = os.path.join(ROOT, 'test', 'db', self.config.db) if not os.path.exists(dbs): os.makedirs(dbs) db_zotero = os.path.join(dbs, f'{self.client}.sqlite') db_zotero_alt = os.path.join(dbs, self.client, f'{self.client}.sqlite') if not os.path.exists(db_zotero) and not os.path.exists(db_zotero_alt): urllib.request.urlretrieve(f'https://github.com/retorquere/zotero-better-bibtex/releases/download/test-database/{self.config.db}.zotero.sqlite', db_zotero) if not os.path.exists(db_zotero): db_zotero = db_zotero_alt shutil.copy(db_zotero, os.path.join(profile.path, self.client, os.path.basename(db_zotero))) db_bbt = os.path.join(dbs, 'better-bibtex.sqlite') db_bbt_alt = os.path.join(dbs, self.client, 'better-bibtex.sqlite') if not os.path.exists(db_bbt) and not os.path.exists(db_bbt_alt): urllib.request.urlretrieve(f'https://github.com/retorquere/zotero-better-bibtex/releases/download/test-database/{self.config.db}.better-bibtex.sqlite', db_bbt) if not os.path.exists(db_bbt): db_bbt = db_bbt_alt shutil.copy(db_bbt, os.path.join(profile.path, self.client, os.path.basename(db_bbt))) # remove any auto-exports that may exist db = sqlite3.connect(os.path.join(profile.path, self.client, os.path.basename(db_bbt))) ae = None for (ae,) in db.execute('SELECT data FROM "better-bibtex" WHERE name = ?', [ 'better-bibtex.autoexport' ]): ae = json.loads(ae) ae['data'] = [] if ae: db.execute('UPDATE "better-bibtex" SET data = ? WHERE name = ?', [ json.dumps(ae), 'better-bibtex.autoexport' ]) db.commit() db.close() return profile