def coerce(cls, string):
        """Create a :class:`Requirement` object from a given package spec."""
        match = re.match(cls.spec_regex, string)
        if not match:
            raise InvalidRequirementSpecError("could not parse requirement")
        package = match.group(1)
        if all(match.group(2, 3)):
            version = "".join(match.group(2, 3))
        else:
            version = None
        return cls(package, version)
def draw(self, context):
        import sys
        layout = self.layout

        userpref = context.user_preferences
        system = userpref.system

        split = layout.split()

        # 1. Column
        column = split.column()
        colsplit = column.split(percentage=0.85)

        col = colsplit.column()
        col.label(text="General:")
        col.prop(system, "dpi")
        col.label("Virtual Pixel Mode:")
        col.prop(system, "virtual_pixel_mode", text="")

        col.separator()

        col.prop(system, "frame_server_port")
        col.prop(system, "scrollback", text="Console Scrollback")

        col.separator()

        col.label(text="Sound:")
        col.row().prop(system, "audio_device", expand=False)
        sub = col.column()
        sub.active = system.audio_device != 'NONE' and system.audio_device != 'Null'
        #sub.prop(system, "use_preview_images")
        sub.prop(system, "audio_channels", text="Channels")
        sub.prop(system, "audio_mixing_buffer", text="Mixing Buffer")
        sub.prop(system, "audio_sample_rate", text="Sample Rate")
        sub.prop(system, "audio_sample_format", text="Sample Format")

        col.separator()

        col.label(text="Screencast:")
        col.prop(system, "screencast_fps")
        col.prop(system, "screencast_wait_time")

        col.separator()

        if userpref.addons.find('cycles') != -1:
            userpref.addons['cycles'].preferences.draw_impl(col, context)

        if hasattr(system, "opensubdiv_compute_type"):
            col.label(text="OpenSubdiv compute:")
            col.row().prop(system, "opensubdiv_compute_type", text="")

        # 2. Column
        column = split.column()
        colsplit = column.split(percentage=0.85)

        col = colsplit.column()
        col.label(text="OpenGL:")
        col.prop(system, "gl_clip_alpha", slider=True)
        col.prop(system, "use_mipmaps")
        col.prop(system, "use_gpu_mipmap")
        col.prop(system, "use_16bit_textures")

        col.separator()
        col.label(text="Selection")
        col.prop(system, "select_method", text="")

        col.separator()

        col.label(text="Anisotropic Filtering")
        col.prop(system, "anisotropic_filter", text="")

        col.separator()

        col.label(text="Window Draw Method:")
        col.prop(system, "window_draw_method", text="")
        col.prop(system, "multi_sample", text="")
        if sys.platform == "linux" and system.multi_sample != 'NONE':
            col.label(text="Might fail for Mesh editing selection!")
            col.separator()
        col.prop(system, "use_region_overlap")

        col.separator()

        col.label(text="Text Draw Options:")
        col.prop(system, "use_text_antialiasing")

        col.separator()

        col.label(text="Textures:")
        col.prop(system, "gl_texture_limit", text="Limit Size")
        col.prop(system, "texture_time_out", text="Time Out")
        col.prop(system, "texture_collection_rate", text="Collection Rate")

        col.separator()

        col.label(text="Images Draw Method:")
        col.prop(system, "image_draw_method", text="")

        col.separator()

        col.label(text="Sequencer/Clip Editor:")
        # currently disabled in the code
        # col.prop(system, "prefetch_frames")
        col.prop(system, "memory_cache_limit")

        # 3. Column
        column = split.column()

        column.label(text="Solid OpenGL lights:")

        split = column.split(percentage=0.1)
        split.label()
        split.label(text="Colors:")
        split.label(text="Direction:")

        lamp = system.solid_lights[0]
        opengl_lamp_buttons(column, lamp)

        lamp = system.solid_lights[1]
        opengl_lamp_buttons(column, lamp)

        lamp = system.solid_lights[2]
        opengl_lamp_buttons(column, lamp)

        column.separator()

        column.label(text="Color Picker Type:")
        column.row().prop(system, "color_picker_type", text="")

        column.separator()

        column.prop(system, "use_weight_color_range", text="Custom Weight Paint Range")
        sub = column.column()
        sub.active = system.use_weight_color_range
        sub.template_color_ramp(system, "weight_color_range", expand=True)

        column.separator()
        column.prop(system, "font_path_ui")
        column.prop(system, "font_path_ui_mono")

        if bpy.app.build_options.international:
            column.prop(system, "use_international_fonts")
            if system.use_international_fonts:
                column.prop(system, "language")
                row = column.row()
                row.label(text="Translate:", text_ctxt=i18n_contexts.id_windowmanager)
                row = column.row(align=True)
                row.prop(system, "use_translate_interface", text="Interface", toggle=True)
                row.prop(system, "use_translate_tooltips", text="Tooltips", toggle=True)
                row.prop(system, "use_translate_new_dataname", text="New Data", toggle=True)