fairdm.factories.core#
Key Features#
Minimal by Default: Factories create only required fields unless explicitly requested.
Opt-In Relationships: Use keyword arguments to create descriptions/dates:
… code-block:: python
No descriptions or dates created
project = ProjectFactory()
Create 2 descriptions
project = ProjectFactory(descriptions=2)
Create specific description types, named by address
project = ProjectFactory( descriptions=2, descriptions__types=[ABSTRACT, f”{DESCRIPTION_TYPES}/introduction”], )
Vocabulary Validation: All description/date types are validated against the collection the model’s
typefield offers. Invalid types raise ValueError.Controlled Vocabularies: Default types come from that collection (e.g.,
ProjectDescription.get_type_concepts()), ensuring factories create valid test data. The vocabularies must be loaded, as the test suite does once per session.
Factories Available#
ProjectFactory- Create Project instances with optional descriptions/datesDatasetFactory- Create Dataset instances with optional descriptions/datesSampleFactory- Abstract. The base every specimen factory builds on; it cannot be instantiated directly because theSamplemodel it declares cannot be created directly either. A reference implementation lives indemo.factories(e.g.RockSampleFactory); a portal defines its own alongside its own specimen types.MeasurementFactory- Abstract. The base every measurement factory builds on; it cannot be instantiated directly because theMeasurementmodel it declares cannot be created directly either. A reference implementation lives indemo.factories(e.g.ExampleMeasurementFactory); a portal defines its own alongside its own measurement types.
Metadata Factories#
ProjectDescriptionFactory,DatasetDescriptionFactory, etc.SampleDescriptionFactory,SampleDateFactory,SampleIdentifierFactory,SampleRelationFactory
Usage Examples#
Basic creation::
project = ProjectFactory()
dataset = DatasetFactory(project=project)
from demo.factories import RockSampleFactory
sample = RockSampleFactory(dataset=dataset)
With metadata (opt-in)::
project = ProjectFactory(
descriptions=2, # Create 2 descriptions
dates=1, # Create 1 date
)
Custom types::
project = ProjectFactory(
descriptions=2,
descriptions__types=[ABSTRACT, f"{DESCRIPTION_TYPES}/objectives"],
)
Batch creation::
projects = ProjectFactory.create_batch(5, descriptions=2, dates=1)
Type validation::
# Raises ValueError - the address is not in the project description types
project = ProjectFactory(
descriptions=1, descriptions__types=[f"{DESCRIPTION_TYPES}/invalid"]
)
For more details, see:
Portal developers: docs/developers/how-to/test-a-portal-with-fairdm-factories.md
Framework contributors: docs/contributing/testing/
Factories for FairDM’s core models.
These factory_boy factories create test instances of FairDM’s core models: Project, Dataset, Sample, and Measurement. These factories follow an opt-in pattern for creating related metadata objects (descriptions and dates).
Module Contents#
Classes#
Factory for creating ProjectDescription instances. |
|
Factory for creating ProjectDate instances. |
|
Factory for creating ProjectIdentifier instances. |
|
Factory for creating Project instances. |
|
Factory for creating DatasetDescription instances. |
|
Factory for creating DatasetDate instances. |
|
Factory for creating DatasetIdentifier instances. |
|
Factory for creating literature.Item instances. |
|
Factory for creating DatasetLiteratureRelation instances. |
|
Factory for creating Dataset instances. |
|
Factory for creating SampleDescription instances. |
|
Factory for creating SampleDate instances. |
|
Factory for creating SampleIdentifier instances. |
|
Abstract factory for creating Sample instances. |
|
Factory for creating MeasurementDescription instances. |
|
Factory for creating MeasurementDate instances. |
|
Factory for creating MeasurementIdentifier instances. |
|
Abstract factory for creating Measurement instances. |
|
Factory for creating SampleRelation instances. |
API#
- class ProjectDescriptionFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating ProjectDescription instances.
- type#
None
- value#
‘Faker(…)’
- class ProjectDateFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating ProjectDate instances.
- type#
None
- value#
‘Faker(…)’
- class ProjectIdentifierFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating ProjectIdentifier instances.
- type#
None
- value#
‘Faker(…)’
- class ProjectFactory#
Bases:
factory.django.DjangoModelFactoryFactory for creating Project instances.
By default, creates a minimal Project with only required fields.
To create descriptions/dates: ProjectFactory(descriptions=2) # Creates 2 descriptions with default types ProjectFactory(descriptions=2, descriptions__types=[ABSTRACT, f”{DESCRIPTION_TYPES}/objectives”]) ProjectFactory(dates=1) # Creates 1 date with default type ProjectFactory(dates=2, dates__types=[PROJECT_START, PROJECT_END])
Image (opt-in, issue #323): ProjectFactory() # No image, no file written ProjectFactory(with_image=True) # A generated placeholder JPEG ProjectFactory(image=some_file) # That file used directly
- name#
‘Faker(…)’
- status#
‘FuzzyChoice(…)’
- funding#
‘LazyAttribute(…)’
- owner#
‘SubFactory(…)’
- descriptions(create, extracted, **kwargs)#
Create descriptions. Pass count as int and optionally types via descriptions__types.
- dates(create, extracted, **kwargs)#
Create dates. Pass count as int and optionally types via dates__types.
- class DatasetDescriptionFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating DatasetDescription instances.
- type#
None
- value#
‘Faker(…)’
- class DatasetDateFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating DatasetDate instances.
- type#
None
- value#
‘Faker(…)’
- class DatasetIdentifierFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating DatasetIdentifier instances.
- type#
None
- value#
‘Sequence(…)’
- class LiteratureItemFactory#
Bases:
factory.django.DjangoModelFactoryFactory for creating literature.Item instances.
The item is built from a CSL JSON dictionary with
literature.converters.from_csl_json, so the DOI, the issued year and the authors are stored as the package stores them.Args: citation_key: The reference’s key. A unique sequence by default. title: The title. Derived from the citation key by default. type: The CSL item type.
article-journalby default. doi: A DOI to store as an identifier. year: The year of the issued date. authors:(family, given)pairs, in order.- citation_key#
‘Sequence(…)’
- type#
‘article-journal’
- title#
‘LazyAttribute(…)’
- doi#
None
- year#
None
- authors#
()
- class DatasetLiteratureRelationFactory#
Bases:
factory.django.DjangoModelFactoryFactory for creating DatasetLiteratureRelation instances.
Relates a dataset to a literature item under a DataCite relationship type.
- dataset#
‘SubFactory(…)’
- literature_item#
‘SubFactory(…)’
- relationship_type#
‘IsCitedBy’
- class DatasetFactory#
Bases:
factory.django.DjangoModelFactoryFactory for creating Dataset instances.
By default, creates a minimal Dataset with only required fields. Project is auto-created unless provided.
To create descriptions/dates: DatasetFactory(descriptions=2) # Creates 2 descriptions DatasetFactory(descriptions=2, descriptions__types=[ABSTRACT, f”{DESCRIPTION_TYPES}/methods”]) DatasetFactory(dates=1) # Creates 1 date
Image (opt-in, issue #323): same as ProjectFactory above.
- name#
‘Faker(…)’
- project#
‘SubFactory(…)’
- license()#
Use the portal’s default licence, creating it when it does not exist yet.
Never the first licence by name: where “CC0 1.0” sorts against “CC BY 4.0” depends on the database’s collation.
- descriptions(create, extracted, **kwargs)#
Create descriptions. Pass count as int and optionally types via descriptions__types.
- dates(create, extracted, **kwargs)#
Create dates. Pass count as int and optionally types via dates__types.
- class SampleDescriptionFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating SampleDescription instances.
- type#
None
- value#
‘Faker(…)’
- class SampleDateFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating SampleDate instances.
- type#
None
- value#
‘Faker(…)’
- class SampleIdentifierFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating SampleIdentifier instances.
- type#
None
- value#
‘Sequence(…)’
- class SampleFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryAbstract factory for creating Sample instances.
Sampleis a polymorphic base that cannot be created directly (only a registered specimen type can be) - seefairdm.core.sample.models.Sample’spre_saveguard. This factory declares the fields every specimen shares and is meant to be subclassed, never instantiated on its own. The framework’s reference implementation supplies concrete subclasses indemo.factories(RockSampleFactory,WaterSampleFactory,SoilSampleFactory, …); a portal defines its own alongside its own specimen types.To create descriptions/dates on a concrete subclass: RockSampleFactory(descriptions=2) RockSampleFactory(dates=1)
- name#
‘Faker(…)’
- local_id#
‘Faker(…)’
- dataset#
‘SubFactory(…)’
- location#
None
- descriptions(create, extracted, **kwargs)#
Create descriptions. Pass count as int and optionally types via descriptions__types.
- dates(create, extracted, **kwargs)#
Create dates. Pass count as int and optionally types via dates__types.
- class MeasurementDescriptionFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating MeasurementDescription instances.
- type#
None
- value#
‘Faker(…)’
- class MeasurementDateFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating MeasurementDate instances.
- type#
None
- value#
‘Faker(…)’
- class MeasurementIdentifierFactory#
Bases:
fairdm.factories.utils.ConceptFieldFactoryFactory for creating MeasurementIdentifier instances.
- type#
None
- value#
‘Sequence(…)’
- class MeasurementFactory#
Bases:
factory.django.DjangoModelFactoryAbstract factory for creating Measurement instances.
Measurementis a polymorphic base that cannot be created directly (only a registered measurement type can be) - seefairdm.core.measurement.models.Measurement’scleanguard. This factory declares the fields every measurement shares and is meant to be subclassed, never instantiated on its own. The framework’s reference implementation supplies concrete subclasses indemo.factories(ExampleMeasurementFactory,XRFMeasurementFactory,ICP_MS_MeasurementFactory, …); a portal defines its own alongside its own measurement types.By default, creates a minimal Measurement with only required fields. Dataset is auto-created if not provided, but
samplehas no default and must always be passed explicitly:Sampleis a polymorphic base that cannot be created directly, and this factory has no concrete specimen type of its own to fall back on (seeSampleFactory). Pass a concrete specimen instance, e.g.XRFMeasurementFactory(sample=RockSampleFactory()).To create descriptions/dates on a concrete subclass: ExampleMeasurementFactory(sample=some_sample, descriptions=2) ExampleMeasurementFactory(sample=some_sample, dates=1)
- name#
‘Faker(…)’
- dataset#
‘SubFactory(…)’
- descriptions(create, extracted, **kwargs)#
Create descriptions. Pass count as int and optionally types via descriptions__types.
- dates(create, extracted, **kwargs)#
Create dates. Pass count as int and optionally types via dates__types.
- class SampleRelationFactory#
Bases:
factory.django.DjangoModelFactoryFactory for creating SampleRelation instances.
Creates a typed relationship between two samples.
sourceandtargethave no default and must always be provided - both are concrete specimens, andSample(the classSampleFactorydeclares) cannot be created directly. Pass concrete specimen instances, e.g.SampleRelationFactory(source=RockSampleFactory(), target=parent).- type#
‘child_of’