test_yaml.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. import datetime
  4. import difflib
  5. import finoex
  6. import ioex.calcex
  7. import ioex.datetimeex
  8. import os
  9. import pytz
  10. yaml = pytest.importorskip('yaml')
  11. def get_figure_a():
  12. return ioex.calcex.Figure(12.3, u'km')
  13. def get_figure_b():
  14. return ioex.calcex.Figure(12300, u'米')
  15. def get_sum_a():
  16. return finoex.Sum(1.23, u'EUR')
  17. def get_sum_b():
  18. return finoex.Sum(20.45, u'€')
  19. def get_item_a(sub_items = False):
  20. item = finoex.Item(
  21. name = u'item a',
  22. price_brutto = get_sum_a(),
  23. )
  24. if sub_items:
  25. item.sub_items.append(get_item_b())
  26. return item
  27. def get_item_b():
  28. return finoex.Item(
  29. name = u'item β',
  30. price_brutto = get_sum_b(),
  31. )
  32. def get_service_a():
  33. return finoex.Service(
  34. duration = ioex.datetimeex.Duration(years = 2),
  35. ip_addresses = ['::1'],
  36. location = 'vienna',
  37. name = u'service',
  38. price_brutto = finoex.Sum(1.0, u'EUR'),
  39. state = 'success',
  40. )
  41. def get_hosting_service():
  42. return finoex.HostingService(
  43. duration = ioex.datetimeex.Duration(years = 2),
  44. ip_addresses = ['127.0.0.1', '::1'],
  45. location = 'vienna',
  46. name = u'virtual server',
  47. operating_system = 'debian 8',
  48. price_brutto = finoex.Sum(1.0, u'EUR'),
  49. state = 'running',
  50. )
  51. def get_cloud_mining():
  52. return finoex.CloudMining(
  53. hashrate = ioex.calcex.Figure(8, u'TH/s'),
  54. name = u'sha256 BTC',
  55. price_brutto = finoex.Sum(1.0, u'EUR'),
  56. )
  57. def get_service_b():
  58. return finoex.Service(
  59. name = u'service',
  60. price_brutto = finoex.Sum(1.0, u'EUR'),
  61. period = ioex.datetimeex.Period(
  62. start = datetime.datetime(2017, 4, 2, 10, 23),
  63. end = None,
  64. ),
  65. )
  66. def get_person_a():
  67. return finoex.Person(
  68. first_name = u'Fabian Peter',
  69. last_name = u'Hammerle',
  70. )
  71. def get_person_b():
  72. return finoex.Person(
  73. first_name = u'名字',
  74. last_name = u'贵姓',
  75. )
  76. def get_campaign_a():
  77. return finoex.Campaign(
  78. name = u'campaign a',
  79. founder = u'company',
  80. end = datetime.datetime(2016, 7, 23, 9, 23, 17, tzinfo = pytz.timezone('Europe/Vienna')),
  81. )
  82. def get_campaign_b():
  83. return finoex.Campaign(
  84. founder = u'company',
  85. name = u'campaign without end',
  86. website_url = u'http://campaign.com',
  87. )
  88. def get_pledge():
  89. return finoex.Pledge(
  90. campaign = get_campaign_a(),
  91. price_brutto = finoex.Sum(10.0, u'EUR'),
  92. reward = u'great',
  93. )
  94. def get_contribution():
  95. return finoex.Contribution(
  96. campaign = get_campaign_a(),
  97. price_brutto = finoex.Sum(10.0, u'EUR'),
  98. reward = u'product',
  99. )
  100. def get_article():
  101. return finoex.Article(
  102. authors = ['a', 'b'],
  103. depth = finoex.Distance(12.3, u'dm'),
  104. features = u'supergeil',
  105. height = finoex.Distance(123., u'cm'),
  106. maximum_load = ioex.calcex.Figure(40., u'kg'),
  107. name = u'article name',
  108. price_brutto = get_sum_a(),
  109. product_id = u'0815',
  110. quantity = 1,
  111. reseller = u'seller',
  112. shipper = u'shipper',
  113. state = u'goood',
  114. width = finoex.Distance(1.23, u'm'),
  115. )
  116. def get_transportation():
  117. return finoex.Transportation(
  118. name = u'ticket',
  119. price_brutto = get_sum_a(),
  120. departure_point = u'home',
  121. destination_point = u'city',
  122. distance = finoex.Distance(3.21, u'km'),
  123. passenger = get_person_a(),
  124. valid_from = datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')),
  125. valid_until = datetime.datetime(2016, 7, 14, 18, 50, 4, 0, tzinfo = pytz.utc),
  126. ticket_url = u'https://www.example.com',
  127. estimated_arrival_time = ioex.datetimeex.Period(
  128. start = pytz.timezone('Europe/Vienna').localize(datetime.datetime(2016, 7, 24, 23, 47, 2)),
  129. end = pytz.utc.localize(datetime.datetime(2016, 7, 24, 23, 48, 5)),
  130. ),
  131. arrival_time = pytz.timezone('Europe/Vienna').localize(
  132. datetime.datetime(2016, 7, 24, 23, 47, 35)
  133. ),
  134. )
  135. def get_shipping():
  136. return finoex.Shipping(
  137. price_brutto = get_sum_a(),
  138. destination_point = u'home',
  139. tracking_number = 'LX123456789CN',
  140. )
  141. def get_taxi_ride():
  142. return finoex.TaxiRide(
  143. name = u'taxi ride',
  144. price_brutto = get_sum_a(),
  145. departure_point = u'home',
  146. destination_point = u'city',
  147. distance = finoex.Distance(3.21, u'km'),
  148. driver = u'driver',
  149. arrival_time = datetime.datetime(2016, 5, 2, 18, 10, tzinfo = pytz.timezone('Europe/Vienna')),
  150. departure_time = datetime.datetime(2016, 5, 2, 18, 25, tzinfo = pytz.timezone('Europe/Vienna')),
  151. )
  152. def get_discount_a():
  153. return finoex.Discount(
  154. name = u'discount a',
  155. amount = get_sum_a(),
  156. )
  157. def get_discount_b():
  158. return finoex.Discount(
  159. name = u'discount β',
  160. amount = get_sum_b(),
  161. )
  162. def get_discount_c():
  163. return finoex.Discount(
  164. amount = get_sum_b(),
  165. code = 'DISCΓ',
  166. name = u'discount c',
  167. )
  168. def get_order_a(items = True, discounts = True):
  169. order = finoex.Order(
  170. platform = u'platformπ',
  171. order_id = u'id',
  172. order_date = datetime.datetime(2016, 5, 8, 0, 18, 17),
  173. customer_id = u'customer',
  174. )
  175. if items:
  176. order.items.append(get_item_a())
  177. order.items.append(get_item_b())
  178. if discounts:
  179. order.discounts.append(get_discount_a())
  180. order.discounts.append(get_discount_b())
  181. return order
  182. def get_order_b():
  183. order = finoex.Order(
  184. platform = u'platformπ',
  185. order_id = u'order_b',
  186. order_date = datetime.datetime(2015, 5, 8, 0, 18, 17),
  187. )
  188. return order
  189. def get_order_c():
  190. order = finoex.Order(
  191. platform = u'γάμμα',
  192. order_id = u'order_βήτα',
  193. order_date = datetime.datetime(2014, 5, 8, 0, 18, 17),
  194. customer_id = u'ρώ',
  195. )
  196. return order
  197. def get_invoice(items = True, discounts = True):
  198. inv = finoex.Invoice(
  199. creditor = u'platformπ',
  200. invoice_id = u'id',
  201. invoice_date = datetime.datetime(2016, 5, 8, 0, 18, 17),
  202. debitor_id = u'customer',
  203. )
  204. if items:
  205. inv.items.append(get_item_a())
  206. inv.items.append(get_item_b())
  207. if discounts:
  208. inv.discounts.append(get_discount_a())
  209. return inv
  210. def get_distance():
  211. return finoex.Distance(2.4142, u'km')
  212. def to_yaml(data):
  213. class Dumper(yaml.Dumper):
  214. pass
  215. ioex.datetimeex.Duration.register_yaml_representer(yaml.Dumper)
  216. ioex.datetimeex.Period.register_yaml_representer(yaml.Dumper)
  217. ioex.calcex.Figure.register_yaml_representer(yaml.Dumper)
  218. finoex.Sum.register_yaml_representer(yaml.Dumper)
  219. finoex.Distance.register_yaml_representer(yaml.Dumper)
  220. return yaml.dump(
  221. data,
  222. default_flow_style = False,
  223. allow_unicode = True,
  224. Dumper = Dumper,
  225. ) #.decode('utf-8')
  226. def yaml_diff(a, b):
  227. return '\n'.join(difflib.ndiff(
  228. to_yaml(a).split('\n'),
  229. to_yaml(b).split('\n'),
  230. ))
  231. @pytest.mark.parametrize('source_object,expected_yaml', [
  232. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0), '2016-07-14 13:50:04\n...\n'],
  233. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')), '2016-07-14 13:50:04+01:05\n...\n'],
  234. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.utc), '2016-07-14 13:50:04+00:00\n...\n'],
  235. [finoex.Distance(1.34, u'km'), u"!distance '1.34 km'\n"],
  236. [finoex.Distance(1.34, u'μm'), u"!distance '1.34 μm'\n"],
  237. [get_discount_a(), u"!discount\namount: !sum '1.23 EUR'\nname: discount a\n"],
  238. [get_discount_b(), u"!discount\namount: !sum '20.45 EUR'\nname: discount β\n"],
  239. [get_discount_c(), u"""!discount
  240. amount: !sum '20.45 EUR'
  241. code: DISCΓ
  242. name: discount c
  243. """],
  244. [get_figure_a(), u"!figure '12.3 km'\n"],
  245. [get_figure_b(), u"!figure '12300 米'\n"],
  246. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum '1.23 EUR'\n"],
  247. [get_item_a(sub_items=True), u"""!item
  248. name: item a
  249. price_brutto: !sum '1.23 EUR'
  250. sub_items:
  251. - !item
  252. name: item β
  253. price_brutto: !sum '20.45 EUR'
  254. """],
  255. [get_item_b(), u"!item\nname: item β\nprice_brutto: !sum '20.45 EUR'\n"],
  256. [get_person_a(), u'!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  257. [get_person_b(), u'!person\nfirst_name: 名字\nlast_name: 贵姓\n'],
  258. [get_campaign_a(), u"""!campaign
  259. end: 2016-07-23 09:23:17+01:05
  260. founder: company
  261. name: campaign a
  262. """],
  263. [get_campaign_b(), u"""!campaign
  264. founder: company
  265. name: campaign without end
  266. website_url: http://campaign.com
  267. """],
  268. [get_service_a(), u"""!service
  269. duration: !duration
  270. years: 2
  271. ip_addresses:
  272. - ::1
  273. location: vienna
  274. name: service
  275. price_brutto: !sum '1.0 EUR'
  276. state: success
  277. """],
  278. [get_service_b(), u"""!service
  279. name: service
  280. period: !period
  281. end: null
  282. start: 2017-04-02 10:23:00
  283. price_brutto: !sum '1.0 EUR'
  284. """],
  285. [get_hosting_service(), u"""!hosting-service
  286. duration: !duration
  287. years: 2
  288. ip_addresses:
  289. - 127.0.0.1
  290. - ::1
  291. location: vienna
  292. name: virtual server
  293. operating_system: debian 8
  294. price_brutto: !sum '1.0 EUR'
  295. state: running
  296. """],
  297. [get_cloud_mining(), u"""!cloud-mining
  298. hashrate: !figure '8 TH/s'
  299. name: sha256 BTC
  300. price_brutto: !sum '1.0 EUR'
  301. """],
  302. [get_pledge(), u"""!pledge
  303. campaign: !campaign
  304. end: 2016-07-23 09:23:17+01:05
  305. founder: company
  306. name: campaign a
  307. price_brutto: !sum '10.0 EUR'
  308. reward: great
  309. """],
  310. [get_contribution(), u"""!contribution
  311. campaign: !campaign
  312. end: 2016-07-23 09:23:17+01:05
  313. founder: company
  314. name: campaign a
  315. price_brutto: !sum '10.0 EUR'
  316. reward: product
  317. """],
  318. [get_order_a(), u"""!order
  319. customer_id: customer
  320. discounts:
  321. - !discount
  322. amount: !sum '1.23 EUR'
  323. name: discount a
  324. - !discount
  325. amount: !sum '20.45 EUR'
  326. name: discount β
  327. items:
  328. - !item
  329. name: item a
  330. price_brutto: !sum '1.23 EUR'
  331. - !item
  332. name: item β
  333. price_brutto: !sum '20.45 EUR'
  334. order_date: 2016-05-08 00:18:17
  335. order_id: id
  336. platform: platformπ
  337. """],
  338. [get_order_a(discounts = False), u"""!order
  339. customer_id: customer
  340. items:
  341. - !item
  342. name: item a
  343. price_brutto: !sum '1.23 EUR'
  344. - !item
  345. name: item β
  346. price_brutto: !sum '20.45 EUR'
  347. order_date: 2016-05-08 00:18:17
  348. order_id: id
  349. platform: platformπ
  350. """],
  351. [get_article(), u"""!article
  352. authors:
  353. - a
  354. - b
  355. depth: !distance '12.3 dm'
  356. features: supergeil
  357. height: !distance '123.0 cm'
  358. maximum_load: !figure '40.0 kg'
  359. name: article name
  360. price_brutto: !sum '1.23 EUR'
  361. product_id: 0815
  362. quantity: 1
  363. reseller: seller
  364. shipper: shipper
  365. state: goood
  366. width: !distance '1.23 m'
  367. """],
  368. [get_transportation(), u"""!transportation
  369. arrival_time: 2016-07-24 23:47:35+02:00
  370. departure_point: home
  371. destination_point: city
  372. distance: !distance '3.21 km'
  373. estimated_arrival_time: !period
  374. end: 2016-07-24 23:48:05+00:00
  375. start: 2016-07-24 23:47:02+02:00
  376. name: ticket
  377. passenger: !person
  378. first_name: Fabian Peter
  379. last_name: Hammerle
  380. price_brutto: !sum '1.23 EUR'
  381. ticket_url: https://www.example.com
  382. valid_from: 2016-07-14 13:50:04+01:05
  383. valid_until: 2016-07-14 18:50:04+00:00
  384. """],
  385. [get_shipping(), u"""!shipping
  386. destination_point: home
  387. price_brutto: !sum '1.23 EUR'
  388. tracking_number: LX123456789CN
  389. """],
  390. [get_taxi_ride(), u"""!taxi-ride
  391. arrival_time: 2016-05-02 18:10:00+01:05
  392. departure_point: home
  393. departure_time: 2016-05-02 18:25:00+01:05
  394. destination_point: city
  395. distance: !distance '3.21 km'
  396. driver: driver
  397. name: taxi ride
  398. price_brutto: !sum '1.23 EUR'
  399. """],
  400. [get_invoice(), u"""!invoice
  401. creditor: platformπ
  402. debitor_id: customer
  403. discounts:
  404. - !discount
  405. amount: !sum '1.23 EUR'
  406. name: discount a
  407. invoice_date: 2016-05-08 00:18:17
  408. invoice_id: id
  409. items:
  410. - !item
  411. name: item a
  412. price_brutto: !sum '1.23 EUR'
  413. - !item
  414. name: item β
  415. price_brutto: !sum '20.45 EUR'
  416. """],
  417. ])
  418. def test_to_yaml(source_object, expected_yaml):
  419. assert expected_yaml == to_yaml(source_object)
  420. @pytest.mark.parametrize('expected_object,source_yaml', [
  421. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0), '2016-07-14 13:50:04'],
  422. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')), '2016-07-14 13:50:04+01:05'],
  423. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.utc), '2016-07-14 13:50:04+00:00'],
  424. [finoex.Distance(1.34, u'km'), u"!distance '1.34 km'\n"],
  425. [finoex.Distance(1.34, u'μm'), u"!distance '1.34 μm'"],
  426. [get_discount_a(), u"!discount\nname: discount a\namount: !sum '1.23 EUR'\n"],
  427. [get_discount_b(), u"!discount\nname: discount β\namount: !sum '20.45 EUR'\n"],
  428. [get_discount_c(), u"""!discount
  429. amount: !sum 20.45 EUR
  430. name: discount c
  431. code: DISCΓ
  432. """],
  433. [get_figure_a(), '!figure\nunit: km\nvalue: 12.3\n'],
  434. [get_figure_a(), u'!figure\nunit: km\nvalue: 12.3\n'],
  435. [get_figure_b(), '!figure\nunit: 米\nvalue: 12300\n'],
  436. [get_figure_b(), u'!figure\nunit: 米\nvalue: 12300\n'],
  437. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum '1.23 EUR'\n"],
  438. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum 1.23 EUR"],
  439. [get_item_a(sub_items=True), u"""!item
  440. name: item a
  441. price_brutto: !sum '1.23 EUR'
  442. sub_items:
  443. - !item
  444. name: item β
  445. price_brutto: !sum '20.45 EUR'
  446. """],
  447. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum 1.23 €\n"],
  448. [get_item_b(), u"!item\nname: item β\nprice_brutto: !sum '20.45 EUR'\n"],
  449. [get_person_a(), '!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  450. [get_person_a(), u'!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  451. [get_person_b(), u'!person\nfirst_name: 名字\nlast_name: 贵姓\n'],
  452. [get_campaign_a(), u"""!campaign
  453. name: campaign a
  454. founder: company
  455. end: 2016-07-23 09:23:17+01:05
  456. """],
  457. [get_campaign_b(), u"""!campaign
  458. founder: company
  459. name: campaign without end
  460. website_url: http://campaign.com
  461. """],
  462. [get_service_a(), u"""!service
  463. duration: !duration
  464. years: 2
  465. ip_addresses:
  466. - ::1
  467. location: vienna
  468. name: service
  469. price_brutto: !sum '1.0 EUR'
  470. state: success
  471. """],
  472. [get_service_b(), u"""!service
  473. name: service
  474. period: !period
  475. start: 2017-04-02 10:23:00
  476. price_brutto: !sum '1.0 EUR'
  477. """],
  478. [get_hosting_service(), u"""!hosting-service
  479. duration: !duration
  480. years: 2
  481. ip_addresses:
  482. - 127.0.0.1
  483. - ::1
  484. location: vienna
  485. name: virtual server
  486. operating_system: debian 8
  487. price_brutto: !sum '1.0 EUR'
  488. state: running
  489. """],
  490. [get_cloud_mining(), u"""!cloud-mining
  491. hashrate: !figure 8 TH/s
  492. name: sha256 BTC
  493. price_brutto: !sum 1.0 EUR
  494. """],
  495. [get_pledge(), u"""!pledge
  496. campaign: !campaign
  497. name: campaign a
  498. founder: company
  499. end: 2016-07-23 09:23:17+01:05
  500. price_brutto: !sum '10.0 EUR'
  501. reward: great
  502. """],
  503. [get_contribution(), u"""!contribution
  504. campaign: !campaign
  505. end: 2016-07-23 09:23:17+01:05
  506. founder: company
  507. name: campaign a
  508. price_brutto: !sum '10.0 EUR'
  509. reward: product
  510. """],
  511. [[get_person_a(), get_person_b()], u"""
  512. - !person
  513. first_name: Fabian Peter
  514. last_name: Hammerle
  515. - !person
  516. first_name: 名字
  517. last_name: 贵姓"""],
  518. [get_transportation(), u"""!transportation
  519. arrival_time: 2016-07-24 23:47:35+02:00
  520. departure_point: home
  521. destination_point: city
  522. distance: !distance '3.21 km'
  523. name: ticket
  524. price_brutto: !sum '1.23 EUR'
  525. route_map: null
  526. passenger: !person
  527. first_name: Fabian Peter
  528. last_name: Hammerle
  529. ticket_url: https://www.example.com
  530. valid_from: 2016-07-14 13:50:04+01:05
  531. valid_until: 2016-07-14 18:50:04+00:00
  532. estimated_arrival_time: !period
  533. end: 2016-07-24T23:48:05+00:00
  534. start: 2016-07-24T23:47:02+02:00
  535. """],
  536. [get_shipping(), u"""!shipping
  537. destination_point: home
  538. price_brutto: !sum 1.23 EUR
  539. tracking_number: LX123456789CN
  540. """],
  541. [get_order_a(), u"""!order
  542. customer_id: customer
  543. discounts:
  544. - !discount
  545. amount: !sum '1.23 EUR'
  546. name: discount a
  547. - !discount
  548. amount: !sum '20.45 EUR'
  549. name: discount β
  550. items:
  551. - !item
  552. name: item a
  553. price_brutto: !sum '1.23 EUR'
  554. - !item
  555. name: item β
  556. price_brutto: !sum '20.45 EUR'
  557. order_date: 2016-05-08 00:18:17
  558. order_id: id
  559. platform: platformπ
  560. """],
  561. [get_article(), u"""!article
  562. authors:
  563. - a
  564. - b
  565. delivery_date: null
  566. features: supergeil
  567. name: article name
  568. price_brutto: !sum '1.23 EUR'
  569. product_id: 0815
  570. quantity: 1
  571. reseller: seller
  572. shipper: shipper
  573. state: goood
  574. depth: !distance 12.3 dm
  575. height: !distance 123.0 cm
  576. maximum_load: !figure 40.0 kg
  577. width: !distance 1.23 m
  578. """],
  579. [get_taxi_ride(), u"""!taxi-ride
  580. arrival_time: 2016-05-02 18:10:00+01:05
  581. departure_point: home
  582. departure_time: 2016-05-02 18:25:00+01:05
  583. destination_point: city
  584. distance: !distance '3.21 km'
  585. driver: driver
  586. name: taxi ride
  587. price_brutto: !sum '1.23 EUR'
  588. route_map: null
  589. """],
  590. [get_invoice(), u"""!invoice
  591. creditor: platformπ
  592. debitor_id: customer
  593. invoice_date: 2016-05-08T00:18:17
  594. invoice_id: id
  595. items:
  596. - !item
  597. name: item a
  598. price_brutto: !sum '1.23 EUR'
  599. - !item
  600. name: item β
  601. price_brutto: !sum '20.45 EUR'
  602. discounts:
  603. - !discount
  604. name: discount a
  605. amount: !sum 1.23 EUR
  606. """],
  607. ])
  608. def test_from_yaml(expected_object, source_yaml):
  609. class Loader(yaml.Loader):
  610. pass
  611. ioex.datetimeex.Duration.register_yaml_constructor(Loader)
  612. ioex.datetimeex.Period.register_yaml_constructor(Loader)
  613. ioex.calcex.Figure.register_yaml_constructor(Loader)
  614. finoex.Sum.register_yaml_constructor(Loader)
  615. finoex.Distance.register_yaml_constructor(Loader)
  616. loaded_object = yaml.load(source_yaml, Loader=Loader)
  617. assert loaded_object == expected_object