tibiawikisql 6.2.0__tar.gz → 7.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. {tibiawikisql-6.2.0/tibiawikisql.egg-info → tibiawikisql-7.0.0}/PKG-INFO +33 -17
  2. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/README.md +1 -4
  3. tibiawikisql-7.0.0/pyproject.toml +162 -0
  4. tibiawikisql-7.0.0/requirements-docs.txt +7 -0
  5. tibiawikisql-7.0.0/requirements-server.txt +1 -0
  6. tibiawikisql-7.0.0/requirements-testing.txt +3 -0
  7. tibiawikisql-6.2.0/tibiawikisql.egg-info/requires.txt → tibiawikisql-7.0.0/requirements.txt +2 -3
  8. tibiawikisql-7.0.0/setup.cfg +4 -0
  9. tibiawikisql-7.0.0/tests/test_generation.py +124 -0
  10. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tests/tests_models.py +38 -36
  11. tibiawikisql-7.0.0/tests/tests_parsers.py +23 -0
  12. tibiawikisql-7.0.0/tests/tests_schema.py +70 -0
  13. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tests/tests_utils.py +23 -1
  14. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tests/tests_wikiapi.py +26 -20
  15. tibiawikisql-7.0.0/tibiawikisql/__init__.py +7 -0
  16. tibiawikisql-7.0.0/tibiawikisql/__main__.py +34 -0
  17. tibiawikisql-7.0.0/tibiawikisql/api.py +260 -0
  18. tibiawikisql-7.0.0/tibiawikisql/database.py +490 -0
  19. tibiawikisql-7.0.0/tibiawikisql/errors.py +87 -0
  20. tibiawikisql-7.0.0/tibiawikisql/generation.py +684 -0
  21. tibiawikisql-7.0.0/tibiawikisql/models/__init__.py +15 -0
  22. tibiawikisql-7.0.0/tibiawikisql/models/achievement.py +25 -0
  23. tibiawikisql-7.0.0/tibiawikisql/models/base.py +169 -0
  24. tibiawikisql-7.0.0/tibiawikisql/models/charm.py +16 -0
  25. tibiawikisql-7.0.0/tibiawikisql/models/creature.py +313 -0
  26. tibiawikisql-7.0.0/tibiawikisql/models/house.py +37 -0
  27. tibiawikisql-7.0.0/tibiawikisql/models/imbuement.py +91 -0
  28. tibiawikisql-7.0.0/tibiawikisql/models/item.py +441 -0
  29. tibiawikisql-7.0.0/tibiawikisql/models/mount.py +26 -0
  30. tibiawikisql-7.0.0/tibiawikisql/models/npc.py +242 -0
  31. tibiawikisql-7.0.0/tibiawikisql/models/outfit.py +111 -0
  32. tibiawikisql-7.0.0/tibiawikisql/models/quest.py +208 -0
  33. tibiawikisql-7.0.0/tibiawikisql/models/spell.py +100 -0
  34. tibiawikisql-7.0.0/tibiawikisql/models/update.py +28 -0
  35. tibiawikisql-7.0.0/tibiawikisql/models/world.py +36 -0
  36. tibiawikisql-7.0.0/tibiawikisql/parsers/__init__.py +16 -0
  37. tibiawikisql-7.0.0/tibiawikisql/parsers/achievement.py +26 -0
  38. tibiawikisql-7.0.0/tibiawikisql/parsers/base.py +216 -0
  39. tibiawikisql-7.0.0/tibiawikisql/parsers/book.py +27 -0
  40. tibiawikisql-7.0.0/tibiawikisql/parsers/charm.py +22 -0
  41. tibiawikisql-7.0.0/tibiawikisql/parsers/creature.py +285 -0
  42. tibiawikisql-7.0.0/tibiawikisql/parsers/house.py +32 -0
  43. tibiawikisql-7.0.0/tibiawikisql/parsers/imbuement.py +117 -0
  44. tibiawikisql-7.0.0/tibiawikisql/parsers/item.py +192 -0
  45. tibiawikisql-7.0.0/tibiawikisql/parsers/key.py +24 -0
  46. tibiawikisql-7.0.0/tibiawikisql/parsers/mount.py +39 -0
  47. tibiawikisql-7.0.0/tibiawikisql/parsers/npc.py +107 -0
  48. tibiawikisql-7.0.0/tibiawikisql/parsers/outfit.py +51 -0
  49. tibiawikisql-7.0.0/tibiawikisql/parsers/quest.py +79 -0
  50. tibiawikisql-7.0.0/tibiawikisql/parsers/spell.py +51 -0
  51. tibiawikisql-7.0.0/tibiawikisql/parsers/update.py +26 -0
  52. tibiawikisql-7.0.0/tibiawikisql/parsers/world.py +30 -0
  53. tibiawikisql-7.0.0/tibiawikisql/schema.py +781 -0
  54. tibiawikisql-7.0.0/tibiawikisql/server.py +208 -0
  55. tibiawikisql-7.0.0/tibiawikisql/utils.py +421 -0
  56. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0/tibiawikisql.egg-info}/PKG-INFO +33 -17
  57. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tibiawikisql.egg-info/SOURCES.txt +29 -7
  58. tibiawikisql-7.0.0/tibiawikisql.egg-info/entry_points.txt +2 -0
  59. tibiawikisql-7.0.0/tibiawikisql.egg-info/requires.txt +24 -0
  60. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tibiawikisql.egg-info/top_level.txt +0 -1
  61. tibiawikisql-6.2.0/CHANGELOG.rst +0 -370
  62. tibiawikisql-6.2.0/requirements.txt +0 -5
  63. tibiawikisql-6.2.0/setup.cfg +0 -27
  64. tibiawikisql-6.2.0/setup.py +0 -64
  65. tibiawikisql-6.2.0/tests/__init__.py +0 -9
  66. tibiawikisql-6.2.0/tests/test_models_utils.py +0 -86
  67. tibiawikisql-6.2.0/tibiawikisql/__init__.py +0 -24
  68. tibiawikisql-6.2.0/tibiawikisql/__main__.py +0 -569
  69. tibiawikisql-6.2.0/tibiawikisql/api.py +0 -332
  70. tibiawikisql-6.2.0/tibiawikisql/database.py +0 -321
  71. tibiawikisql-6.2.0/tibiawikisql/models/__init__.py +0 -30
  72. tibiawikisql-6.2.0/tibiawikisql/models/abc.py +0 -261
  73. tibiawikisql-6.2.0/tibiawikisql/models/achievement.py +0 -84
  74. tibiawikisql-6.2.0/tibiawikisql/models/charm.py +0 -75
  75. tibiawikisql-6.2.0/tibiawikisql/models/creature.py +0 -801
  76. tibiawikisql-6.2.0/tibiawikisql/models/house.py +0 -108
  77. tibiawikisql-6.2.0/tibiawikisql/models/imbuement.py +0 -248
  78. tibiawikisql-6.2.0/tibiawikisql/models/item.py +0 -701
  79. tibiawikisql-6.2.0/tibiawikisql/models/mount.py +0 -104
  80. tibiawikisql-6.2.0/tibiawikisql/models/npc.py +0 -728
  81. tibiawikisql-6.2.0/tibiawikisql/models/outfit.py +0 -233
  82. tibiawikisql-6.2.0/tibiawikisql/models/quest.py +0 -253
  83. tibiawikisql-6.2.0/tibiawikisql/models/spell.py +0 -156
  84. tibiawikisql-6.2.0/tibiawikisql/models/update.py +0 -82
  85. tibiawikisql-6.2.0/tibiawikisql/models/world.py +0 -96
  86. tibiawikisql-6.2.0/tibiawikisql/schema.py +0 -474
  87. tibiawikisql-6.2.0/tibiawikisql/utils.py +0 -423
  88. tibiawikisql-6.2.0/tibiawikisql.egg-info/entry_points.txt +0 -4
  89. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/LICENSE +0 -0
  90. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/MANIFEST.in +0 -0
  91. {tibiawikisql-6.2.0 → tibiawikisql-7.0.0}/tibiawikisql.egg-info/dependency_links.txt +0 -0
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: tibiawikisql
3
- Version: 6.2.0
3
+ Version: 7.0.0
4
4
  Summary: Python script that generates a SQLite database from TibiaWiki articles
5
- Home-page: https://github.com/Galarzaa90/tibiawiki-sql
6
- Author: Galarzaa90
7
- Author-email: allan.galarza@gmail.com
5
+ Author-email: Allan Galarza <allan.galarza@gmail.com>
6
+ Maintainer-email: Allan Galarza <allan.galarza@gmail.com>
8
7
  License: Apache 2.0
9
- Platform: UNKNOWN
8
+ Project-URL: Homepage, https://github.com/Galarzaa90/tibiawiki-sql
10
9
  Classifier: Development Status :: 5 - Production/Stable
11
10
  Classifier: Environment :: Console
12
11
  Classifier: Intended Audience :: Developers
@@ -15,18 +14,40 @@ Classifier: Natural Language :: English
15
14
  Classifier: Operating System :: OS Independent
16
15
  Classifier: Programming Language :: Python
17
16
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Classifier: Programming Language :: Python :: 3.6
19
- Classifier: Programming Language :: Python :: 3.7
20
- Classifier: Programming Language :: Python :: 3.8
21
- Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
22
21
  Classifier: Programming Language :: SQL
23
22
  Classifier: Topic :: Database
24
23
  Classifier: Topic :: Games/Entertainment :: Role-Playing
25
24
  Classifier: Topic :: Internet
26
25
  Classifier: Topic :: Utilities
26
+ Requires-Python: >=3.10
27
27
  Description-Content-Type: text/markdown
28
- Provides-Extra: docs
29
28
  License-File: LICENSE
29
+ Requires-Dist: requests
30
+ Requires-Dist: click
31
+ Requires-Dist: colorama
32
+ Requires-Dist: mwparserfromhell
33
+ Requires-Dist: lupa
34
+ Requires-Dist: pydantic
35
+ Requires-Dist: PyPika
36
+ Provides-Extra: docs
37
+ Requires-Dist: griffe-inherited-docstrings; extra == "docs"
38
+ Requires-Dist: docstring-inheritance; extra == "docs"
39
+ Requires-Dist: griffe-pydantic; extra == "docs"
40
+ Requires-Dist: griffe-generics; extra == "docs"
41
+ Requires-Dist: mkdocs-material; extra == "docs"
42
+ Requires-Dist: mkdocstrings[python]; extra == "docs"
43
+ Requires-Dist: ruff; extra == "docs"
44
+ Provides-Extra: testing
45
+ Requires-Dist: coverage; extra == "testing"
46
+ Requires-Dist: ruff; extra == "testing"
47
+ Requires-Dist: polyfactory; extra == "testing"
48
+ Provides-Extra: server
49
+ Requires-Dist: fastapi; extra == "server"
50
+ Dynamic: license-file
30
51
 
31
52
  # tibiawiki-sql
32
53
 
@@ -50,10 +71,7 @@ If you integrate this into your project or use the generated data, make sure to
50
71
  ![PyPI - License](https://img.shields.io/pypi/l/tibiawikisql.svg)
51
72
 
52
73
  ## Requirements
53
- * Python 3.6 or higher
54
- * **requests** module
55
- * **click** module
56
- * **colorama** module
74
+ * Python 3.10 or higher
57
75
 
58
76
  ## Installing
59
77
  To install the latest version on PyPi:
@@ -128,5 +146,3 @@ For questions, suggestions and bug reports, submit an issue.
128
146
  The best way to contribute to this project is by contributing to [TibiaWiki](https://tibia.fandom.com).
129
147
 
130
148
  ![image](https://vignette.wikia.nocookie.net/tibia/images/d/d9/Tibiawiki_Small.gif/revision/latest?cb=20150129101832&path-prefix=en)
131
-
132
-
@@ -20,10 +20,7 @@ If you integrate this into your project or use the generated data, make sure to
20
20
  ![PyPI - License](https://img.shields.io/pypi/l/tibiawikisql.svg)
21
21
 
22
22
  ## Requirements
23
- * Python 3.6 or higher
24
- * **requests** module
25
- * **click** module
26
- * **colorama** module
23
+ * Python 3.10 or higher
27
24
 
28
25
  ## Installing
29
26
  To install the latest version on PyPi:
@@ -0,0 +1,162 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+
6
+ [tool.setuptools.packages.find]
7
+ include = [
8
+ "tibiawikisql*",
9
+ ]
10
+
11
+ [project]
12
+ name = "tibiawikisql"
13
+ dynamic = ["version", "dependencies", "optional-dependencies"]
14
+ authors = [
15
+ { name = "Allan Galarza", email = "allan.galarza@gmail.com" }
16
+ ]
17
+ maintainers = [
18
+ { name = "Allan Galarza", email = "allan.galarza@gmail.com" }
19
+ ]
20
+ license = { text = 'Apache 2.0' }
21
+ description = "Python script that generates a SQLite database from TibiaWiki articles"
22
+ requires-python = '>=3.10'
23
+ readme = "README.md"
24
+ classifiers = [
25
+ "Development Status :: 5 - Production/Stable",
26
+ "Environment :: Console",
27
+ "Intended Audience :: Developers",
28
+ "License :: OSI Approved :: Apache Software License",
29
+ "Natural Language :: English",
30
+ "Operating System :: OS Independent",
31
+ "Programming Language :: Python",
32
+ "Programming Language :: Python :: 3 :: Only",
33
+ "Programming Language :: Python :: 3.10",
34
+ "Programming Language :: Python :: 3.11",
35
+ "Programming Language :: Python :: 3.12",
36
+ "Programming Language :: Python :: 3.13",
37
+ "Programming Language :: SQL",
38
+ "Topic :: Database",
39
+ "Topic :: Games/Entertainment :: Role-Playing",
40
+ "Topic :: Internet",
41
+ "Topic :: Utilities",
42
+ ]
43
+
44
+ [project.urls]
45
+ "Homepage" = "https://github.com/Galarzaa90/tibiawiki-sql"
46
+
47
+ [project.scripts]
48
+ tibiawikisql = "tibiawikisql.__main__:cli"
49
+
50
+ [tool.setuptools.dynamic]
51
+ version = { attr = "tibiawikisql.__version__" }
52
+ dependencies = { file = ["requirements.txt"] }
53
+
54
+ [tool.setuptools.dynamic.optional-dependencies]
55
+ docs = { file = ["requirements-docs.txt"] }
56
+ testing = { file = ["requirements-testing.txt"] }
57
+ server = { file = ["requirements-server.txt"] }
58
+
59
+ [tool.ruff]
60
+ exclude = [
61
+ "__pycache__",
62
+ ".git/",
63
+ "build/",
64
+ ".idea/",
65
+ "venv/",
66
+ ".venv/",
67
+ "docs/",
68
+ "images/",
69
+ "logs/",
70
+ "tibiawikisql/__main__.py",
71
+ "tibiawikisql/server.py",
72
+ ]
73
+
74
+
75
+ [tool.ruff.lint]
76
+ select = [
77
+ "A", # flake8-builtins
78
+ "ANN", # flake8-annotations
79
+ "ARG", # flake8-unused-arguments
80
+ "B", # flake8-bugbear
81
+ "BLE", # flake8-blind-except
82
+ "C4", # flake8-comprehensions
83
+ "COM", # flake8-commas
84
+ "D", # pydocstyle
85
+ "DOC", # pydoclint
86
+ "DTZ", # flake8-datetimez
87
+ "E", "W", # pycodestyle
88
+ "EM", # flake8-errmsg
89
+ "ERA", # eradicate
90
+ "F", # Pyflakes
91
+ "FA", # flake8-future-annotations
92
+ "FLY", # flynt
93
+ "FURB", # refurb"
94
+ "G", # flake8-logging-format
95
+ "ICN", # flake8-import-conventions
96
+ "INP", # flake8-no-pep420
97
+ "ISC", # flake8-implicit-str-concat
98
+ "LOG", # flake8-logging
99
+ "N", # pep8-naming
100
+ "PERF", # Perflint
101
+ "PIE", # flake8-pie
102
+ "PL", # Pylint
103
+ "Q", # flake8-quotes
104
+ "RET", # flake8-return
105
+ "RSE", # flake8-raise
106
+ "RUF", # Ruff-specific rules
107
+ "S", # flake8-bandit
108
+ "SIM", # flake8-simplify
109
+ "SLF", # flake8-self
110
+ "SLOT", # flake8-slots
111
+ "T10", # flake8-debugger
112
+ "T20", # flake8-print
113
+ "TC", # refurb
114
+ "TID", # flake8-tidy-imports
115
+ "UP", # pyupgrade
116
+ "YTT", # flake8-2020
117
+ ]
118
+ ignore = [
119
+ "ANN401", # Dynamically typed expressions (typing.Any) are disallowed in {name}
120
+ "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable
121
+ "PLR0913", # Too many arguments in function definition ({c_args} > {max_args})
122
+ "D105", # Missing docstring in magic method
123
+ "PERF203", # `try`-`except` within a loop incurs performance overhead
124
+ ]
125
+
126
+ [tool.ruff.lint.per-file-ignores]
127
+ "tests/**/*" = ["D", "ANN201", "SLF001"]
128
+ "**/models/*" = ["D100"]
129
+
130
+ [tool.ruff.lint.pycodestyle]
131
+ max-line-length = 120
132
+
133
+ [tool.ruff.lint.pydocstyle]
134
+ convention = "google"
135
+
136
+ [tool.ruff.lint.pep8-naming]
137
+ extend-ignore-names = ["assert*"]
138
+
139
+
140
+ [tool.ruff.lint.flake8-type-checking]
141
+ runtime-evaluated-base-classes = ["pydantic.BaseModel"]
142
+
143
+
144
+ [tool.coverage.run]
145
+ include = ["tibiawikisql/**/*.py"]
146
+
147
+ [tool.coverage.report]
148
+ exclude_lines = [
149
+ "pragma: no cover",
150
+ "if __name__ == .__main__.:",
151
+ "def __repr__",
152
+ "def __eq__",
153
+ "def __len__",
154
+ "def __lt__",
155
+ "def __gt__",
156
+ "def __ne__",
157
+ "raise NotImplementedError",
158
+ "if TYPE_CHECKING:"
159
+ ]
160
+
161
+ [tool.ruff.lint.flake8-tidy-imports.banned-api]
162
+ "typing.Self".msg = "Use typing_extensions.Self instead."
@@ -0,0 +1,7 @@
1
+ griffe-inherited-docstrings
2
+ docstring-inheritance
3
+ griffe-pydantic
4
+ griffe-generics
5
+ mkdocs-material
6
+ mkdocstrings[python]
7
+ ruff
@@ -0,0 +1 @@
1
+ fastapi
@@ -0,0 +1,3 @@
1
+ coverage
2
+ ruff
3
+ polyfactory
@@ -3,6 +3,5 @@ click
3
3
  colorama
4
4
  mwparserfromhell
5
5
  lupa
6
-
7
- [docs]
8
- Sphinx
6
+ pydantic
7
+ PyPika
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,124 @@
1
+ import unittest
2
+
3
+ from tibiawikisql.generation import parse_spell_data
4
+
5
+
6
+ class TestGeneration(unittest.TestCase):
7
+ def test_parse_spell_data(self):
8
+ # language=lua
9
+ content = """return {
10
+ ["Animate Dead"] = {
11
+ ["vocation"] = {"Druid", "Sorcerer"},
12
+ ["level"] = 27,
13
+ ["price"] = 1200,
14
+ ["sellers"] = {
15
+ ["Azalea"] = "Druid",
16
+ ["Barnabas Dee"] = "Sorcerer",
17
+ ["Charlotta"] = "Druid",
18
+ ["Gundralph"] = true,
19
+ ["Hjaern"] = "Druid",
20
+ ["Malunga"] = "Sorcerer",
21
+ ["Myra"] = "Sorcerer",
22
+ ["Rahkem"] = "Druid",
23
+ ["Romir"] = "Sorcerer",
24
+ ["Shalmar"] = true,
25
+ ["Tamara"] = "Druid",
26
+ ["Tamoril"] = "Sorcerer",
27
+ ["Tothdral"] = "Sorcerer",
28
+ ["Ustan"] = "Druid"
29
+ }
30
+ },
31
+ ["Annihilation"] = {
32
+ ["vocation"] = {"Knight"},
33
+ ["level"] = 110,
34
+ ["price"] = 20000,
35
+ ["sellers"] = {
36
+ ["Ormuhn"] = true,
37
+ ["Razan"] = true,
38
+ ["Puffels"] = true,
39
+ ["Tristan"] = true,
40
+ ["Uso"] = true,
41
+ ["Graham"] = true,
42
+ ["Thorwulf"] = true,
43
+ ["Zarak"] = true
44
+ }
45
+ },
46
+ ["Apprentice's Strike"] = {
47
+ ["vocation"] = {"Druid", "Sorcerer"},
48
+ ["level"] = 8,
49
+ ["price"] = 0,
50
+ ["sellers"] = {
51
+ ["Azalea"] = "Druid",
52
+ ["Barnabas Dee"] = "Sorcerer",
53
+ ["Charlotta"] = "Druid",
54
+ ["Chatterbone"] = "Sorcerer",
55
+ ["Eroth"] = "Druid",
56
+ ["Etzel"] = "Sorcerer",
57
+ ["Garamond"] = true,
58
+ ["Gundralph"] = true,
59
+ ["Hjaern"] = "Druid",
60
+ ["Lea"] = "Sorcerer",
61
+ ["Malunga"] = "Sorcerer",
62
+ ["Marvik"] = "Druid",
63
+ ["Muriel"] = "Sorcerer",
64
+ ["Myra"] = "Sorcerer",
65
+ ["Padreia"] = "Druid",
66
+ ["Rahkem"] = "Druid",
67
+ ["Romir"] = "Sorcerer",
68
+ ["Shalmar"] = true,
69
+ ["Smiley"] = "Druid",
70
+ ["Tamara"] = "Druid",
71
+ ["Tamoril"] = "Sorcerer",
72
+ ["Tothdral"] = "Sorcerer",
73
+ ["Ustan"] = "Druid"
74
+ }
75
+ },
76
+ ["Arrow Call"] = {
77
+ ["vocation"] = {"Paladin"},
78
+ ["level"] = 1,
79
+ ["price"] = 0,
80
+ ["sellers"] = {
81
+ ["Asrak"] = true,
82
+ ["Dario"] = true,
83
+ ["Elane"] = true,
84
+ ["Ethan"] = true,
85
+ ["Hawkyr"] = true,
86
+ ["Helor"] = true,
87
+ ["Irea"] = true,
88
+ ["Isolde"] = true,
89
+ ["Legola"] = true,
90
+ ["Razan"] = true,
91
+ ["Silas"] = true,
92
+ ["Ursula"] = true
93
+ }
94
+ },
95
+ ["Avalanche"] = {
96
+ ["vocation"] = {"Druid"},
97
+ ["level"] = 30,
98
+ ["price"] = 1200,
99
+ ["sellers"] = {
100
+ ["Azalea"] = true,
101
+ ["Charlotta"] = true,
102
+ ["Elathriel"] = true,
103
+ ["Gundralph"] = true,
104
+ ["Hjaern"] = true,
105
+ ["Marvik"] = true,
106
+ ["Padreia"] = true,
107
+ ["Rahkem"] = true,
108
+ ["Shalmar"] = true,
109
+ ["Smiley"] = true,
110
+ ["Tamara"] = true,
111
+ ["Ustan"] = true
112
+ }
113
+ },
114
+ ["Balanced Brawl"] = {
115
+ ["vocation"] = {"Monk"},
116
+ ["level"] = 175,
117
+ ["price"] = 250000,
118
+ ["sellers"] = {["Enpa Rudra"] = true}
119
+ }
120
+ }"""
121
+
122
+ spell_offers = parse_spell_data(content)
123
+
124
+ self.assertEqual(70, len(spell_offers))
@@ -2,9 +2,11 @@ import sqlite3
2
2
  import unittest
3
3
 
4
4
  from tests import load_resource
5
- from tibiawikisql import Article, models, schema
5
+ from tibiawikisql import models, schema
6
+ from tibiawikisql.api import Article
6
7
 
7
8
 
9
+ @unittest.skip("Temporarily disabling TestModels")
8
10
  class TestModels(unittest.TestCase):
9
11
  def setUp(self):
10
12
  self.conn = sqlite3.connect(":memory:")
@@ -12,28 +14,28 @@ class TestModels(unittest.TestCase):
12
14
  schema.create_tables(self.conn)
13
15
 
14
16
  def test_achievement(self):
15
- article = Article(1, "Demonic Barkeeper", timestamp="2018-08-20T04:33:15Z",
17
+ article = Article(1, "Demonic Barkeeper", timestamp="2018-08-20T04:33:15+00:00",
16
18
  content=load_resource("content_achievement.txt"))
17
19
  achievement = models.Achievement.from_article(article)
18
20
  self.assertIsInstance(achievement, models.Achievement)
19
21
 
20
22
  achievement.insert(self.conn)
21
- db_achievement = models.Achievement.get_by_field(self.conn, "article_id", 1)
23
+ db_achievement = models.Achievement.get_one_by_field(self.conn, "article_id", 1)
22
24
 
23
25
  self.assertIsInstance(db_achievement, models.Achievement)
24
26
  self.assertEqual(db_achievement.name, achievement.name)
25
27
 
26
- db_achievement = models.Achievement.get_by_field(self.conn, "name", "demonic barkeeper", use_like=True)
28
+ db_achievement = models.Achievement.get_one_by_field(self.conn, "name", "demonic barkeeper", use_like=True)
27
29
  self.assertIsInstance(db_achievement, models.Achievement)
28
30
 
29
31
  def test_creature(self):
30
- article = Article(1, "Demon", timestamp="2018-08-20T04:33:15Z",
32
+ article = Article(1, "Demon", timestamp="2018-08-20T04:33:15+00:00",
31
33
  content=load_resource("content_creature.txt"))
32
34
  creature = models.Creature.from_article(article)
33
35
  self.assertIsInstance(creature, models.Creature)
34
36
 
35
37
  creature.insert(self.conn)
36
- db_creature: models.Creature = models.Creature.get_by_field(self.conn, "article_id", 1)
38
+ db_creature: models.Creature = models.Creature.get_one_by_field(self.conn, "article_id", 1)
37
39
 
38
40
  self.assertIsInstance(db_creature, models.Creature)
39
41
  self.assertEqual(db_creature.name, creature.name)
@@ -50,22 +52,22 @@ class TestModels(unittest.TestCase):
50
52
  self.assertEqual(50, db_creature.charm_points)
51
53
  self.assertIsNotNone(db_creature.max_damage)
52
54
 
53
- db_creature = models.Creature.get_by_field(self.conn, "name", "demon", use_like=True)
55
+ db_creature = models.Creature.get_one_by_field(self.conn, "name", "demon", use_like=True)
54
56
  self.assertIsInstance(db_creature, models.Creature)
55
57
 
56
58
  def test_house(self):
57
- article = Article(1, "Crystal Glance", timestamp="2018-08-20T04:33:15Z",
59
+ article = Article(1, "Crystal Glance", timestamp="2018-08-20T04:33:15+00:00",
58
60
  content=load_resource("content_house.txt"))
59
61
  house = models.House.from_article(article)
60
62
  self.assertIsInstance(house, models.House)
61
63
 
62
64
  house.insert(self.conn)
63
- db_house = models.House.get_by_field(self.conn, "article_id", 1)
65
+ db_house = models.House.get_one_by_field(self.conn, "article_id", 1)
64
66
 
65
67
  self.assertIsInstance(db_house, models.House)
66
68
  self.assertEqual(db_house.name, house.name)
67
69
 
68
- models.House.get_by_field(self.conn, "house_id", 55302)
70
+ models.House.get_one_by_field(self.conn, "house_id", 55302)
69
71
  self.assertIsInstance(db_house, models.House)
70
72
 
71
73
  def test_imbuement(self):
@@ -75,14 +77,14 @@ class TestModels(unittest.TestCase):
75
77
  self.assertIsInstance(imbuement, models.Imbuement)
76
78
 
77
79
  imbuement.insert(self.conn)
78
- db_imbuement = models.Imbuement.get_by_field(self.conn, "article_id", 1)
80
+ db_imbuement = models.Imbuement.get_one_by_field(self.conn, "article_id", 1)
79
81
 
80
82
  self.assertIsInstance(db_imbuement, models.Imbuement)
81
83
  self.assertEqual(db_imbuement.name, imbuement.name)
82
84
  self.assertEqual(db_imbuement.tier, imbuement.tier)
83
85
  self.assertGreater(len(db_imbuement.materials), 0)
84
86
 
85
- db_imbuement = models.Imbuement.get_by_field(self.conn, "name", "powerful strike", use_like=True)
87
+ db_imbuement = models.Imbuement.get_one_by_field(self.conn, "name", "powerful strike", use_like=True)
86
88
  self.assertIsInstance(db_imbuement, models.Imbuement)
87
89
 
88
90
  def test_item(self):
@@ -92,7 +94,7 @@ class TestModels(unittest.TestCase):
92
94
  self.assertIsInstance(item, models.Item)
93
95
 
94
96
  item.insert(self.conn)
95
- db_item = models.Item.get_by_field(self.conn, "article_id", 1)
97
+ db_item = models.Item.get_one_by_field(self.conn, "article_id", 1)
96
98
 
97
99
  self.assertIsInstance(db_item, models.Item)
98
100
  self.assertEqual(db_item.name, item.name)
@@ -100,13 +102,13 @@ class TestModels(unittest.TestCase):
100
102
 
101
103
  # Dynamic properties:
102
104
  self.assertEqual(len(item.attributes_dict.keys()), len(item.attributes))
103
- fire_sword_look_text = ('You see a fire sword (Atk:24 physical + 11 fire, Def:20 +1).'
104
- ' It can only be wielded properly by players of level 30 or higher.'
105
- '\nIt weights 23.00 oz.\n'
106
- 'The blade is a magic flame.')
105
+ fire_sword_look_text = ("You see a fire sword (Atk:24 physical + 11 fire, Def:20 +1)."
106
+ " It can only be wielded properly by players of level 30 or higher."
107
+ "\nIt weights 23.00 oz.\n"
108
+ "The blade is a magic flame.")
107
109
  self.assertEqual(fire_sword_look_text, item.look_text)
108
110
 
109
- db_item = models.Item.get_by_field(self.conn, "name", "fire sword", use_like=True)
111
+ db_item = models.Item.get_one_by_field(self.conn, "name", "fire sword", use_like=True)
110
112
  self.assertIsInstance(db_item, models.Item)
111
113
 
112
114
  def test_item_resist(self):
@@ -115,23 +117,23 @@ class TestModels(unittest.TestCase):
115
117
  item = models.Item.from_article(article)
116
118
  self.assertIsInstance(item, models.Item)
117
119
  self.assertIn("energy%", item.attributes_dict)
118
- self.assertEqual(item.attributes_dict['magic'], "+3")
120
+ self.assertEqual(item.attributes_dict["magic"], "+3")
119
121
 
120
- dream_shroud_look_text = ('You see a dream shroud (Arm:12, magic level +3, protection energy +10%).'
121
- ' It can only be wielded properly by sorcerers and druids of level 180 or higher.'
122
- '\nIt weights 25.00 oz.')
122
+ dream_shroud_look_text = ("You see a dream shroud (Arm:12, magic level +3, protection energy +10%)."
123
+ " It can only be wielded properly by sorcerers and druids of level 180 or higher."
124
+ "\nIt weights 25.00 oz.")
123
125
  self.assertEqual(dream_shroud_look_text, item.look_text)
124
126
  self.assertEqual(len(item.resistances), 1)
125
127
  self.assertEqual(item.resistances["energy"], 10)
126
128
 
127
129
  item.insert(self.conn)
128
- db_item = models.Item.get_by_field(self.conn, "article_id", 1)
130
+ db_item = models.Item.get_one_by_field(self.conn, "article_id", 1)
129
131
 
130
132
  self.assertIsInstance(db_item, models.Item)
131
133
  self.assertEqual(db_item.name, item.name)
132
134
  self.assertGreater(len(db_item.attributes), 0)
133
135
 
134
- db_item = models.Item.get_by_field(self.conn, "name", "dream shroud", use_like=True)
136
+ db_item = models.Item.get_one_by_field(self.conn, "name", "dream shroud", use_like=True)
135
137
  self.assertIsInstance(db_item, models.Item)
136
138
 
137
139
  def test_item_sounds(self):
@@ -142,12 +144,12 @@ class TestModels(unittest.TestCase):
142
144
  self.assertEqual(len(item.sounds), 5)
143
145
 
144
146
  item.insert(self.conn)
145
- db_item = models.Item.get_by_field(self.conn, "article_id", 1)
147
+ db_item = models.Item.get_one_by_field(self.conn, "article_id", 1)
146
148
 
147
149
  self.assertIsInstance(db_item, models.Item)
148
150
  self.assertEqual(db_item.name, item.name)
149
151
 
150
- db_item = models.Item.get_by_field(self.conn, "name", "mini nabbot", use_like=True)
152
+ db_item = models.Item.get_one_by_field(self.conn, "name", "mini nabbot", use_like=True)
151
153
  self.assertEqual(len(item.sounds), len(db_item.sounds))
152
154
  self.assertIsInstance(db_item, models.Item)
153
155
 
@@ -174,12 +176,12 @@ class TestModels(unittest.TestCase):
174
176
  self.assertIsInstance(key, models.Key)
175
177
 
176
178
  key.insert(self.conn)
177
- db_key = models.Key.get_by_field(self.conn, "article_id", 1)
179
+ db_key = models.Key.get_one_by_field(self.conn, "article_id", 1)
178
180
 
179
181
  self.assertIsInstance(db_key, models.Key)
180
182
  self.assertEqual(db_key.name, key.name)
181
183
 
182
- db_key = models.Key.get_by_field(self.conn, "number", 3940)
184
+ db_key = models.Key.get_one_by_field(self.conn, "number", 3940)
183
185
  self.assertIsInstance(db_key, models.Key)
184
186
 
185
187
  def test_book(self):
@@ -189,7 +191,7 @@ class TestModels(unittest.TestCase):
189
191
  self.assertIsInstance(book, models.Book)
190
192
 
191
193
  book.insert(self.conn)
192
- db_book = models.Book.get_by_field(self.conn, "article_id", 1)
194
+ db_book = models.Book.get_one_by_field(self.conn, "article_id", 1)
193
195
 
194
196
  self.assertIsInstance(db_book, models.Book)
195
197
  self.assertEqual(db_book.name, book.name)
@@ -206,7 +208,7 @@ class TestModels(unittest.TestCase):
206
208
  self.assertIsInstance(npc, models.Npc)
207
209
 
208
210
  npc.insert(self.conn)
209
- db_npc = models.Npc.get_by_field(self.conn, "article_id", 1)
211
+ db_npc = models.Npc.get_one_by_field(self.conn, "article_id", 1)
210
212
 
211
213
  self.assertIsInstance(db_npc, models.Npc)
212
214
  self.assertEqual(db_npc.name, npc.name)
@@ -229,7 +231,7 @@ class TestModels(unittest.TestCase):
229
231
  self.assertIsInstance(quest, models.Quest)
230
232
 
231
233
  quest.insert(self.conn)
232
- db_quest = models.Quest.get_by_field(self.conn, "article_id", 1)
234
+ db_quest = models.Quest.get_one_by_field(self.conn, "article_id", 1)
233
235
 
234
236
  self.assertIsInstance(db_quest, models.Quest)
235
237
  self.assertEqual(db_quest.name, quest.name)
@@ -241,7 +243,7 @@ class TestModels(unittest.TestCase):
241
243
  self.assertIsInstance(spell, models.Spell)
242
244
 
243
245
  spell.insert(self.conn)
244
- db_spell = models.Spell.get_by_field(self.conn, "article_id", 1)
246
+ db_spell = models.Spell.get_one_by_field(self.conn, "article_id", 1)
245
247
 
246
248
  self.assertIsInstance(db_spell, models.Spell)
247
249
  self.assertEqual(db_spell.name, spell.name)
@@ -254,7 +256,7 @@ class TestModels(unittest.TestCase):
254
256
  self.assertIsInstance(world.trade_board, int)
255
257
 
256
258
  world.insert(self.conn)
257
- db_world = models.World.get_by_field(self.conn, "article_id", 1)
259
+ db_world = models.World.get_one_by_field(self.conn, "article_id", 1)
258
260
 
259
261
  self.assertIsInstance(db_world, models.World)
260
262
  self.assertEqual(db_world.name, world.name)
@@ -269,7 +271,7 @@ class TestModels(unittest.TestCase):
269
271
  self.assertIsInstance(mount.buyable, int)
270
272
 
271
273
  mount.insert(self.conn)
272
- db_mount = models.Mount.get_by_field(self.conn, "article_id", 1)
274
+ db_mount = models.Mount.get_one_by_field(self.conn, "article_id", 1)
273
275
 
274
276
  self.assertIsInstance(db_mount, models.Mount)
275
277
  self.assertEqual(db_mount.name, mount.name)
@@ -285,7 +287,7 @@ class TestModels(unittest.TestCase):
285
287
  self.assertEqual("11.50.6055", charm.version)
286
288
 
287
289
  charm.insert(self.conn)
288
- db_charm = models.Charm.get_by_field(self.conn, "article_id", 1)
290
+ db_charm = models.Charm.get_one_by_field(self.conn, "article_id", 1)
289
291
 
290
292
  self.assertIsInstance(db_charm, models.Charm)
291
293
  self.assertEqual(db_charm.name, charm.name)
@@ -299,7 +301,7 @@ class TestModels(unittest.TestCase):
299
301
  self.assertEqual(outfit.achievement, "Brutal Politeness")
300
302
 
301
303
  outfit.insert(self.conn)
302
- db_outfit = models.Outfit.get_by_field(self.conn, "article_id", 1)
304
+ db_outfit = models.Outfit.get_one_by_field(self.conn, "article_id", 1)
303
305
 
304
306
  self.assertIsInstance(db_outfit, models.Outfit)
305
307
  self.assertEqual(db_outfit.name, outfit.name)