Coverage for src/artemis_sg/config/__init__.py: 44%

1 import logging

2 import os

3

4 from flatten_dict import flatten, unflatten

5

6 import artemis_sg

7

8 namespace = "artemis_sg.config"

9

10# Everyghing that can be configured is here.

11 CFG = {

12 "asg": {

13 "vendors": [

14 {"code": "sample",

15 "name": "Sample Vendor",

16 "isbn_key": "ISBN-13",

17 "failover_scraper": ""},

18 {"code": "sample2",

19 "name": "Another Vendor",

20 "isbn_key": "ISBN",

21 "failover_scraper": "AmznUkScraper"},

22 ],

23 "item": {

24 "sort_order": [

25 "TITLE",

26 "SUBTITLE",

27 "AUTHOR",

28 "PUBLISHER",

29 "PUB DATE",

30 "PUBLISHERDATE",

31 "FORMAT",

32 ],

33 },

34 "spreadsheet": {

35 "sheet_image": {

36 "col_order": [

37 "ISBN",

38 "IMAGE",

39 "ORDER",

40 ],

41 "image_row_height": 105,

42 "image_col_width": 18,

43 "isbn_col_width": 13,

44 "max_col_width": 50,

45 "col_buffer": 1.23,

46 },

47 "mkthumbs": {

48 "width": 130,

49 "height": 130,

50 },

51 },

52 "scraper": {

53 "headless": False,

54 "login_timeout": 90,

55 "gjscraper": {

56 "sentinel_publisher": "Abbeville",

57 },

58 },

59 "data": {

60 "file": {

61 "scraped": os.path.join(artemis_sg.data_dir, "scraped_items.json"),

62 },

63 "dir": {

64 "images": os.path.join(artemis_sg.data_dir, "downloaded_images"),

65 "upload_source": os.path.join(artemis_sg.data_dir, "downloaded_images"),

66 },

67 },

68 "slide_generator": {

69 "title_default": "New Arrivals",

70 "line_spacing": 1,

71 "text_width": 80,

72 "max_fontsize": 18,

73 "slide_max_batch": 25,

74 "slide_ppi": 96,

75 "slide_w": 10.0,

76 "slide_h": 5.625,

77 "gutter": 0.375,

78 "text_box_resize_img_threshold": 2,

79 "logo_h": 1,

80 "logo_w": 1,

81 "addl_img_h": 1.5,

82 "addl_img_w": 3,

83 "logo_url": "https://images.squarespace-cdn.com/content/v1/6110970ca45ca157a1e98b76/e4ea0607-01c0-40e0-a7c0-b56563b67bef/artemis.png?format=1500w",

84 "blacklist_keys": (

85 "IMAGE",

86 "ON HAND",

87 "ORDER",

88 "ORDER QTY",

89 "GJB SUGGESTED",

90 "DATE RECEIVED",

91 "SUBJECT",

92 "QTYINSTOCK",

93 "QTY",

94 "SALESPRICE",

95 "AVAILABLE START DATE",

96 "CATEGORY",

97 "LINK",

98 ),

99 "gj_binding_map": {

100 "P": "Paperback",

101 "H": "Hardcover",

102 "C": "Hardcover",

103 "C NDJ": "Cloth, no dust jacket",

104 "CD": "CD",

105 },

106 "gj_type_map": {

107 "R": "Remainder",

108 "H": "Return"

109 },

110 "bg_color": "black",

111 "text_color": "white",

112 "tiny_isbn_x_inset": 1.0,

113 "tiny_isbn_fontsize": 6,

114 "text_box_max_lines": 36,

115 "text_box_resized_max_lines": 28,

116 "text_map": {

117 "AUTHOR": "by {t}",

118 "PUB LIST": "List Price: {t}",

119 "LISTPRICE": "List Price: {t}",

120 "USD COST": "USD Cost: ${t}",

121 "RRP": "List price: £{t}",

122 "BARGAIN": "Bargain: £{t}",

123 "NET COST": "Your Net Price: {t}",

124 "YOUR NET PRICE": "Your Net Price: {t}",

125 "PUB DATE": "Pub Date: {t}",

126 "PUBLISHERDATE": "Pub Date: {t}",

127 "BINDING": "Format: {t}",

128 "FORMAT": "Format: {t}",

129 "TYPE": "Type: {t}",

130 "PAGES": "Pages: {t} pp.",

131 "SIZE": "Size: {t}",

132 "ITEM#": "Item #: {t}",

133 "TBCODE": "Item #: {t}",

134 },

135 },

136 "test": {

137 "sheet": {"id": "GOOGLE_SHEET_ID_HERE", "tab": "GOOGLE_SHEET_TAB_HERE"}

138 },

139 },

140 "google": {

141 "cloud": {

142 "new_threshold_secs": 3600,

143 "bucket": "my_bucket",

144 "bucket_prefix": "my_bucket_prefix",

145 "key_file": os.path.join(

146 artemis_sg.data_dir, "google_cloud_service_key.json"

147 ),

148 },

149 "docs": {

150 "api_creds_file": os.path.join(artemis_sg.data_dir, "credentials.json"),

151 "api_creds_token": os.path.join(

152 artemis_sg.data_dir, "app_creds_token.json"

153 ),

154 },

155 },

156}

157

158 try:

159 import tomllib

160 except ModuleNotFoundError:

161 import tomli as tomllib

162

163 conf_file = "config.toml"

164

165 conf_path = os.path.join(artemis_sg.conf_dir, conf_file)

166

167 try:

168 with open(conf_path, mode="rb") as fp:

169 f_config = tomllib.load(fp)

170 except FileNotFoundError:

171 import tomli_w

172

173 logging.warning(f"{namespace}: Config file not found at {conf_path}.")

174 logging.warning(f"{namespace}: Creating new config file at {conf_path}.")

175 logging.warning(

176 f"{namespace}: IMPORTANT: Edit file to set proper values for google_cloud."

177 )

178

179 d = os.path.dirname(conf_path)

180 if not os.path.exists(d):

181 os.makedirs(d)

182 with open(conf_path, mode="wb") as fp:

183 tomli_w.dump(CFG, fp)

184 with open(conf_path, mode="rb") as fp:

185 f_config = tomllib.load(fp)

186

187# Update CFG with contents of f_config

188 flat_cfg = flatten(CFG)

189 flat_f_config = flatten(f_config)

190 flat_merged = flat_cfg | flat_f_config

191 CFG = unflatten(flat_merged)

192

193# Create all defined data_dir subdirectories

194 for key in CFG["asg"]["data"]["dir"]:

195 d = CFG["asg"]["data"]["dir"][key]

196 if not os.path.exists(d): 196 ↛ 197line 196 didn't jump to line 197, because the condition on line 196 was never true

197 logging.warning(f"{namespace}: Creating new directory at {d}.")

198 os.makedirs(d)

199

200# Create all defined data_dir files

201 for key in CFG["asg"]["data"]["file"]:

202 f = CFG["asg"]["data"]["file"][key]

203 if not os.path.exists(f): 203 ↛ 204line 203 didn't jump to line 204, because the condition on line 203 was never true

204 d = os.path.dirname(f)

205 if not os.path.exists(d):

206 logging.warning(f"{namespace}: Creating new directory at {d}.")

207 os.makedirs(d)

208 logging.warning(f"{namespace}: Creating new file at {f}.")

209 _root, ext = os.path.splitext(f)

210 with open(f, "w") as fp:

211 # Seed JSON files with valid empty JSON.

212 if ext.lower() == ".json":

213 fp.write("{ }")

214 pass