test_yaml.py 20 KB

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