3232 MANDATORY_ZIM_METADATA_KEYS ,
3333)
3434from ..filesystem import delete_callback , get_content_mimetype , get_file_mimetype
35+ from ..i18n import is_valid_iso_639_3
3536from ..types import get_mime_for_name
3637from .items import StaticItem
38+ from .metadata import (
39+ validate_counter ,
40+ validate_date ,
41+ validate_description ,
42+ validate_illustrations ,
43+ validate_language ,
44+ validate_longdescription ,
45+ validate_required_values ,
46+ validate_standard_str_types ,
47+ validate_tags ,
48+ validate_title ,
49+ )
3750
3851DUPLICATE_EXC_STR = re .compile (
3952 r"^Impossible to add(.+)"
@@ -91,6 +104,7 @@ def __init__(
91104 ):
92105 super ().__init__ (filename = filename )
93106 self ._metadata = dict ()
107+ self .__indexing_configured = False
94108 self .can_finish = True
95109
96110 self .set_mainpath (main_path )
@@ -105,18 +119,28 @@ def __init__(
105119 self .workaround_nocancel = workaround_nocancel
106120 self .ignore_duplicates = ignore_duplicates
107121
122+ def config_indexing (self , indexing : bool , language : Optional [str ] = None ):
123+ """Toggle full-text and title indexing of entries
124+
125+ Uses Language metadata's value (or "") if not set"""
126+ language = language or self ._metadata .get ("Language" , "" )
127+ if indexing and not is_valid_iso_639_3 (language ):
128+ raise ValueError ("Not a valid ISO-639-3 language code" )
129+ super ().config_indexing (indexing , language )
130+ self .__indexing_configured = True
131+ return self
132+
108133 def start (self ):
109- if not all (
110- [
111- key in self ._metadata .keys () and self ._metadata .get (key , None )
112- for key in MANDATORY_ZIM_METADATA_KEYS
113- ]
114- ):
134+ if not all ([self ._metadata .get (key ) for key in MANDATORY_ZIM_METADATA_KEYS ]):
115135 raise ValueError ("Mandatory metadata are not all set." )
116136
117137 for name , value in self ._metadata .items ():
118138 if value :
119- self ._validate_metadata (name , value )
139+ self .validate_metadata (name , value )
140+
141+ language = self ._metadata .get ("Language" , "" ).split ("," )
142+ if language [0 ] and not self .__indexing_configured :
143+ self .config_indexing (True , language [0 ])
120144
121145 super ().__enter__ ()
122146
@@ -128,15 +152,36 @@ def start(self):
128152
129153 return self
130154
131- def _validate_metadata (self , name , value ):
132- if name == "Counter" :
133- raise ValueError ("You do not need to set Counter." )
155+ def validate_metadata (
156+ self ,
157+ name : str ,
158+ value : Union [bytes , str , datetime .datetime , datetime .date , Iterable [str ]],
159+ ):
160+ """Ensures metadata value for name is conform with the openZIM spec on Metadata
161+
162+ Also enforces recommendations
163+ See https://wiki.openzim.org/wiki/Metadata"""
134164
135- if name == "Description" and len ( value ) > 80 :
136- raise ValueError ( "Description is too long." )
165+ validate_required_values ( name , value )
166+ validate_standard_str_types ( name , value )
137167
138- if name == "LongDescription" and len (value ) > 4000 :
139- raise ValueError ("LongDescription is too long." )
168+ validate_title (name , value )
169+ validate_date (name , value )
170+ validate_language (name , value )
171+ validate_counter (name , value )
172+ validate_description (name , value )
173+ validate_longdescription (name , value )
174+ validate_tags (name , value )
175+ validate_illustrations (name , value )
176+
177+ def add_metadata (
178+ self ,
179+ name : str ,
180+ content : Union [str , bytes , datetime .date , datetime .datetime ],
181+ mimetype : str = "text/plain;charset=UTF-8" ,
182+ ):
183+ self .validate_metadata (name , content )
184+ super ().add_metadata (name , content , mimetype )
140185
141186 def config_metadata (
142187 self ,
@@ -158,17 +203,7 @@ def config_metadata(
158203 Relation : Optional [str ] = None ,
159204 ** extras : str ,
160205 ):
161- """
162- A chaining functions which configures the metadata of the Creator class.
163- You must set all mandatory metadata in this phase.
164-
165- Parameters:
166- check out: https://wiki.openzim.org/wiki/Metadata
167- all the extra metadata must be plain text.
168-
169- Returns:
170- Self
171- """
206+ """Sets all mandatory Metadata as well as standard and any other text ones"""
172207 self ._metadata .update (
173208 {
174209 "Name" : Name ,
@@ -189,18 +224,10 @@ def config_metadata(
189224 }
190225 )
191226 self ._metadata .update (extras )
192- language = self ._metadata .get ("Language" , "" ).split ("," )
193- self .config_indexing (True , language [0 ])
194-
195227 return self
196228
197229 def config_dev_metadata (self , ** extras : str ):
198- """
199- A Test function. It will set the default test metadata for a Creator instance.
200-
201- Returns:
202- Self
203- """
230+ """Calls config_metadata with default (yet overridable) values for dev"""
204231 devel_default_metadata = DEFAULT_DEV_ZIM_METADATA .copy ()
205232 devel_default_metadata .update (extras )
206233 return self .config_metadata (** devel_default_metadata )
0 commit comments