django-ledger 0.7.2__py3-none-any.whl → 0.7.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of django-ledger might be problematic. Click here for more details.

Files changed (75) hide show
  1. django_ledger/__init__.py +1 -1
  2. django_ledger/forms/account.py +4 -1
  3. django_ledger/io/io_core.py +3 -1
  4. django_ledger/models/data_import.py +1 -0
  5. django_ledger/models/mixins.py +5 -5
  6. django_ledger/static/django_ledger/bundle/djetler.bundle.js +1 -1
  7. django_ledger/static/django_ledger/bundle/styles.bundle.js +1 -1
  8. django_ledger/templates/django_ledger/account/tags/account_txs_table.html +1 -1
  9. django_ledger/templates/django_ledger/bills/bill_update.html +1 -1
  10. django_ledger/templates/django_ledger/components/icon.html +1 -1
  11. django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html +8 -1
  12. django_ledger/templates/django_ledger/financial_statements/balance_sheet.html +1 -0
  13. django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html +4 -4
  14. django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html +118 -0
  15. django_ledger/templates/django_ledger/includes/nav.html +9 -5
  16. django_ledger/templates/django_ledger/invoice/includes/card_invoice.html +69 -69
  17. django_ledger/templatetags/django_ledger.py +11 -3
  18. django_ledger/views/account.py +1 -1
  19. django_ledger/views/mixins.py +6 -18
  20. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/METADATA +1 -1
  21. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/RECORD +25 -75
  22. assets/node_modules/node-gyp/gyp/gyp_main.py +0 -45
  23. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -367
  24. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
  25. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1270
  26. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
  27. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
  28. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -153
  29. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -271
  30. assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
  31. assets/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -666
  32. assets/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -654
  33. assets/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -78
  34. assets/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -165
  35. assets/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -109
  36. assets/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
  37. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  38. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -808
  39. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1173
  40. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1321
  41. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -120
  42. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -103
  43. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -464
  44. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
  45. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -58
  46. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2518
  47. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3978
  48. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
  49. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2936
  50. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -55
  51. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1394
  52. assets/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -25
  53. assets/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3137
  54. assets/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -98
  55. assets/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -771
  56. assets/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1271
  57. assets/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
  58. assets/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
  59. assets/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -374
  60. assets/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1939
  61. assets/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -302
  62. assets/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3197
  63. assets/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
  64. assets/node_modules/node-gyp/gyp/setup.py +0 -42
  65. assets/node_modules/node-gyp/gyp/test_gyp.py +0 -260
  66. assets/node_modules/node-gyp/gyp/tools/graphviz.py +0 -102
  67. assets/node_modules/node-gyp/gyp/tools/pretty_gyp.py +0 -156
  68. assets/node_modules/node-gyp/gyp/tools/pretty_sln.py +0 -181
  69. assets/node_modules/node-gyp/gyp/tools/pretty_vcproj.py +0 -339
  70. assets/node_modules/node-gyp/test/fixtures/test-charmap.py +0 -31
  71. assets/node_modules/node-gyp/update-gyp.py +0 -46
  72. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/AUTHORS.md +0 -0
  73. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/LICENSE +0 -0
  74. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/WHEEL +0 -0
  75. {django_ledger-0.7.2.dist-info → django_ledger-0.7.3.dist-info}/top_level.txt +0 -0
@@ -1,54 +1,4 @@
1
- assets/node_modules/node-gyp/update-gyp.py,sha256=Z6tYQsScBZviTYoPN_C5blWRJs_LV5trQnHDAz3QUOM,1618
2
- assets/node_modules/node-gyp/gyp/gyp_main.py,sha256=TKap39uxgEHBG71L2EHsDNlq6rjO51DfxIqNAqmVUeQ,1250
3
- assets/node_modules/node-gyp/gyp/setup.py,sha256=D4sZ80H2l8w9R3vFEMN-iqmsAb3ReiJUcb4vAkGoOw4,1443
4
- assets/node_modules/node-gyp/gyp/test_gyp.py,sha256=97F8tmSLw3JL9_oTI8pJPuQsTxIsgAkdQIaDmYsFrgo,7660
5
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py,sha256=M1RR_KWuAeAwDn-K6Pr2FJEACATORKRMfHMd_MAEUfc,13095
6
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py,sha256=6MmNjOzIfDbDlOehFTtZd8CMuUZ2Tz1BI0wOOFbLGsg,6743
7
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py,sha256=rGJvPKpQYKxBSAI9J_47leB0pW1vG5_Y8rhtMDKcnw4,45350
8
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py,sha256=9_arXFKR13bKumQiHb6Ntx5LXs9gKUnXxEGBIGoAfPU,74297
9
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py,sha256=n4fmY-ytaeDxI-dJuhJ0NrZwyI4cPFrgIqy1_yZk168,1789
10
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py,sha256=9bJuWDGiqihOVA2m2vjWMSP3GygIW9SUU9waX7r1OSQ,5333
11
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py,sha256=_DhKwG62bH3M7hFtt9SFflzNzKQ8VgnDbnF6-zX89vQ,10231
12
- assets/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py,sha256=gFI8yuVbAd6vaAgotWIOu3_YKA_S1qduewkE9SoLStI,19742
13
- assets/node_modules/node-gyp/gyp/pylib/gyp/__init__.py,sha256=1aBIeaEBZtH0hXuqRxk1H7vlQXvpcJDQ7-LGfMgk_A4,23329
14
- assets/node_modules/node-gyp/gyp/pylib/gyp/common.py,sha256=JygfEvZ0wSKk7lceiwCOC1PcLRMUgFMDEPTCkSnQY9Q,22622
15
- assets/node_modules/node-gyp/gyp/pylib/gyp/common_test.py,sha256=BE9RsQS_Ctr6dvYYvnCPwezr3KHG0TwuO3F93RMTRA0,2162
16
- assets/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py,sha256=NMty-L31EeebkBSHFsTrNP50_g2ZDoA4Bg0ttJg715U,5287
17
- assets/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py,sha256=LqZMx7rd1Si70A4iLn5sn6s4-AcgOX0lHuq3Tc3cVXA,3709
18
- assets/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py,sha256=v1g5c9abJBfotjVFn_mIBCLlEukV6AxGuNy5qqH_sIM,1859
19
- assets/node_modules/node-gyp/gyp/pylib/gyp/input.py,sha256=ULb3T3A_UvdDbWqhGAfIN05vTLD5hR6iHcLpx_tuF84,127052
20
- assets/node_modules/node-gyp/gyp/pylib/gyp/input_test.py,sha256=4exbgFIvR9AYdbQC8GOtRwMBwf47_F_1Opbe46nQZl4,3425
21
- assets/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py,sha256=tu6ghdxyURaBvoSkHGYS4L3J4RavXQL-EuRCvwa9x28,30260
22
- assets/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py,sha256=pM32_3Vxy0xaS6fSPkX3WwcwIhPyQ9miuGpFrjhpbzo,54358
23
- assets/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py,sha256=zMHkB8l0O7oRkuYFoaN9dotnbATBHZgErQztwE_W648,5640
24
- assets/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py,sha256=2V-wVMJ9TQ94aAQ9Omph4w_4DFCm_UGmG_L4alylB80,1293
25
- assets/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py,sha256=lVu0PFyeVDu1E4oJ-ogv0HrhiNt5H6ZA2u-KIMpTzoY,15164
26
- assets/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py,sha256=8utEj-5VtWTRk5SU6gVh7LstOs6ksCT-eb5sVWMHsYE,81834
27
- assets/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py,sha256=Qz1_dQPXMP9M-hRd6gqBV7cZrBvT1P1ZP2vU5_4zyzA,12124
28
- assets/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py,sha256=JoQatMXiR_ItS5OFPfxUq334ettq3aLvuEmXbGCqSJI,135717
29
- assets/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py,sha256=-z0nf3UnZa7vNw0uwxYYhISHrN6eSHIEVsGjiEaAuBg,2245
30
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py,sha256=eGCO7UOdVunYZT7P9h6ONWION8XCH3i0fyyNPDUonWs,31684
32
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py,sha256=D-uMzT5oGRNCUrUUK88N16wUQkRdfFFyJZW0ICPMoe8,49966
33
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py,sha256=caFBrFQ13MfwupnzOslPP4Ho1KSx69Z5xZ6GUrN95LM,49248
34
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py,sha256=xrZUCI1-IbmkZywA1dInU5AFoGjEY0I_n_7W_bIiJP8,4591
35
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py,sha256=PV2nEeLA36N2UWQOLuW5DwYnvfMOqFbEcA9pkqKcYaU,3101
36
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py,sha256=KBfjTlRnxw8eStp8XBZUx-juoY-tCM8E66_KuvGA2Nc,17554
37
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py,sha256=kJ0H3ibKUVWqQAlujODgbtErDgX6LcmLf_v6UCdNpdE,3505
38
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py,sha256=1m9SMdK0fA2XHmMkwaZkAxCzDI7_y24WAmIjWLTUi6E,1713
39
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py,sha256=mgR3QjJuvQwRkbDfcCtLVwRtu_lRt57vRoeOgApU0K8,102224
40
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py,sha256=6gLyo4yHcwzuAs-LkjYwbeSPLA4cnsa1EKdgO6qTFK8,150465
41
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py,sha256=eXLZIXG5cFdvxm9sF5VST4Ik3NIN03-fGzrdJbuqoaI,1266
42
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py,sha256=iXFQuMzSGtrO_FctjUsbu0Qi8tUl5QdGDlaaeiP7paw,118398
43
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py,sha256=13XIPCPQQTHyZncCcCgo4qLLGGnu_t7QT-O7Qs-HZgI,1910
44
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py,sha256=a_HosG5lWPwe8Ac0n0rm0Thmktr6DSa1VshImcd3PhQ,66115
45
- assets/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py,sha256=qmzary0-tz_K48cGRiVwyZnvbQUgE5Mzqqblfjs-RjY,672
46
- assets/node_modules/node-gyp/gyp/tools/graphviz.py,sha256=FYB7MrLbf4yocdAvNAl3rIxCKSIxKGFUUPPrWipeq4A,3063
47
- assets/node_modules/node-gyp/gyp/tools/pretty_gyp.py,sha256=2ZCRPW-MZfK7gdnCIaqhH9qc8aQRLbMpOqJkS3WWC3A,5028
48
- assets/node_modules/node-gyp/gyp/tools/pretty_sln.py,sha256=b_Fxm-SXUCPL3Tix4EyNwZNmQ-zkeRIFFmuL0R5wFhw,5482
49
- assets/node_modules/node-gyp/gyp/tools/pretty_vcproj.py,sha256=AwQrxK1F-jhjsbbT35XQjrvWNbc3IBFaKXoJogqMh_o,10633
50
- assets/node_modules/node-gyp/test/fixtures/test-charmap.py,sha256=5raXzaQnO2eJnrlFtlDtWftryhZX7Fj0amFW3hdSnhE,547
51
- django_ledger/__init__.py,sha256=CX_J_4RTT4BUlffHbyF7VMYkSXKUovsClUss_XdeLJY,380
1
+ django_ledger/__init__.py,sha256=0W425c0YkRmn5Gjb2NanlPn2b4IJN3xyuXqZVyqypB0,380
52
2
  django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
53
3
  django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
54
4
  django_ledger/settings.py,sha256=LX2QVtwm4YwAJrfN1VplJlQ310-NeIg-wpRz5QdFJTk,8906
@@ -93,7 +43,7 @@ django_ledger/contrib/django_ledger_graphene/unit/schema.py,sha256=orR4tn1ORTfzL
93
43
  django_ledger/contrib/django_ledger_graphene/vendor/mutations.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
44
  django_ledger/contrib/django_ledger_graphene/vendor/schema.py,sha256=Y20FR0gut0yNsROL_f1LSHdzn7wM4_voKQv--evVGG4,1453
95
45
  django_ledger/forms/__init__.py,sha256=N7iaeMO5xTU-q7RXTVYUy-fu8nMZbiIJ9QEtDCjsTdI,205
96
- django_ledger/forms/account.py,sha256=L8lDjxqz7GU_qtM2-LEa38iwkiv7eatEziAre07bHUg,5183
46
+ django_ledger/forms/account.py,sha256=1-L3-fy63sqz_pV1Wd0nxFsFzEW5WLKDAvjGv9aUN4M,5284
97
47
  django_ledger/forms/app_filters.py,sha256=fHmftiuR1Ei28LhGuu7LoxS4Q5pVjj1wiT0fF4GUcUI,2293
98
48
  django_ledger/forms/auth.py,sha256=HaJDEIRFoAHEAv-s_ZfTe0rZbhzIQ7GkKnaBX1qiAW4,736
99
49
  django_ledger/forms/bank_account.py,sha256=kCRZnhxN54MBBinRp_L0N5g7yUIOvIkXbJtuB8Cu2D4,4640
@@ -116,7 +66,7 @@ django_ledger/forms/utils.py,sha256=sgkwBZs15_rZ5NT7h-8Z7wi3-ItM1E1sqoVDo3NQ5Jc,
116
66
  django_ledger/forms/vendor.py,sha256=Nuh8MmSpz4ycMZwiVe--U9Ec6ezIsfACHDkhA2SyiZ4,2215
117
67
  django_ledger/io/__init__.py,sha256=8m5AoBRiG2ymrX0Y4LVjq0275i7I5Sk7YRa1BTzVofI,369
118
68
  django_ledger/io/io_context.py,sha256=xgykRoB6hVSN2q20f62j_4zbOeAHU5ZgbZaSwRaSkOU,4444
119
- django_ledger/io/io_core.py,sha256=az1HEBbNWHJiyOoaO1_yWj2ehSMnEjWHMy9Oug5ylXI,46902
69
+ django_ledger/io/io_core.py,sha256=kIGLqYNqboOJt-8Om1earLqjYMOzWuRYYZf23LJ8IhI,47001
120
70
  django_ledger/io/io_generator.py,sha256=JF4plsABUkCIrtI2X-YD7o5eNghRIgLUseNcBIGOj3U,34613
121
71
  django_ledger/io/io_library.py,sha256=4So7fmmb6SfDAn4kXHlvPC7FWc3yrzbx2g5ShiY9wG4,22494
122
72
  django_ledger/io/io_middleware.py,sha256=vbWIBYA4V9nwoiEtB0W9pq19QIwPmaAyVJlo_1Gg2BY,20284
@@ -153,14 +103,14 @@ django_ledger/models/chart_of_accounts.py,sha256=YxTmqy3FrTmqUCub-18GTtTRDCqVpWT
153
103
  django_ledger/models/closing_entry.py,sha256=MKCy-q0LJUL2LP3g3y-OwP0SdcJAPssXwhLCKgp1nM0,17912
154
104
  django_ledger/models/coa_default.py,sha256=CK4vOZ73QePciZUL93wigDXpxKamdXAKBaQR7r-G7tk,27482
155
105
  django_ledger/models/customer.py,sha256=EeynuiYFx7ME7iCtUzvaURUnY4yRqKA-9hrSiv6Bs0Y,11806
156
- django_ledger/models/data_import.py,sha256=lAWoEw9Bh-0R1no4HjHaO6c8Fps2bn3qtEaAAFt894M,20414
106
+ django_ledger/models/data_import.py,sha256=3NHL5mrSLXSG-NDn8EK8KCJiX35Z8gRWExc4fZcQhz8,20496
157
107
  django_ledger/models/entity.py,sha256=XXvpD-AMcNQP6k6JlHy9dAHUfIQQesvaRol9sJCBais,123770
158
108
  django_ledger/models/estimate.py,sha256=EPkGMJwn3bkyYYeVHOfyLeWqtlJIyjF8fUc36dLz_18,58107
159
109
  django_ledger/models/invoice.py,sha256=bbFq1vEQRJ3NcScutOM1LB3Vg0XELxK856Ned_u3NfI,62867
160
110
  django_ledger/models/items.py,sha256=-l_ibAiJTu4dO7TZUdGD4sq524Ew8oIwhq_hiHVUDeY,55251
161
111
  django_ledger/models/journal_entry.py,sha256=KlATZhW7lT4L5hy0GRQMdkrqcgaiGVREwQU7kEO09sI,54293
162
112
  django_ledger/models/ledger.py,sha256=68OHNANMK050_7s5NEj-n2FBY8JUnBaVsHDm2LItrMs,25034
163
- django_ledger/models/mixins.py,sha256=HtT76Su3HkJy8j-18rUeqe01kJC95EsJFP_QeWxssJ8,52046
113
+ django_ledger/models/mixins.py,sha256=hsM5XC6LzSYHqv0hg1yxia8qirm8pZGafGPNmGOrGEg,52056
164
114
  django_ledger/models/purchase_order.py,sha256=YFbtRGO0FW4nOnKy2OAQoI6pdA-kt3IhqjpyxKxNvwg,44197
165
115
  django_ledger/models/signals.py,sha256=3cm_8--Jz-Jb0fPgrVmm5xx_jKFARV6_A29VDjqHeIw,1563
166
116
  django_ledger/models/transactions.py,sha256=FWITorLpDyGm2Wunw7WVXizP2xadaBEYhtx5LcL6Vb4,23333
@@ -179,8 +129,8 @@ django_ledger/report/core.py,sha256=MSWOHvYrAfAJJtm1_vXv7vZxgAja6ycKxknoaIvJT_g,
179
129
  django_ledger/report/income_statement.py,sha256=m4pG0Yjpl7SELx3-yYKT4dCluKt6nT2bkD9gay9tNKI,11156
180
130
  django_ledger/static/.DS_Store,sha256=ohv3-BA3m5CUHedTAFiR2MLIeBhMNEz_a0LMOFhljzc,6148
181
131
  django_ledger/static/django_ledger/.DS_Store,sha256=EDcdC71oJjK355v2FDhienPd1ek36-Zl8YjoiTltcpk,8196
182
- django_ledger/static/django_ledger/bundle/djetler.bundle.js,sha256=1UzHryjoKN43wUa5b6N2ia2yoE-TCrtfNMnuPIf9Im8,547613
183
- django_ledger/static/django_ledger/bundle/styles.bundle.js,sha256=myDLVMYHwKTxypheUretM6MZ4HhK8Yn0BqB_OGUW3KU,506543
132
+ django_ledger/static/django_ledger/bundle/djetler.bundle.js,sha256=kTHqgMK1QbX-Yc192tyLANsuRjSH_94aDNz5EahGU0s,585360
133
+ django_ledger/static/django_ledger/bundle/styles.bundle.js,sha256=qlpwKrCVyhi5mcS5dZ36AZLORSis9sgXzRZJRFTWzMg,769929
184
134
  django_ledger/static/django_ledger/img/daniel-weiss-aj2Os9mYgJU-unsplash.jpg,sha256=zYNOMM56QE4AdRkvdGRNifDqj4OJcUA49oebJqsRjuQ,276317
185
135
  django_ledger/static/django_ledger/img/made-with-bulma.png,sha256=eHFH1XGGq3Wn9sN35Jok2jxaCQu7nIravVVHNTAr7n0,19456
186
136
  django_ledger/static/django_ledger/logo/django-ledger-logo-report.png,sha256=qNna-6tnwHFbVhA8Yb1UFSpepVkRJS3WlJa75I2euN8,23985
@@ -239,7 +189,7 @@ django_ledger/templates/django_ledger/account/account_create_child.html,sha256=i
239
189
  django_ledger/templates/django_ledger/account/account_detail.html,sha256=m-UTWD9YqoM9JWKug4alY4DIql13jYFrJG2BmdYSZ7s,934
240
190
  django_ledger/templates/django_ledger/account/account_list.html,sha256=0kDNrzcMgMewiBQGqjkPCUHErmOiVz6uy1FnwzclMjc,1019
241
191
  django_ledger/templates/django_ledger/account/account_update.html,sha256=FzNFcARbhZUUTTi6Sv-PQJi7XzjLsOfrUnR7lIvIlhc,1113
242
- django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=pkRweHkUAIBYsRyjj0onjg-wdrlfsHir2hnzwD8xWiU,3495
192
+ django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=CNl3i5jp_7UPNV2bm60MN5w2SRGph-w_3PgzBzZpUxI,3483
243
193
  django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=yPf2gB77_sgSGfbRQPDWco1kHSbbnQ7H4ujrMm1Q9yA,7532
244
194
  django_ledger/templates/django_ledger/auth/login.html,sha256=UYV2rxjEn9cXBbG6Ww93k6yMPJtOo5vpX6sod61ewKs,1849
245
195
  django_ledger/templates/django_ledger/bank_account/bank_account_create.html,sha256=zoCvV-_2aBAXCnCfHTFI18Pn7hbEcOkgtcgYOQ2IJIg,1258
@@ -250,7 +200,7 @@ django_ledger/templates/django_ledger/bills/bill_create.html,sha256=fUskaN-ORsj_
250
200
  django_ledger/templates/django_ledger/bills/bill_delete.html,sha256=IHqXETgrbmMWnrymJv7iAAcDcBvRV9tFgoqHWAUKlQE,1606
251
201
  django_ledger/templates/django_ledger/bills/bill_detail.html,sha256=nG5wrl9kjN1egihrwfRP0utwjPZ83gN678UzII25ty0,11756
252
202
  django_ledger/templates/django_ledger/bills/bill_list.html,sha256=-KAmz0bghVZ81DMzFbqaeu_93XmuuMEI6REtYc_P0PE,6336
253
- django_ledger/templates/django_ledger/bills/bill_update.html,sha256=H_K1Q1UKp66TzuEDVXLhqOTJozFHjSnyN2mcqpRH3m8,8650
203
+ django_ledger/templates/django_ledger/bills/bill_update.html,sha256=Sluzm-Dgcr1S9QgT_ermkT-P6UyQ1AR7meL33kSa3RM,8638
254
204
  django_ledger/templates/django_ledger/bills/bill_void.html,sha256=iQt9Nq1DL-LovkrMrvUwI87LO8jXZ3R0dL7YKPoZKDM,1354
255
205
  django_ledger/templates/django_ledger/bills/includes/card_bill.html,sha256=7bUT7Sx7oFHAs9ko1x3wBBhrOZnTAmrGR55S1vksm8g,14029
256
206
  django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html,sha256=tmBNZoaHhk6EsCtcdqAQdHJ0XyDFaFRYqxdCf2Xi5KU,4082
@@ -274,7 +224,7 @@ django_ledger/templates/django_ledger/components/date_picker.html,sha256=fWGSVpy
274
224
  django_ledger/templates/django_ledger/components/default_entity.html,sha256=SXBHT43XlbPf-GguHWBfXgDh-wG0s9dY0a9lc0KC0CY,361
275
225
  django_ledger/templates/django_ledger/components/feedback_button.html,sha256=S9sVY9o_CIvekoG7I9_QinjwKSlKSX0P6UGeE0cCWDY,3333
276
226
  django_ledger/templates/django_ledger/components/filters.html,sha256=iSBeSTpK8B9vi61HGwEyj7kN2Xex8CBr8ER8GLFRUT0,219
277
- django_ledger/templates/django_ledger/components/icon.html,sha256=vh_FZeQAb9Q_H9JJcNiDEzG8Ps0kzGiWkwG1H9fezdc,85
227
+ django_ledger/templates/django_ledger/components/icon.html,sha256=jVJNr_W8-_mdl0TsAXAK6Q6Lx8WowY0ZeXo9QOFdNzg,84
278
228
  django_ledger/templates/django_ledger/components/menu.html,sha256=m_RTyik8mLqaz4vwyulhq6r2MYpE1-grvJA4JVuSFtY,2077
279
229
  django_ledger/templates/django_ledger/components/modals.html,sha256=wGyR5ZS9VE70CZfd9dFy3WUGKd9zLxIre9daBuPnpFY,1517
280
230
  django_ledger/templates/django_ledger/components/modals_v2.html,sha256=9yuKdt-mEDaiGva_4EFgpAfRonVAyN0VeCnwaDfoOeQ,804
@@ -290,7 +240,7 @@ django_ledger/templates/django_ledger/data_import/import_job_create.html,sha256=
290
240
  django_ledger/templates/django_ledger/data_import/import_job_delete.html,sha256=qgobtrI-WNYFqhn8de05mcD-FQ0UGSLT6ZoaBlblXAU,944
291
241
  django_ledger/templates/django_ledger/data_import/import_job_update.html,sha256=ZDy391RSOXUq3keUs48QrVrI_ZicdNvDeLT_JacH17M,887
292
242
  django_ledger/templates/django_ledger/data_import/tags/data_import_job_list_table.html,sha256=y_U1xixMC9YPR4aq6F_cNpyb-dZ5qcVh9D6HSN9Xpps,2919
293
- django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html,sha256=e8dLP-VEPSh901KmpBSIZ635cPMM67okWzilbNpGNh4,1298
243
+ django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_imported.html,sha256=XSmY4PAnWaeLOzamwMrlZz1koJWmbQwptGDiqTGO9rg,1624
294
244
  django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_table.html,sha256=f-RJr7uw4v_s3XqMA9T7n0JDeIL0s-xdbdLmM1grvCk,3835
295
245
  django_ledger/templates/django_ledger/entity/entitiy_list.html,sha256=onM9uaWTm2oQ00OPIH5ki2FEfgjx7_EIOT8akuAhQM4,1507
296
246
  django_ledger/templates/django_ledger/entity/entity_create.html,sha256=TDayIv2qno7cT3xTCapKV6EZKcTTNfIMxXJFQmHHyz0,1387
@@ -311,17 +261,17 @@ django_ledger/templates/django_ledger/expense/expense_create.html,sha256=ozRliR0
311
261
  django_ledger/templates/django_ledger/expense/expense_list.html,sha256=d7IwuA2qrDPYKmg8a0b4T2CIzIfHB6ximk8Ak4VR4xY,867
312
262
  django_ledger/templates/django_ledger/expense/expense_update.html,sha256=7YTGqytGb1KFAiP7x3jZ-ljkXziqir6KnMiFrl_s8Kk,1439
313
263
  django_ledger/templates/django_ledger/expense/tags/expense_item_table.html,sha256=g0GXvHXrOwxRlvj4gKC7jX7x6SL4IN3O_g0Tcvnro6Y,2394
314
- django_ledger/templates/django_ledger/financial_statements/balance_sheet.html,sha256=_trd5e282eMsC5VfzP9tL7zPJ_kTGMxlrh77RWwLlY4,2793
264
+ django_ledger/templates/django_ledger/financial_statements/balance_sheet.html,sha256=hzIeT8lymMa4djP7l06InHGZ7FsoFe5sUnXvbVVOhFI,2794
315
265
  django_ledger/templates/django_ledger/financial_statements/cash_flow.html,sha256=zeu7OcXl2T_vDoFyJvb0htFIjQz0IfyJBiOcck2skus,3031
316
266
  django_ledger/templates/django_ledger/financial_statements/income_statement.html,sha256=pfrv12Bu_PmU-MrL7JXYX7Wv4PZ06fKvOdydzzgeEnw,2731
317
- django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html,sha256=fak-N9y_vtv2OeGj34iCaTaio5yPtpvXhAU5YmdC4IQ,6276
267
+ django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html,sha256=NX9h1zM9YekInxP0mRES10_uHMK9fqw0mpVo7dhe9Oo,6433
318
268
  django_ledger/templates/django_ledger/financial_statements/tags/cash_flow_statement.html,sha256=elJsMVmVJHZbZVhuo-bSykrrLoSZrN0JpUYm0LukY80,8961
319
- django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html,sha256=kLmnxHN5G9H7xYKFANLbfM0jAtNsmfhIrdltW-bhoPY,10442
269
+ django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html,sha256=FAHIr0bstOCg_Nlihu4AY_akzJ0QCJM6UAKVAK2t-CI,17711
320
270
  django_ledger/templates/django_ledger/includes/breadcrumbs.html,sha256=mSzAPpn7uCx33oXuNhbM-MQdam3QFOxl9TRH93hrS4w,183
321
271
  django_ledger/templates/django_ledger/includes/card_markdown.html,sha256=wKihCko89-F_gU4jJzsqjxDrjxgzVYFXK39cQPv8Sjc,804
322
272
  django_ledger/templates/django_ledger/includes/footer.html,sha256=etnULJWQRmSdtMFgxY-vT2-JQYyxxixa7xQ2K6qD1Wo,528
323
273
  django_ledger/templates/django_ledger/includes/messages.html,sha256=N_7BlYw9pJfzsv9gTUE4FFoUppWhbkxShd4UnQ81IfM,322
324
- django_ledger/templates/django_ledger/includes/nav.html,sha256=Vo0ois6-bQiuHvPixqtXqTuxPp6IeesZSHkPJsZArwU,1818
274
+ django_ledger/templates/django_ledger/includes/nav.html,sha256=fUFYiJoHV-Mf_fPsGzbLBq5kOnDHGC1XfNA_F5YZ3Kc,2004
325
275
  django_ledger/templates/django_ledger/includes/page_header.html,sha256=q2tL3SvFebET4CB_gJB_qRocMbDdijrNCoowoHCgthM,2353
326
276
  django_ledger/templates/django_ledger/includes/widget_bs.html,sha256=UxLVF8rdKwONQaRIE3IrWLYXD0XBs6wEMRGeLevbHwk,949
327
277
  django_ledger/templates/django_ledger/includes/widget_ic.html,sha256=IWSnAcMJMoAg9kf_XCBPBNGYUSXtgGurgPotkdsVrEM,1129
@@ -338,7 +288,7 @@ django_ledger/templates/django_ledger/invoice/invoice_delete.html,sha256=qkhsW6l
338
288
  django_ledger/templates/django_ledger/invoice/invoice_detail.html,sha256=FHlCCMBN4bai_BK7ScMzd4U9-xVYyveRTHkMOlLJ_ZE,10689
339
289
  django_ledger/templates/django_ledger/invoice/invoice_list.html,sha256=b5ysuDP-avrls4OSarSusySAKDFT1sM-jkQgWPPxpNw,5888
340
290
  django_ledger/templates/django_ledger/invoice/invoice_update.html,sha256=cVuth_WbELKi3RWDrIKLcfDAe0RH3OV8N5AireHK298,8640
341
- django_ledger/templates/django_ledger/invoice/includes/card_invoice.html,sha256=OHs3XcWxkYT6Sb4rQmNo_EiUVLksuj94AwG6PNtYaTY,13021
291
+ django_ledger/templates/django_ledger/invoice/includes/card_invoice.html,sha256=MwHTCGqTWTyzIICuyfR173tIu9k8I0IdYHtGsKtZAs8,12749
342
292
  django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html,sha256=ba4J_WINrpYmCaHAyKWDKwZ6ETQXI3NkQ_AV6Y5-2uM,3413
343
293
  django_ledger/templates/django_ledger/invoice/tags/invoice_table.html,sha256=fO1EKOAg26LxIztnfbT41I8N_wyIga-tGsCQ9tBoS5A,2596
344
294
  django_ledger/templates/django_ledger/journal_entry/je_create.html,sha256=UiKc0Uq4UJxjoO6iVDjyeMrT7uwvRmqfY3R0Y9zzPyg,1121
@@ -392,7 +342,7 @@ django_ledger/templates/django_ledger/vendor/vendor_update.html,sha256=4kBUlGgrg
392
342
  django_ledger/templates/django_ledger/vendor/includes/card_vendor.html,sha256=oCXyuqyF7CnJnDQdK0G0jdYLqtPWYSzwlv8oddyGJg8,1290
393
343
  django_ledger/templates/django_ledger/vendor/tags/vendor_table.html,sha256=YC-3T5x4oua3VBg1q690CRzoogKL8qFgQRp5jTKLFgk,3400
394
344
  django_ledger/templatetags/__init__.py,sha256=N7iaeMO5xTU-q7RXTVYUy-fu8nMZbiIJ9QEtDCjsTdI,205
395
- django_ledger/templatetags/django_ledger.py,sha256=NEJbi3tAFaK0-VBjFkRmtCXdpWoGMCkchqhh8PVjOQ0,31892
345
+ django_ledger/templatetags/django_ledger.py,sha256=1N--W7uRCMFzIOEtg0xC1bcGLbD8IZqV6fkhfVbgGQY,32176
396
346
  django_ledger/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
397
347
  django_ledger/tests/base.py,sha256=ddsMTzv0-17JD1QRobpTN2CVKL1v0lNplo78JaB36oQ,10842
398
348
  django_ledger/tests/test_accounts.py,sha256=bASqtQjp6twya8JrNkBXVMsOnK8E8Hl7B0J6RfDJGB0,6345
@@ -433,7 +383,7 @@ django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A9
433
383
  django_ledger/urls/unit.py,sha256=QEVKrgcw2dqMaaXsUHfqYecTa5-iaPlS9smrYJ1QsgM,1506
434
384
  django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
435
385
  django_ledger/views/__init__.py,sha256=fY9eBoPkx50p-kSalskd4QW1tHm3e64WpwOFuJzn4Xo,1178
436
- django_ledger/views/account.py,sha256=GBIJBy2ykhXl8x_5mfZjB6U5bCdhf81mWifn4a6nEuw,9067
386
+ django_ledger/views/account.py,sha256=EK_aytrag_0_ZXqBGDrLgHZ1ffv37jI2G4NS7XXTiBs,9087
437
387
  django_ledger/views/auth.py,sha256=I8Mv_aAfW-8Z5VYPOX7P3IUO4Fp5jJPkSuu1ZSVpWtI,777
438
388
  django_ledger/views/bank_account.py,sha256=9eeo2Y71PGt0yTOK1qIojV7024AZIQybynWAsw7Nd9Q,5024
439
389
  django_ledger/views/bill.py,sha256=5tNb3pyh8GQM4hjV0FXqCXrEQF2LwpEWLkOkpknEdjA,22239
@@ -452,14 +402,14 @@ django_ledger/views/invoice.py,sha256=BCCvQCtB1p7WBRQZeJakUhDJy4Fr5jvEYIDgLnZDh3
452
402
  django_ledger/views/item.py,sha256=WvwvNWe4Wu9tZWbm75iciNvaSxh9b8h_P_FHt4jsKXs,20604
453
403
  django_ledger/views/journal_entry.py,sha256=QaUz_HuUpbZCulpS7fsg2Q8nuKbxf8bXnQhcWRkAa-s,12141
454
404
  django_ledger/views/ledger.py,sha256=DrPXgC4iMvj1jY4x6Ka8elwaOnLUe1yM-bAkuJC9bLU,12677
455
- django_ledger/views/mixins.py,sha256=_v8y9RHOpSXhGdXoFU1LldDrOgso64MKDBNWUyWulzc,23648
405
+ django_ledger/views/mixins.py,sha256=wRCUU2BlsQOsr5Ku26YVWIJZ0dx-JZuvo6TCJNhWmxQ,23258
456
406
  django_ledger/views/purchase_order.py,sha256=CyftKrQWV1SBz7W0CvZOfZ81OPEiBHPD7b9zt1k6CFY,21088
457
407
  django_ledger/views/transactions.py,sha256=3ijtJzdLPFkqG7OYpe-7N4QVjCyR2yl5ht_9RyfquBA,212
458
408
  django_ledger/views/unit.py,sha256=MF9tEeWCOt5XrtK-UFmHFisyBM-h3WzgL6v8IX2Ynbk,10446
459
409
  django_ledger/views/vendor.py,sha256=qlkd3gsjZ6RYuPrRYDVZp-Im65calM9ed3KxsaT4cxw,3467
460
- django_ledger-0.7.2.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
461
- django_ledger-0.7.2.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
462
- django_ledger-0.7.2.dist-info/METADATA,sha256=XZ4MPmKkapPS3_Bjm64jcJOrHqRFFe6q652qqTtIa7g,8607
463
- django_ledger-0.7.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
464
- django_ledger-0.7.2.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
465
- django_ledger-0.7.2.dist-info/RECORD,,
410
+ django_ledger-0.7.3.dist-info/AUTHORS.md,sha256=ShPwf-qniJkbjRzX5_lqhmgoLMEYMSHSwKPXHZtWmyk,824
411
+ django_ledger-0.7.3.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
412
+ django_ledger-0.7.3.dist-info/METADATA,sha256=ngQ4s-2neFedPZuokb7WiKU_il5kwOZL8ZXtzXksgr4,8607
413
+ django_ledger-0.7.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
414
+ django_ledger-0.7.3.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
415
+ django_ledger-0.7.3.dist-info/RECORD,,
@@ -1,45 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- # Copyright (c) 2009 Google Inc. All rights reserved.
4
- # Use of this source code is governed by a BSD-style license that can be
5
- # found in the LICENSE file.
6
-
7
- import os
8
- import sys
9
- import subprocess
10
-
11
-
12
- def IsCygwin():
13
- # Function copied from pylib/gyp/common.py
14
- try:
15
- out = subprocess.Popen(
16
- "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
17
- )
18
- stdout, _ = out.communicate()
19
- return "CYGWIN" in stdout.decode("utf-8")
20
- except Exception:
21
- return False
22
-
23
-
24
- def UnixifyPath(path):
25
- try:
26
- if not IsCygwin():
27
- return path
28
- out = subprocess.Popen(
29
- ["cygpath", "-u", path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
30
- )
31
- stdout, _ = out.communicate()
32
- return stdout.decode("utf-8")
33
- except Exception:
34
- return path
35
-
36
-
37
- # Make sure we're using the version of pylib in this repo, not one installed
38
- # elsewhere on the system. Also convert to Unix style path on Cygwin systems,
39
- # else the 'gyp' library will not be found
40
- path = UnixifyPath(sys.argv[0])
41
- sys.path.insert(0, os.path.join(os.path.dirname(path), "pylib"))
42
- import gyp # noqa: E402
43
-
44
- if __name__ == "__main__":
45
- sys.exit(gyp.script_main())
@@ -1,367 +0,0 @@
1
- # Copyright (c) 2012 Google Inc. All rights reserved.
2
- # Use of this source code is governed by a BSD-style license that can be
3
- # found in the LICENSE file.
4
-
5
- """New implementation of Visual Studio project generation."""
6
-
7
- import hashlib
8
- import os
9
- import random
10
- from operator import attrgetter
11
-
12
- import gyp.common
13
-
14
-
15
- def cmp(x, y):
16
- return (x > y) - (x < y)
17
-
18
-
19
- # Initialize random number generator
20
- random.seed()
21
-
22
- # GUIDs for project types
23
- ENTRY_TYPE_GUIDS = {
24
- "project": "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}",
25
- "folder": "{2150E333-8FDC-42A3-9474-1A3956D46DE8}",
26
- }
27
-
28
- # ------------------------------------------------------------------------------
29
- # Helper functions
30
-
31
-
32
- def MakeGuid(name, seed="msvs_new"):
33
- """Returns a GUID for the specified target name.
34
-
35
- Args:
36
- name: Target name.
37
- seed: Seed for MD5 hash.
38
- Returns:
39
- A GUID-line string calculated from the name and seed.
40
-
41
- This generates something which looks like a GUID, but depends only on the
42
- name and seed. This means the same name/seed will always generate the same
43
- GUID, so that projects and solutions which refer to each other can explicitly
44
- determine the GUID to refer to explicitly. It also means that the GUID will
45
- not change when the project for a target is rebuilt.
46
- """
47
- # Calculate a MD5 signature for the seed and name.
48
- d = hashlib.md5((str(seed) + str(name)).encode("utf-8")).hexdigest().upper()
49
- # Convert most of the signature to GUID form (discard the rest)
50
- guid = (
51
- "{"
52
- + d[:8]
53
- + "-"
54
- + d[8:12]
55
- + "-"
56
- + d[12:16]
57
- + "-"
58
- + d[16:20]
59
- + "-"
60
- + d[20:32]
61
- + "}"
62
- )
63
- return guid
64
-
65
-
66
- # ------------------------------------------------------------------------------
67
-
68
-
69
- class MSVSSolutionEntry:
70
- def __cmp__(self, other):
71
- # Sort by name then guid (so things are in order on vs2008).
72
- return cmp((self.name, self.get_guid()), (other.name, other.get_guid()))
73
-
74
-
75
- class MSVSFolder(MSVSSolutionEntry):
76
- """Folder in a Visual Studio project or solution."""
77
-
78
- def __init__(self, path, name=None, entries=None, guid=None, items=None):
79
- """Initializes the folder.
80
-
81
- Args:
82
- path: Full path to the folder.
83
- name: Name of the folder.
84
- entries: List of folder entries to nest inside this folder. May contain
85
- Folder or Project objects. May be None, if the folder is empty.
86
- guid: GUID to use for folder, if not None.
87
- items: List of solution items to include in the folder project. May be
88
- None, if the folder does not directly contain items.
89
- """
90
- if name:
91
- self.name = name
92
- else:
93
- # Use last layer.
94
- self.name = os.path.basename(path)
95
-
96
- self.path = path
97
- self.guid = guid
98
-
99
- # Copy passed lists (or set to empty lists)
100
- self.entries = sorted(entries or [], key=attrgetter("path"))
101
- self.items = list(items or [])
102
-
103
- self.entry_type_guid = ENTRY_TYPE_GUIDS["folder"]
104
-
105
- def get_guid(self):
106
- if self.guid is None:
107
- # Use consistent guids for folders (so things don't regenerate).
108
- self.guid = MakeGuid(self.path, seed="msvs_folder")
109
- return self.guid
110
-
111
-
112
- # ------------------------------------------------------------------------------
113
-
114
-
115
- class MSVSProject(MSVSSolutionEntry):
116
- """Visual Studio project."""
117
-
118
- def __init__(
119
- self,
120
- path,
121
- name=None,
122
- dependencies=None,
123
- guid=None,
124
- spec=None,
125
- build_file=None,
126
- config_platform_overrides=None,
127
- fixpath_prefix=None,
128
- ):
129
- """Initializes the project.
130
-
131
- Args:
132
- path: Absolute path to the project file.
133
- name: Name of project. If None, the name will be the same as the base
134
- name of the project file.
135
- dependencies: List of other Project objects this project is dependent
136
- upon, if not None.
137
- guid: GUID to use for project, if not None.
138
- spec: Dictionary specifying how to build this project.
139
- build_file: Filename of the .gyp file that the vcproj file comes from.
140
- config_platform_overrides: optional dict of configuration platforms to
141
- used in place of the default for this target.
142
- fixpath_prefix: the path used to adjust the behavior of _fixpath
143
- """
144
- self.path = path
145
- self.guid = guid
146
- self.spec = spec
147
- self.build_file = build_file
148
- # Use project filename if name not specified
149
- self.name = name or os.path.splitext(os.path.basename(path))[0]
150
-
151
- # Copy passed lists (or set to empty lists)
152
- self.dependencies = list(dependencies or [])
153
-
154
- self.entry_type_guid = ENTRY_TYPE_GUIDS["project"]
155
-
156
- if config_platform_overrides:
157
- self.config_platform_overrides = config_platform_overrides
158
- else:
159
- self.config_platform_overrides = {}
160
- self.fixpath_prefix = fixpath_prefix
161
- self.msbuild_toolset = None
162
-
163
- def set_dependencies(self, dependencies):
164
- self.dependencies = list(dependencies or [])
165
-
166
- def get_guid(self):
167
- if self.guid is None:
168
- # Set GUID from path
169
- # TODO(rspangler): This is fragile.
170
- # 1. We can't just use the project filename sans path, since there could
171
- # be multiple projects with the same base name (for example,
172
- # foo/unittest.vcproj and bar/unittest.vcproj).
173
- # 2. The path needs to be relative to $SOURCE_ROOT, so that the project
174
- # GUID is the same whether it's included from base/base.sln or
175
- # foo/bar/baz/baz.sln.
176
- # 3. The GUID needs to be the same each time this builder is invoked, so
177
- # that we don't need to rebuild the solution when the project changes.
178
- # 4. We should be able to handle pre-built project files by reading the
179
- # GUID from the files.
180
- self.guid = MakeGuid(self.name)
181
- return self.guid
182
-
183
- def set_msbuild_toolset(self, msbuild_toolset):
184
- self.msbuild_toolset = msbuild_toolset
185
-
186
-
187
- # ------------------------------------------------------------------------------
188
-
189
-
190
- class MSVSSolution:
191
- """Visual Studio solution."""
192
-
193
- def __init__(
194
- self, path, version, entries=None, variants=None, websiteProperties=True
195
- ):
196
- """Initializes the solution.
197
-
198
- Args:
199
- path: Path to solution file.
200
- version: Format version to emit.
201
- entries: List of entries in solution. May contain Folder or Project
202
- objects. May be None, if the folder is empty.
203
- variants: List of build variant strings. If none, a default list will
204
- be used.
205
- websiteProperties: Flag to decide if the website properties section
206
- is generated.
207
- """
208
- self.path = path
209
- self.websiteProperties = websiteProperties
210
- self.version = version
211
-
212
- # Copy passed lists (or set to empty lists)
213
- self.entries = list(entries or [])
214
-
215
- if variants:
216
- # Copy passed list
217
- self.variants = variants[:]
218
- else:
219
- # Use default
220
- self.variants = ["Debug|Win32", "Release|Win32"]
221
- # TODO(rspangler): Need to be able to handle a mapping of solution config
222
- # to project config. Should we be able to handle variants being a dict,
223
- # or add a separate variant_map variable? If it's a dict, we can't
224
- # guarantee the order of variants since dict keys aren't ordered.
225
-
226
- # TODO(rspangler): Automatically write to disk for now; should delay until
227
- # node-evaluation time.
228
- self.Write()
229
-
230
- def Write(self, writer=gyp.common.WriteOnDiff):
231
- """Writes the solution file to disk.
232
-
233
- Raises:
234
- IndexError: An entry appears multiple times.
235
- """
236
- # Walk the entry tree and collect all the folders and projects.
237
- all_entries = set()
238
- entries_to_check = self.entries[:]
239
- while entries_to_check:
240
- e = entries_to_check.pop(0)
241
-
242
- # If this entry has been visited, nothing to do.
243
- if e in all_entries:
244
- continue
245
-
246
- all_entries.add(e)
247
-
248
- # If this is a folder, check its entries too.
249
- if isinstance(e, MSVSFolder):
250
- entries_to_check += e.entries
251
-
252
- all_entries = sorted(all_entries, key=attrgetter("path"))
253
-
254
- # Open file and print header
255
- f = writer(self.path)
256
- f.write(
257
- "Microsoft Visual Studio Solution File, "
258
- "Format Version %s\r\n" % self.version.SolutionVersion()
259
- )
260
- f.write("# %s\r\n" % self.version.Description())
261
-
262
- # Project entries
263
- sln_root = os.path.split(self.path)[0]
264
- for e in all_entries:
265
- relative_path = gyp.common.RelativePath(e.path, sln_root)
266
- # msbuild does not accept an empty folder_name.
267
- # use '.' in case relative_path is empty.
268
- folder_name = relative_path.replace("/", "\\") or "."
269
- f.write(
270
- 'Project("%s") = "%s", "%s", "%s"\r\n'
271
- % (
272
- e.entry_type_guid, # Entry type GUID
273
- e.name, # Folder name
274
- folder_name, # Folder name (again)
275
- e.get_guid(), # Entry GUID
276
- )
277
- )
278
-
279
- # TODO(rspangler): Need a way to configure this stuff
280
- if self.websiteProperties:
281
- f.write(
282
- "\tProjectSection(WebsiteProperties) = preProject\r\n"
283
- '\t\tDebug.AspNetCompiler.Debug = "True"\r\n'
284
- '\t\tRelease.AspNetCompiler.Debug = "False"\r\n'
285
- "\tEndProjectSection\r\n"
286
- )
287
-
288
- if isinstance(e, MSVSFolder):
289
- if e.items:
290
- f.write("\tProjectSection(SolutionItems) = preProject\r\n")
291
- for i in e.items:
292
- f.write(f"\t\t{i} = {i}\r\n")
293
- f.write("\tEndProjectSection\r\n")
294
-
295
- if isinstance(e, MSVSProject):
296
- if e.dependencies:
297
- f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
298
- for d in e.dependencies:
299
- f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n")
300
- f.write("\tEndProjectSection\r\n")
301
-
302
- f.write("EndProject\r\n")
303
-
304
- # Global section
305
- f.write("Global\r\n")
306
-
307
- # Configurations (variants)
308
- f.write("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n")
309
- for v in self.variants:
310
- f.write(f"\t\t{v} = {v}\r\n")
311
- f.write("\tEndGlobalSection\r\n")
312
-
313
- # Sort config guids for easier diffing of solution changes.
314
- config_guids = []
315
- config_guids_overrides = {}
316
- for e in all_entries:
317
- if isinstance(e, MSVSProject):
318
- config_guids.append(e.get_guid())
319
- config_guids_overrides[e.get_guid()] = e.config_platform_overrides
320
- config_guids.sort()
321
-
322
- f.write("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n")
323
- for g in config_guids:
324
- for v in self.variants:
325
- nv = config_guids_overrides[g].get(v, v)
326
- # Pick which project configuration to build for this solution
327
- # configuration.
328
- f.write(
329
- "\t\t%s.%s.ActiveCfg = %s\r\n"
330
- % (
331
- g, # Project GUID
332
- v, # Solution build configuration
333
- nv, # Project build config for that solution config
334
- )
335
- )
336
-
337
- # Enable project in this solution configuration.
338
- f.write(
339
- "\t\t%s.%s.Build.0 = %s\r\n"
340
- % (
341
- g, # Project GUID
342
- v, # Solution build configuration
343
- nv, # Project build config for that solution config
344
- )
345
- )
346
- f.write("\tEndGlobalSection\r\n")
347
-
348
- # TODO(rspangler): Should be able to configure this stuff too (though I've
349
- # never seen this be any different)
350
- f.write("\tGlobalSection(SolutionProperties) = preSolution\r\n")
351
- f.write("\t\tHideSolutionNode = FALSE\r\n")
352
- f.write("\tEndGlobalSection\r\n")
353
-
354
- # Folder mappings
355
- # Omit this section if there are no folders
356
- if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]):
357
- f.write("\tGlobalSection(NestedProjects) = preSolution\r\n")
358
- for e in all_entries:
359
- if not isinstance(e, MSVSFolder):
360
- continue # Does not apply to projects, only folders
361
- for subentry in e.entries:
362
- f.write(f"\t\t{subentry.get_guid()} = {e.get_guid()}\r\n")
363
- f.write("\tEndGlobalSection\r\n")
364
-
365
- f.write("EndGlobal\r\n")
366
-
367
- f.close()