Skip to content

Commit 2aa56ae

Browse files
committed
Bump version to 1.0.3
- Update readme description - update validator - refactor tests
1 parent 8448e5b commit 2aa56ae

File tree

6 files changed

+53
-57
lines changed

6 files changed

+53
-57
lines changed

README.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ from db import session
5050
entities = load_entities_from_json('tests/test_data.json')
5151

5252
# Initializing Seeder
53-
seeder = Seeder() # or Seeder(session)
53+
seeder = Seeder() # or Seeder(session),
5454

5555
# Seeding
5656
seeder.session = session # assign session if no session assigned before seeding
@@ -62,12 +62,11 @@ session.commit() # or seeder.session.commit()
6262

6363
## Seeder vs. HybridSeeder
6464

65-
| Features & Options | Seeder | HybridSeeder |
66-
| :--------------------------------------------------------------------- | :----------------- | :----------------- |
67-
| Support `model` and `data` keys | :heavy_check_mark: | :heavy_check_mark: |
68-
| Support `model` and `filter` keys | :x: | :heavy_check_mark: |
69-
| Optional argument `add_to_session=False` in the `seed` method | :heavy_check_mark: | :x: |
70-
| Assign existing objects from session or db to a relationship attribute | :x: | :heavy_check_mark: |
65+
| Features & Options | Seeder | HybridSeeder |
66+
| :------------------------------------------------------------ | :----------------- | :----------------- |
67+
| Support `model` and `data` keys | :heavy_check_mark: | :heavy_check_mark: |
68+
| Support `model` and `filter` keys | :x: | :heavy_check_mark: |
69+
| Optional argument `add_to_session=False` in the `seed` method | :heavy_check_mark: | :x: |
7170

7271
## When to use HybridSeeder and 'filter' key field?
7372

@@ -81,7 +80,7 @@ from db import session
8180
data = {
8281
"model": "models.Parent",
8382
"data": {
84-
"!child": {
83+
"!child": { # '!' is the reference prefix
8584
"model": "models.Child",
8685
"filter": {
8786
"age": 5
@@ -91,15 +90,17 @@ data = {
9190
}
9291

9392
# When seeding instances that has 'filter' key, then use HybridSeeder, otherwise use Seeder.
94-
seeder = HybridSeeder(session)
93+
# ref_prefix can be changed according to your needs, defaults to '!'
94+
seeder = HybridSeeder(session, ref_prefix='!')
9595
seeder.seed(data)
9696

9797
session.commit() # or seeder.sesssion.commit()
9898
```
9999

100100
## Relationships
101101

102-
In adding a relationship attribute, add prefix **!** to the key in order to identify it.
102+
In adding a reference attribute, add prefix **!** or to the key in order to identify it.
103+
If you want '@' as prefix, you can just specify it to what seeder you use by adding ref_prefix='@' in the argument when instantiating the seeder in order for the seeder to identify the referencing attributes
103104

104105
### Referencing relationship object or a foreign key
105106

@@ -122,7 +123,7 @@ instance = [
122123
'name': 'John Smith',
123124
# foreign key attribute
124125
'!company_id': {
125-
'model': 'tests.models.Company',
126+
'model': 'tests.models.Company', # models can be removed if it is a referencing attribute
126127
'filter': {
127128
'name': 'MyCompany'
128129
}
@@ -132,7 +133,7 @@ instance = [
132133
'name': 'Juan Dela Cruz',
133134
# relationship attribute
134135
'!company': {
135-
'model': 'tests.models.Company',
136+
'model': 'tests.models.Company', # models can be removed if it is a referencing attribute
136137
'filter': {
137138
'name': 'MyCompany'
138139
}
@@ -143,6 +144,7 @@ instance = [
143144

144145
seeder = HybridSeeder(session)
145146
seeder.seed(instance)
147+
seeder.session.commit() # or session.commit()
146148
```
147149

148150
### No Relationship
@@ -267,7 +269,7 @@ seeder.seed(instance)
267269
}
268270
```
269271

270-
## Examples
272+
## File Input Examples
271273

272274
### JSON
273275

TODO.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
overridden by providing a model data instead as it saves performance time
1111
- [x] Add test case for overriding default reference prefix
1212
- [ ] Update README description
13-
- [ ] add docstrings
13+
- [ ] Add docstrings
1414
- [ ] Refactor test instances and test cases
1515

1616
## Tentative Plans
1717

18-
- load entities from excel support
19-
- add docs
18+
- Support load entities from excel
19+
- Add docs

src/sqlalchemyseed/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from .loader import load_entities_from_csv
3030

3131

32-
__version__ = "1.0.2"
32+
__version__ = "1.0.3"
3333

3434
if __name__ == '__main__':
3535
pass

src/sqlalchemyseed/validator.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
SOFTWARE.
2323
"""
2424

25-
import abc
2625
from . import errors, util
2726

2827

@@ -106,18 +105,13 @@ def check_data_type(item, source_key: Key):
106105
f"Invalid type_, '{source_key.name}' should be '{source_key.type_}'")
107106

108107

109-
class SchemaValidator(abc.ABC):
108+
class SchemaValidator:
110109

111110
def __init__(self, source_keys, ref_prefix):
112111
self._source_keys = source_keys
113112
self._ref_prefix = ref_prefix
114113

115-
@classmethod
116-
def validate(cls, entities, source_keys, ref_prefix='!'):
117-
self = cls(source_keys, ref_prefix)
118-
self._source_keys = source_keys
119-
self._ref_prefix = ref_prefix
120-
114+
def validate(self, entities):
121115
self._pre_validate(entities, entity_is_parent=True)
122116

123117
def _pre_validate(self, entities: dict, entity_is_parent=True):
@@ -158,11 +152,12 @@ def check_attributes(self, source_data: dict):
158152

159153

160154
def validate(entities, ref_prefix='!'):
161-
SchemaValidator.validate(
162-
entities, ref_prefix=ref_prefix, source_keys=[Key.data()])
155+
156+
SchemaValidator(source_keys=[Key.data()], ref_prefix=ref_prefix) \
157+
.validate(entities=entities)
163158

164159

165160
def hybrid_validate(entities, ref_prefix='!'):
166-
SchemaValidator.validate(entities,
167-
ref_prefix=ref_prefix,
168-
source_keys=[Key.data(), Key.filter()])
161+
162+
SchemaValidator(source_keys=[Key.data(), Key.filter()], ref_prefix=ref_prefix) \
163+
.validate(entities=entities)

tests/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ class GrandChild(Base):
6262
parent_id = Column(Integer, ForeignKey('children.id'))
6363

6464

65+
66+
class Person(Base):
67+
__tablename__ = 'persons'
68+
69+
id = Column(Integer, primary_key=True)
70+
name = Column(String(50))
71+
72+
6573
not_class = 'this is not a class'
6674

6775

tests/test_validator.py

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from sqlalchemyseed import validator
33

44
from src.sqlalchemyseed import errors
5-
from src.sqlalchemyseed.validator import SchemaValidator, Key
5+
from src.sqlalchemyseed.validator import SchemaValidator, Key, hybrid_validate
66
from tests import instances as ins
77

88

@@ -11,72 +11,63 @@ def setUp(self) -> None:
1111
self.source_keys = [Key.data()]
1212

1313
def test_parent(self):
14-
self.assertIsNone(SchemaValidator.validate(
15-
ins.PARENT, source_keys=self.source_keys))
14+
self.assertIsNone(hybrid_validate(ins.PARENT))
1615

1716
def test_parent_invalid(self):
1817
self.assertRaises(errors.InvalidTypeError,
19-
lambda: SchemaValidator.validate(ins.PARENT_INVALID, source_keys=self.source_keys))
18+
lambda: hybrid_validate(ins.PARENT_INVALID))
2019

2120
def test_parent_empty(self):
22-
self.assertIsNone(SchemaValidator.validate(
23-
ins.PARENT_EMPTY, source_keys=self.source_keys))
21+
self.assertIsNone(hybrid_validate(ins.PARENT_EMPTY))
2422

2523
def test_parent_empty_data_list_invalid(self):
2624
self.assertRaises(errors.EmptyDataError,
27-
lambda: SchemaValidator.validate(ins.PARENT_EMPTY_DATA_LIST_INVALID, source_keys=self.source_keys))
25+
lambda: hybrid_validate(ins.PARENT_EMPTY_DATA_LIST_INVALID))
2826

2927
def test_parent_missing_model_invalid(self):
3028
self.assertRaises(errors.MissingKeyError,
31-
lambda: SchemaValidator.validate(ins.PARENT_MISSING_MODEL_INVALID, source_keys=self.source_keys))
29+
lambda: hybrid_validate(ins.PARENT_MISSING_MODEL_INVALID))
3230

3331
def test_parent_invalid_model_invalid(self):
3432
self.assertRaises(errors.InvalidTypeError,
35-
lambda: SchemaValidator.validate(ins.PARENT_INVALID_MODEL_INVALID, source_keys=self.source_keys))
33+
lambda: hybrid_validate(ins.PARENT_INVALID_MODEL_INVALID))
3634

3735
def test_parent_with_extra_length_invalid(self):
3836
self.assertRaises(errors.MaxLengthExceededError,
39-
lambda: SchemaValidator.validate(ins.PARENT_WITH_EXTRA_LENGTH_INVALID, source_keys=self.source_keys))
37+
lambda: hybrid_validate(ins.PARENT_WITH_EXTRA_LENGTH_INVALID))
4038

4139
def test_parent_with_empty_data(self):
42-
self.assertIsNone(SchemaValidator.validate(
43-
ins.PARENT_WITH_EMPTY_DATA, source_keys=self.source_keys))
40+
self.assertIsNone(hybrid_validate(ins.PARENT_WITH_EMPTY_DATA))
4441

4542
def test_parent_with_multi_data(self):
46-
self.assertIsNone(SchemaValidator.validate(
47-
ins.PARENT_WITH_MULTI_DATA, source_keys=self.source_keys))
43+
self.assertIsNone(hybrid_validate(ins.PARENT_WITH_MULTI_DATA))
4844

4945
def test_parent_without_data_invalid(self):
5046
self.assertRaises(errors.MissingKeyError,
51-
lambda: SchemaValidator.validate(ins.PARENT_WITHOUT_DATA_INVALID, source_keys=self.source_keys))
47+
lambda: hybrid_validate(ins.PARENT_WITHOUT_DATA_INVALID))
5248

5349
def test_parent_with_data_and_invalid_data_invalid(self):
5450
self.assertRaises(errors.InvalidTypeError,
55-
lambda: SchemaValidator.validate(ins.PARENT_WITH_DATA_AND_INVALID_DATA_INVALID, source_keys=self.source_keys))
51+
lambda: hybrid_validate(ins.PARENT_WITH_DATA_AND_INVALID_DATA_INVALID))
5652

5753
def test_parent_with_invalid_data_invalid(self):
5854
self.assertRaises(errors.InvalidTypeError,
59-
lambda: SchemaValidator.validate(ins.PARENT_WITH_INVALID_DATA_INVALID, source_keys=self.source_keys))
55+
lambda: hybrid_validate(ins.PARENT_WITH_INVALID_DATA_INVALID))
6056

6157
def test_parent_to_child(self):
62-
self.assertIsNone(SchemaValidator.validate(
63-
ins.PARENT_TO_CHILD, source_keys=self.source_keys))
58+
self.assertIsNone(hybrid_validate(ins.PARENT_TO_CHILD))
6459

6560
def test_parent_to_children(self):
66-
self.assertIsNone(SchemaValidator.validate(
67-
ins.PARENT_TO_CHILDREN, source_keys=self.source_keys))
61+
self.assertIsNone(hybrid_validate(ins.PARENT_TO_CHILDREN))
6862

6963
def test_parent_to_children_without_model(self):
70-
self.assertIsNone(SchemaValidator.validate(
71-
ins.PARENT_TO_CHILDREN_WITHOUT_MODEL, source_keys=self.source_keys))
64+
self.assertIsNone(hybrid_validate(ins.PARENT_TO_CHILDREN_WITHOUT_MODEL))
7265

7366
def test_parent_to_children_with_multi_data(self):
74-
self.assertIsNone(SchemaValidator.validate(
75-
ins.PARENT_TO_CHILDREN_WITH_MULTI_DATA, source_keys=self.source_keys))
67+
self.assertIsNone(hybrid_validate(ins.PARENT_TO_CHILDREN_WITH_MULTI_DATA))
7668

7769
def test_parent_to_children_with_multi_data_without_model(self):
78-
self.assertIsNone(SchemaValidator.validate(
79-
ins.PARENT_TO_CHILDREN_WITH_MULTI_DATA_WITHOUT_MODEL, source_keys=self.source_keys))
70+
self.assertIsNone(hybrid_validate(ins.PARENT_TO_CHILDREN_WITH_MULTI_DATA_WITHOUT_MODEL))
8071

8172

8273
class TestKey(unittest.TestCase):

0 commit comments

Comments
 (0)