def test_minify_created(self): css_directory = path.join(getcwd(), 'test_css') file_name = 'blowdry' css_file = CSSFile(file_directory=css_directory, file_name=file_name) file_path = path.join(css_directory, css_file.file_name + '.min.css') if path.isfile(file_path): # Ensure that file is deleted before testing. remove(file_path) css_file.minify() self.assertTrue(path.isfile(file_path))
def test_write_verify_css_text(self): css_directory = path.join(getcwd(), 'test_css') file_name = 'blowdry' css_file = CSSFile(file_directory=css_directory, file_name=file_name) file_path = path.join(css_directory, css_file.file_name + '.css') if path.isfile(file_path): # Ensure that file is deleted before testing. remove(file_path) css_text = b'.bold {\n font-weight: bold\n }\n.margin-top-50px {\n margin-top: 50px\n }\n' \ b'.c-blue {\n color: blue\n }\n.height-50px {\n height: 50px\n }\n' \ b'.bgc-h000 {\n background-color: #000\n }\n.color-hfff {\n color: #fff\n }\n' \ b'.valign-middle {\n vertical-align: middle\n }\n.height-150px {\n height: 150px\n }\n' \ b'.text-align-center {\n text-align: center\n }' expected_string = css_text.decode('utf-8') css_file.write(css_text=css_text) with open(file_path, 'r') as css_file: file_string = css_file.read() self.assertEqual(file_string, expected_string)
def main(): """ This is the main script. **Order of Operations:** - Initialize settings. - Start performance timer. - Generate Markdown documentation files. - Generate HTML documentation files. (This location is important since it allows encoded css to be included in the documentation files.) - Generate reStructuredText documentation files. - Define File all file types/extensions to search for in project_directory - Get all files associated with defined file_types in project_directory - Get set of all defined classes - Filter class names only keeping classes that match the defined class encoding. - Build a set() of valid css properties. Some classes may be removed during cssutils validation. - Output the DRY CSS file. (user command option) - Output the Minified DRY CSS file. (user command option) **Depending on the settings this script generates the following:** - DRY CSS files - blowdry.css |sp| |sp| |sp| |sp| |sp| **human readable** - blowdry.min.css |sp| **minified** - Clashing Alias files (Encoded class selector aliases that are invalid and cannot be used because they clash.) - Markdown |sp| |sp| |sp| |sp| |sp| |sp| **Github** - HTML |sp| |sp| |sp| |sp| |sp| |sp| |sp| |sp| |sp| **Browser** - reStructuredText |sp| **Sphinx** - Property Alias File (Encoded class selector aliases that are valid and can be used to construct class selectors.) - Markdown |sp| |sp| |sp| |sp| |sp| |sp| **Github** - HTML |sp| |sp| |sp| |sp| |sp| |sp| |sp| |sp| |sp| **Browser** - reStructuredText |sp| **Sphinx** - Temporal Statistics **Note:** The default locations of these files can be overridden to suit your needs. **Directory assignments** ``project_directory`` -- Allows ``blowdrycss`` to know where the HTML project is located. It will only search the files in the directory specified here. .. |sp| raw:: html """ # Import settings. Better to ask forgiveness both importing and writing the file. # The long name blowdrycss_settings is used since the django uses settings.py and using the same name would # cause a name conflict. try: from settings import blowdrycss_settings as settings except ImportError: if not path.isfile('blowdrycss_settings.py'): write_blowdrycss_settings_dot_py() import blowdrycss_settings as settings # Performance timer if settings.timing_enabled: pass # Generate Markdown documentation files. if settings.markdown_docs: markdown_file = GenericFile( # Document forbidden clashing aliases. file_directory=settings.markdown_directory, file_name='clashing_aliases', extension='.md' ) markdown_file.write(str(clashing_alias_markdown)) markdown_file = GenericFile( # Document allowed property aliases. file_directory=settings.markdown_directory, file_name='property_aliases', extension='.md' ) markdown_file.write(str(property_alias_markdown)) # Generate HTML documentation files. (This location is important since it allows encoded css to be included # in the documentation files.) if settings.html_docs: html_file = GenericFile( # Document forbidden clashing aliases. file_directory=settings.project_directory, file_name='clashing_aliases', extension='.html' ) html_file.write(str(clashing_alias_html)) html_file = GenericFile( # Document allowed property aliases. file_directory=settings.project_directory, file_name='property_aliases', extension='.html' ) html_file.write(str(property_alias_html)) # Generate reStructuredText documentation files. if settings.rst_docs: print(str(settings.docs_directory)) # Python 2 requires str(). rst_file = GenericFile(file_directory=settings.docs_directory, file_name='clashing_aliases', extension='.rst') rst_file.write(str(clashing_alias_rst)) rst_file = GenericFile(file_directory=settings.docs_directory, file_name='property_aliases', extension='.rst') rst_file.write(str(property_alias_rst)) # Get all files associated with defined file_types in project_directory file_finder = FileFinder(project_directory=settings.project_directory, file_types=settings.file_types) # Create set of all defined classes class_parser = HTMLClassParser(files=file_finder.files) # Filter class names. Only keep classes matching the defined class encoding. class_property_parser = ClassPropertyParser(class_set=class_parser.class_set) # print('\nclass_property_parser.class_set:', class_property_parser.class_set) class_set = class_property_parser.class_set.copy() # Build a set() of valid css properties. Some classes may be removed during cssutils validation. css_builder = CSSBuilder(property_parser=class_property_parser) css_text = css_builder.get_css_text() # Build Media Queries if settings.media_queries_enabled: unassigned_class_set = class_set.difference(css_builder.property_parser.class_set) css_builder.property_parser.class_set = unassigned_class_set # Only use unassigned classes css_builder.property_parser.removed_class_set = set() # Clear set media_query_builder = MediaQueryBuilder(property_parser=class_property_parser) # print(media_query_builder.property_parser.class_set) css_text += bytes(media_query_builder.get_css_text(), 'utf-8') # print('CSS Text:') # print(css_text) # Output the DRY CSS file. (user command option) if settings.human_readable: css_file = CSSFile(file_directory=settings.css_directory, file_name='blowdry') css_file.write(css_text=css_text) print(str(settings.css_directory + css_file.file_name) + '.css created.') # Output the Minified DRY CSS file. (user command option) if settings.minify: css_file = CSSFile(file_directory=settings.css_directory, file_name='blowdry') css_file.minify(css_text=css_text) print(str(settings.css_directory + css_file.file_name) + '.min.css created.')