test_yaml.py 19 KB

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