class Profile(object): name = related.StringField(default="__root__") host = related.StringField(required=False) schemas = related.ChildField(Namespace, required=False) globals = related.ChildField(Namespace, required=False) headers = related.ChildField(Namespace, required=False) prefixes = related.SequenceField(str, default=None) extensions = related.SequenceField(str, default=["rigor"]) includes = related.SequenceField(str, default=None) excludes = related.SequenceField(str, default=None) concurrency = related.IntegerField(default=5) retries = related.IntegerField(default=0) sleep = related.IntegerField(default=60) retry_failed = related.BooleanField(default=False, required=False) def __attrs_post_init__(self): # circumvent frozen error due to immutable extensions = [ ext[1:] if ext.startswith(".") else ext for ext in self.extensions or [] ] object.__setattr__(self, "extensions", extensions) def as_dict(self): kwargs = related.to_dict(self) kwargs.pop("profiles", None) kwargs.pop("file_path", None) return kwargs
class StatusResult(object): status = related.StringField() duration = related.IntegerField() line = related.IntegerField(default=4) @classmethod def create(cls, success, duration): status = {True: "passed", False: "failed"}.get(success, "skipped") return cls(status=status, duration=duration)
class ExamQuestionAnswerMeta: """ Represents metadata of a question answer's object """ text = related.StringField('') is_correct = related.BooleanField(False, required=False) likelihood = related.IntegerField(1, required=False) id = related.IntegerField(0) def __str__(self): return f"{self.id}: [{'+' if self.is_correct else '-'}] {self.text}"
class DetectorMapping: detector = related.ChildField(DetectorUUID) expression = related.ChildField(DetectorMappingExpression) user = related.ChildField(DetectorMappingUser) fields = related.SequenceField(str, required=False) id = related.StringField(required=False) last_modified_time_in_millis = related.IntegerField( required=False, key="lastModifiedTimeInMillis") created_time_in_millis = related.IntegerField(required=False, key="createdTimeInMillis") enabled = related.BooleanField(required=False)
class Counts(object): key = related.StringField() passed = related.IntegerField(default=0) failed = related.IntegerField(default=0) total = related.IntegerField(default=0) def add(self, passed): if passed: self.passed += 1 else: self.failed += 1 self.total += 1
class StepResult(object): step = related.ChildField(Step) success = related.BooleanField(default=True) fetch = related.ChildField(Fetch, required=False) response = related.ChildField(object, required=False) transform = related.ChildField(object, required=False) extract = related.ChildField(Namespace, required=False) status = related.IntegerField(required=False) validations = related.SequenceField(ValidationResult, required=False) duration = related.IntegerField(required=False) @property def failed_validations(self): return [v for v in self.validations if not v.success]
class UtilConfig(object): lang1 = related.ChildField(LanguageInfo) lang2 = related.ChildField(LanguageInfo) redo = related.BooleanField(default=False) path = related.StringField(default=".") num = related.IntegerField(default=10) record = related.BooleanField(default=True)
class BarGraphSettings: result_limit = related.IntegerField(50, key='resultLimit') sort_order = related.ChildField(SortOrder, SortOrder.DESCENDING, key='sortOrder') sort_on = related.StringField('', key='sortOn') stack_bars = related.BooleanField(False, key='stackBars')
class CommandConfig(object): target_device_list = related.SequenceField(TargetDevice) database = related.ChildField(Database, required=False) influxdb = related.ChildField(Influxdb, required=False) set_measurement_interval = related.IntegerField(required=False) dry_run = related.BooleanField(default=False, required=False) no_scan = related.BooleanField(default=False, required=False)
class Feature(object): uri = related.StringField() keyword = related.StringField() id = related.StringField() name = related.StringField() line = related.IntegerField() elements = related.SequenceField(Element, default=[]) description = related.StringField(required=False, default=None) tags = related.SequenceField(Tag, required=False, default=None) @classmethod def create(cls, case_result): case = case_result.case uuid = "%s;%s" % (urllib.parse.quote_plus(case.name), case.uuid) return cls( uri=case.file_path, keyword="Feature", id=uuid, name=case.name, line=1, elements=[ Element.create(scenario_result) for scenario_result in chain( case_result.passed, case_result.failed) ], tags=[Tag(name=tag) for tag in case.tags], )
class BubbleChartSettings: linear_fit = related.BooleanField(False, key='linearFit') result_limit = related.IntegerField(100, key='resultLimit') show_legend = related.BooleanField(False, key='showLegend') x_axis = related.StringField('', key='xAxis') y_axis = related.StringField('', key='yAxis') z_axis = related.StringField('', key='zAxis')
class ExamQuestion: id = related.StringField(None) text = related.StringField('') is_multiple_choice = related.BooleanField(False) answers = related.SequenceField(ExamQuestionAnswer, None) points = related.IntegerField(0) @staticmethod def from_meta(id: str, meta: ExamQuestionMeta): meta.validate() multiple_choice = meta.is_multiple_choice answers_meta = meta.prepare_answers() answers = [ExamQuestionAnswer.from_meta(ans) for ans in answers_meta] return ExamQuestion(id=id, text=meta.text, is_multiple_choice=multiple_choice, answers=answers, points=meta.points) def grade(self, meta: ExamQuestionMeta) -> int: """ Returns the score for this ExamQuestion instance """ grader = get_grader(meta.grader) if grader: return grader(meta, self) return 0
class Element(object): keyword = related.StringField() id = related.StringField() name = related.StringField() line = related.IntegerField() description = related.StringField() type = related.StringField() steps = related.SequenceField(Step, default=[]) @classmethod def create(cls, scenario_result): uuid = "%s;%s" % (urllib.parse.quote_plus( scenario_result.case.name), scenario_result.uuid) # scenario step + steps steps = [Step.create(None, scenario_result)] + \ [Step.create(step_result, scenario_result) for step_result in scenario_result.step_results] return cls( keyword="Scenario", name=scenario_result.scenario.__name__, id=uuid, line=2, description="", type="scenario", steps=steps, )
class StoreData(object): name = related.StringField() id = related.IntegerField() created_on = related.DateTimeField("%m/%d/%Y %H:%M:%S") data_from = related.DateTimeField() data_to = related.DateTimeField() days = related.SequenceField(DayData)
class Step(object): keyword = related.StringField() line = related.IntegerField() match = related.ChildField(Match) name = related.StringField() doc_string = related.ChildField(DocString, required=False, default=None) result = related.ChildField(StatusResult, required=False, default=None) @classmethod def create(cls, step_result, scenario_result): if step_result is None: output = related.to_dict(scenario_result.scenario) output['__file__'] = scenario_result.case.file_path return cls(keyword="", line=3, name="Scenario Setup", doc_string=DocString.section("SCENARIO", output), match=Match(), result=StatusResult.create(True, 0)) else: return cls( keyword="", line=3, name=step_result.step.description, doc_string=DocString.create(step_result), match=Match.create(step_result.step), result=StatusResult.create(step_result.success, step_result.duration), )
class DocString(object): value = related.StringField() content_type = related.StringField(required=False) line = related.IntegerField(default=6) @classmethod def section(cls, title, obj, **kwargs): size = max(20, len(title)) bar = "=" * size # if isinstance(obj, dict) and "html" in obj: # content = str(obj["html"]) # else: # content = related.to_yaml(obj, **kwargs) if obj else "None" content = related.to_yaml(obj, **kwargs) if obj else "None" return "\n".join([bar, str.center(title, size), bar, "", content, ""]) @classmethod def create(cls, step_result): return cls(value="\n".join([ cls.section("REQUEST", step_result.fetch), cls.section("RESPONSE [%s]" % step_result.status, step_result.response), cls.section("TRANSFORM", step_result.transform), cls.section("EXTRACT", step_result.extract), cls.section("FAILURES", step_result.failed_validations, suppress_empty_values=False) ]))
class DashboardOptions: title = related.StringField('New Dashboard') column_count = related.IntegerField(DEFAULT_COLUMN_COUNT, key='columnCount') filter_panel_settings = related.ChildField(FilterPanelSettings, FilterPanelSettings(), key='filterPanelSettings')
class TrainHParams(RelatedConfigMixin): """Training hyper-parameters """ # patience in keras.callbacks.EarlyStopping early_stop_patience = related.IntegerField(5, required=False) # maximual number of epochs to train the model for epochs = related.IntegerField(200, required=False) batch_size = related.IntegerField(256, required=False) balance_peak_classes = related.BooleanField(False, required=False) # how frequently to evaluate (in fraction of the epoch) train_epoch_frac = related.FloatField(1.0, required=False) valid_epoch_frac = related.FloatField(1.0, required=False)
class SearchResults: beatmaps: List[Beatmap] = related.SequenceField(Beatmap) result_count: int = related.IntegerField() @classmethod def from_json(cls, stream: any): return related.from_json(stream, cls)
class ExamQuestionAnswer: id = related.IntegerField(0) text = related.StringField('') is_selected = related.BooleanField(False, required=False) @staticmethod def from_meta(meta: ExamQuestionAnswerMeta): return ExamQuestionAnswer(id=meta.id, text=meta.text)
class Port(object): """ https://docs.docker.com/compose/compose-file/#ports """ _short_form = related.StringField(required=False, repr=False, cmp=False) target = related.IntegerField(required=False) published = related.IntegerField(required=False) protocol = related.ChildField(Protocol, default=Protocol.TCP) mode = related.ChildField(Mode, default=Mode.HOST) def __attrs_post_init__(self): if self._short_form: # todo: handle protocol and mode parsing published, target = map(int, self._short_form.split(":")) # set methods won't work because the class is immutable. # workaround: https://github.com/python-attrs/attrs/issues/120 object.__setattr__(self, "published", published) object.__setattr__(self, "target", target)
class DayData(object): date = related.DateField() logged_on = related.TimeField("%H:%M") open_at = related.TimeField() closed_on = related.TimeField() customers = related.IntegerField() day_type = related.ChildField(DayType) sales = related.FloatField(required=False)
class LayoutItem: id = related.StringField() query_id = related.StringField(key='queryId') item_type = related.ChildField(VisualizationType, key='type') upper_x = related.IntegerField(key='upperX') upper_y = related.IntegerField(key='upperY') size_id = related.StringField(key='sizeId') custom_fields = related.SequenceField(CustomField, [], key='customFields') # TODO(stephen, anyone): Add full model for filter modal selections and # frontend selections filter. filter_modal_selections = related.ChildField(dict, {}, key='filterModalSelections') front_end_selections_filter = related.ChildField( dict, {}, key='frontendSelectionsFilter' ) name = related.StringField(required=False) is_advanced_query_item = related.BooleanField(False, key='isAdvancedQueryItem') is_locked = related.BooleanField(False, key='isLocked') setting_id = related.StringField(required=False, key='settingId')
class HeatTileSettings: divergent_coloration = related.BooleanField(True, key='divergentColoration') first_y_axis_selections = related.SequenceField(str, [], key='firstYaxisSelections') invert_coloration = related.BooleanField(False, key='invertColoration') log_scaling = related.BooleanField(True, key='logScaling') result_limit = related.IntegerField(100, key='resultLimit') selected_field = related.StringField('', key='selectedField') show_time_on_y_axis = related.BooleanField(True, key='showTimeOnYAxis') sort_order = related.ChildField(SortOrder, SortOrder.DESCENDING, key='sortOrder') sort_on = related.StringField('', key='sortOn') use_ethiopian_dates = related.BooleanField(False, key='useEthiopianDates')
class BumpChartSettings: result_limit = related.IntegerField(25, key='resultLimit') selected_field = related.StringField('', key='selectedField') # NOTE(stephen): This is a mapping from field ID to True. That is difficult # to represent with `related` and we'd prefer having a set on both the # frontend and the backend. Fix this. selected_keys = related.ChildField(dict, {}, key='selectedKeys') sort_order = related.ChildField(SortOrder, SortOrder.DESCENDING, key='sortOrder') theme = related.ChildField(BumpChartTheme, BumpChartTheme.DARK) use_ethiopian_dates = related.BooleanField(False, key='useEthiopianDates')
class TimeSeriesSettings: bucket_mean = related.BooleanField(False, key='bucketMean') bucket_type = related.ChildField( TimeSeriesBucket, TimeSeriesBucket.MONTH, key='bucketType' ) log_scaling = related.BooleanField(False, key='logScaling') result_limit = related.IntegerField(5, key='resultLimit') sort_order = related.ChildField(SortOrder, SortOrder.DESCENDING, key='sortOrder') sort_on = related.StringField('', key='sortOn') use_ethiopian_dates = related.BooleanField(False, key='useEthiopianDates') show_data_labels = related.BooleanField(False, key='showDataLabels') rotate_labels = related.BooleanField(True, key='rotateLabels')
class ModelTest(RelatedLoadSaveMixin): # predictions = related. expect = AnyField(default=None, required=False) precision_decimal = related.IntegerField(default=7, required=False) # Arrays should be almost equal to `precision_decimal` places # https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.testing.assert_almost_equal.html # abs(desired-actual) < 1.5 * 10**(-precision_decimal) def __attrs_post_init__(self): if self.expect is not None: if not isinstance(self.expect, str): # it has to be the url if not (isinstance(self.expect, dict) and "url" in self.expect): raise ValueError("expect is not a file path, expecting a url field with entries: url and md5") self.expect = RemoteFile.from_config(self.expect)
class BarChartSettings: # NOTE(stephen): This is a mapping from field ID to True. That is difficult # to represent with `related` and we'd prefer having a set on both the # frontend and the backend. Fix this. disabled_fields = related.ChildField(dict, {}, key='disabledFields') result_limit = related.IntegerField(50, key='resultLimit') sort_order = related.ChildField(SortOrder, SortOrder.DESCENDING, key='sortOrder') sort_on = related.StringField('', key='sortOn') stack_bars = related.BooleanField(False, key='stackBars') y2_line_graph = related.BooleanField(False, key='y2LineGraph') x_tick_format = related.StringField('YYYY-MM-DD', key='xTickFormat') remove_bar_spacing = related.BooleanField(False, key='removeBarSpacing') rotate_x_axis_labels = related.BooleanField(True, key='rotateXAxisLabels') rotate_data_value_labels = related.BooleanField(True, key='rotateDataValueLabels') hide_grid_lines = related.BooleanField(False, key='hideGridLines') hide_data_value_zeros = related.BooleanField(False, key='hideDataValueZeros')
class LayoutSize: id = related.StringField() rows = related.IntegerField() columns = related.IntegerField()
class ModiscoHParams(RelatedLoadSaveMixin): """Modisco hyper-parameters """ # Modisco kwargs sliding_window_size = related.IntegerField(21, required=False) flank_size = related.IntegerField(10, required=False) # old=5 target_seqlet_fdr = related.FloatField(0.01, required=False) min_seqlets_per_task = related.IntegerField( 1000, required=False) # NOTE - this is not used as of modisco 0.5 # Deprecated in modisco 0.5 min_passing_windows_frac = related.FloatField(0.03, required=False) max_passing_windows_frac = related.FloatField(0.2, required=False) # metaclustering min_metacluster_size = related.IntegerField(2000, required=False) min_metacluster_size_frac = related.FloatField(0.02, required=False) # seqlets_to_patterns.TfModiscoSeqletsToPatternsFactory trim_to_window_size = related.IntegerField( 30, required=False) # default: 30, old=15 initial_flank_to_add = related.IntegerField( 10, required=False) # default 10, old=5 kmer_len = related.IntegerField(8, required=False) # default 8, old=5 num_gaps = related.IntegerField(3, required=False) # default 3, old=1 num_mismatches = related.IntegerField(2, required=False) # default 2, old=0 final_min_cluster_size = related.IntegerField(60, required=False) max_seqlets_per_metacluster = related.IntegerField(20000, required=False) # Other modisc-related kwargs # What's the maximum cosine distance between strands to # still consider the examples as representative? # TODO - update back # max_strand_distance = related.FloatField(0.2, required=False) # TODO - specify for which ones to run? # Original path to the file path = related.StringField(required=False) def get_modisco_kwargs(self): d = self.get_config() d.pop('counts', None) return d