bbfmodels 0.1.0__tar.gz → 0.3.0__tar.gz

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.
Files changed (586) hide show
  1. bbfmodels-0.3.0/.github/workflows/announce-release.yml +70 -0
  2. bbfmodels-0.3.0/.release-please-manifest.json +3 -0
  3. bbfmodels-0.3.0/CHANGELOG.md +32 -0
  4. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/CLAUDE.md +6 -1
  5. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/CONTRIBUTING.md +2 -1
  6. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/Makefile +4 -1
  7. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/PKG-INFO +32 -8
  8. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/README.md +31 -7
  9. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/README.md +2 -0
  10. bbfmodels-0.3.0/context/decisions/0010-generated-python-packages.md +64 -0
  11. bbfmodels-0.3.0/context/decisions/0011-typed-paths-are-a-stub-over-the-schema.md +44 -0
  12. bbfmodels-0.3.0/docs/guides/cli.md +22 -0
  13. bbfmodels-0.3.0/docs/guides/documents.md +117 -0
  14. bbfmodels-0.3.0/docs/guides/models.md +146 -0
  15. bbfmodels-0.3.0/docs/guides/paths.md +86 -0
  16. bbfmodels-0.3.0/docs/guides/quickstart.md +69 -0
  17. bbfmodels-0.3.0/docs/guides/runtime.md +106 -0
  18. bbfmodels-0.3.0/docs/guides/vendor-models.md +119 -0
  19. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/index.md +3 -3
  20. bbfmodels-0.3.0/hooks/announce.py +102 -0
  21. bbfmodels-0.3.0/hooks/test_announce.py +89 -0
  22. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/mkdocs.yml +6 -0
  23. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/pyproject.toml +2 -2
  24. bbfmodels-0.3.0/release-notes/0.2.0.md +8 -0
  25. bbfmodels-0.3.0/release-notes/0.2.1.md +4 -0
  26. bbfmodels-0.3.0/release-notes/0.3.0.md +4 -0
  27. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/__init__.py +1 -1
  28. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/cli.py +25 -0
  29. bbfmodels-0.3.0/src/bbfmodels/generate.py +329 -0
  30. bbfmodels-0.3.0/src/bbfmodels/model.py +240 -0
  31. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/parser.py +67 -17
  32. bbfmodels-0.3.0/src/bbfmodels/paths.py +154 -0
  33. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/sources.py +3 -0
  34. bbfmodels-0.3.0/src/bbfmodels/tr098/__init__.py +20 -0
  35. bbfmodels-0.3.0/src/bbfmodels/tr098/bulkdata.py +51 -0
  36. bbfmodels-0.3.0/src/bbfmodels/tr098/capabilities.py +23 -0
  37. bbfmodels-0.3.0/src/bbfmodels/tr098/captiveportal.py +19 -0
  38. bbfmodels-0.3.0/src/bbfmodels/tr098/deviceconfig.py +17 -0
  39. bbfmodels-0.3.0/src/bbfmodels/tr098/deviceinfo.py +167 -0
  40. bbfmodels-0.3.0/src/bbfmodels/tr098/dlna.py +29 -0
  41. bbfmodels-0.3.0/src/bbfmodels/tr098/dns.py +51 -0
  42. bbfmodels-0.3.0/src/bbfmodels/tr098/downloadavailability.py +43 -0
  43. bbfmodels-0.3.0/src/bbfmodels/tr098/downloaddiagnostics.py +28 -0
  44. bbfmodels-0.3.0/src/bbfmodels/tr098/fap.py +317 -0
  45. bbfmodels-0.3.0/src/bbfmodels/tr098/faultmgmt.py +97 -0
  46. bbfmodels-0.3.0/src/bbfmodels/tr098/firewall.py +19 -0
  47. bbfmodels-0.3.0/src/bbfmodels/tr098/internetgatewaydevice.py +95 -0
  48. bbfmodels-0.3.0/src/bbfmodels/tr098/ippingdiagnostics.py +28 -0
  49. bbfmodels-0.3.0/src/bbfmodels/tr098/ir.json.gz +0 -0
  50. bbfmodels-0.3.0/src/bbfmodels/tr098/lanconfigsecurity.py +16 -0
  51. bbfmodels-0.3.0/src/bbfmodels/tr098/landevice.py +384 -0
  52. bbfmodels-0.3.0/src/bbfmodels/tr098/laninterfaces.py +39 -0
  53. bbfmodels-0.3.0/src/bbfmodels/tr098/layer2bridging.py +125 -0
  54. bbfmodels-0.3.0/src/bbfmodels/tr098/layer3forwarding.py +37 -0
  55. bbfmodels-0.3.0/src/bbfmodels/tr098/managementserver.py +147 -0
  56. bbfmodels-0.3.0/src/bbfmodels/tr098/nslookupdiagnostics.py +35 -0
  57. bbfmodels-0.3.0/src/bbfmodels/tr098/paths.py +13 -0
  58. bbfmodels-0.3.0/src/bbfmodels/tr098/paths.pyi +2387 -0
  59. bbfmodels-0.3.0/src/bbfmodels/tr098/periodicstatistics.py +55 -0
  60. bbfmodels-0.3.0/src/bbfmodels/tr098/queuemanagement.py +226 -0
  61. bbfmodels-0.3.0/src/bbfmodels/tr098/security.py +32 -0
  62. bbfmodels-0.3.0/src/bbfmodels/tr098/selftestdiagnostics.py +17 -0
  63. bbfmodels-0.3.0/src/bbfmodels/tr098/services.py +15 -0
  64. bbfmodels-0.3.0/src/bbfmodels/tr098/smartcardreader.py +35 -0
  65. bbfmodels-0.3.0/src/bbfmodels/tr098/softwaremodules.py +96 -0
  66. bbfmodels-0.3.0/src/bbfmodels/tr098/time.py +29 -0
  67. bbfmodels-0.3.0/src/bbfmodels/tr098/traceroutediagnostics.py +35 -0
  68. bbfmodels-0.3.0/src/bbfmodels/tr098/udpechoconfig.py +28 -0
  69. bbfmodels-0.3.0/src/bbfmodels/tr098/uploaddiagnostics.py +28 -0
  70. bbfmodels-0.3.0/src/bbfmodels/tr098/upnp.py +154 -0
  71. bbfmodels-0.3.0/src/bbfmodels/tr098/usbhosts.py +72 -0
  72. bbfmodels-0.3.0/src/bbfmodels/tr098/user.py +21 -0
  73. bbfmodels-0.3.0/src/bbfmodels/tr098/userinterface.py +64 -0
  74. bbfmodels-0.3.0/src/bbfmodels/tr098/wandevice.py +650 -0
  75. bbfmodels-0.3.0/src/bbfmodels/tr098/xmpp.py +63 -0
  76. bbfmodels-0.3.0/src/bbfmodels/tr104_1/__init__.py +20 -0
  77. bbfmodels-0.3.0/src/bbfmodels/tr104_1/capabilities.py +91 -0
  78. bbfmodels-0.3.0/src/bbfmodels/tr104_1/ir.json.gz +0 -0
  79. bbfmodels-0.3.0/src/bbfmodels/tr104_1/paths.py +13 -0
  80. bbfmodels-0.3.0/src/bbfmodels/tr104_1/paths.pyi +486 -0
  81. bbfmodels-0.3.0/src/bbfmodels/tr104_1/phyinterface.py +28 -0
  82. bbfmodels-0.3.0/src/bbfmodels/tr104_1/voiceprofile.py +508 -0
  83. bbfmodels-0.3.0/src/bbfmodels/tr104_1/voiceservice.py +24 -0
  84. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/__init__.py +20 -0
  85. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/callcontrol.py +333 -0
  86. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/calllog.py +199 -0
  87. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/capabilities.py +117 -0
  88. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/clocksynchronization.py +29 -0
  89. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/codecprofile.py +20 -0
  90. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/dect.py +78 -0
  91. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/h323.py +57 -0
  92. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/interwork.py +66 -0
  93. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/ir.json.gz +0 -0
  94. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/isdn.py +65 -0
  95. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/mgcp.py +61 -0
  96. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/paths.py +13 -0
  97. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/paths.pyi +1195 -0
  98. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/pots.py +101 -0
  99. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/reservedports.py +17 -0
  100. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/sip.py +246 -0
  101. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/terminal.py +99 -0
  102. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/tone.py +71 -0
  103. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/trunk.py +28 -0
  104. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/voiceservice.py +57 -0
  105. bbfmodels-0.3.0/src/bbfmodels/tr104_cwmp/voipprofile.py +83 -0
  106. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/__init__.py +20 -0
  107. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/callcontrol.py +333 -0
  108. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/calllog.py +199 -0
  109. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/capabilities.py +117 -0
  110. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/clocksynchronization.py +29 -0
  111. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/codecprofile.py +20 -0
  112. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/dect.py +78 -0
  113. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/h323.py +57 -0
  114. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/interwork.py +66 -0
  115. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/ir.json.gz +0 -0
  116. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/isdn.py +65 -0
  117. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/mgcp.py +61 -0
  118. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/paths.py +13 -0
  119. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/paths.pyi +1177 -0
  120. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/pots.py +83 -0
  121. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/reservedports.py +17 -0
  122. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/sip.py +246 -0
  123. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/terminal.py +90 -0
  124. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/tone.py +71 -0
  125. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/trunk.py +28 -0
  126. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/voiceservice.py +57 -0
  127. bbfmodels-0.3.0/src/bbfmodels/tr104_usp/voipprofile.py +83 -0
  128. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/__init__.py +20 -0
  129. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/applications.py +82 -0
  130. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/avplayers.py +38 -0
  131. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/avstreams.py +34 -0
  132. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/capabilities.py +211 -0
  133. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/components.py +433 -0
  134. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/ir.json.gz +0 -0
  135. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/paths.py +13 -0
  136. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/paths.pyi +823 -0
  137. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/servicemonitoring.py +361 -0
  138. bbfmodels-0.3.0/src/bbfmodels/tr135_cwmp/stbservice.py +30 -0
  139. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/__init__.py +20 -0
  140. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/applications.py +79 -0
  141. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/avplayers.py +37 -0
  142. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/avstreams.py +34 -0
  143. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/capabilities.py +211 -0
  144. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/components.py +400 -0
  145. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/ir.json.gz +0 -0
  146. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/paths.py +13 -0
  147. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/paths.pyi +795 -0
  148. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/servicemonitoring.py +358 -0
  149. bbfmodels-0.3.0/src/bbfmodels/tr135_usp/stbservice.py +30 -0
  150. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/__init__.py +20 -0
  151. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/capabilities.py +24 -0
  152. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/ftpserver.py +29 -0
  153. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/httpserver.py +22 -0
  154. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/httpsserver.py +22 -0
  155. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/ir.json.gz +0 -0
  156. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/logicalvolume.py +70 -0
  157. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/netinfo.py +17 -0
  158. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/networkserver.py +19 -0
  159. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/paths.py +13 -0
  160. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/paths.pyi +190 -0
  161. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/physicalmedium.py +49 -0
  162. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/sftpserver.py +20 -0
  163. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/storagearray.py +22 -0
  164. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/storageservice.py +47 -0
  165. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/useraccount.py +22 -0
  166. bbfmodels-0.3.0/src/bbfmodels/tr140_cwmp/usergroup.py +18 -0
  167. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/__init__.py +20 -0
  168. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/capabilities.py +24 -0
  169. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/ftpserver.py +29 -0
  170. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/httpserver.py +22 -0
  171. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/httpsserver.py +22 -0
  172. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/ir.json.gz +0 -0
  173. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/logicalvolume.py +70 -0
  174. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/netinfo.py +17 -0
  175. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/networkserver.py +19 -0
  176. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/paths.py +13 -0
  177. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/paths.pyi +190 -0
  178. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/physicalmedium.py +49 -0
  179. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/sftpserver.py +20 -0
  180. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/storagearray.py +22 -0
  181. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/storageservice.py +47 -0
  182. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/useraccount.py +22 -0
  183. bbfmodels-0.3.0/src/bbfmodels/tr140_usp/usergroup.py +18 -0
  184. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/__init__.py +20 -0
  185. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/atm.py +93 -0
  186. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/basapm.py +45 -0
  187. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/bridging.py +199 -0
  188. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/bulkdata.py +112 -0
  189. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/captiveportal.py +19 -0
  190. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/cellular.py +147 -0
  191. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/collectiondevice.py +30 -0
  192. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/connectionmonitoring.py +58 -0
  193. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/device.py +199 -0
  194. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/deviceinfo.py +364 -0
  195. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dhcpv4.py +237 -0
  196. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dhcpv6.py +234 -0
  197. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dlna.py +29 -0
  198. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dns.py +246 -0
  199. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/docsis.py +248 -0
  200. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dsl.py +559 -0
  201. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dslite.py +34 -0
  202. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/dynamicdns.py +62 -0
  203. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ethernet.py +231 -0
  204. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/etsim2m.py +179 -0
  205. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/fap.py +240 -0
  206. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/fast.py +188 -0
  207. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/faultmgmt.py +97 -0
  208. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/firewall.py +309 -0
  209. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/fwe.py +51 -0
  210. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/gatewayinfo.py +18 -0
  211. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ghn.py +216 -0
  212. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/gre.py +105 -0
  213. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/hardware.py +99 -0
  214. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/homeplug.py +83 -0
  215. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/hosts.py +96 -0
  216. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/hpna.py +225 -0
  217. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ieee1905.py +405 -0
  218. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ieee8021x.py +76 -0
  219. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/interfacestack.py +20 -0
  220. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ip.py +553 -0
  221. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ipsec.py +225 -0
  222. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ipv6rd.py +33 -0
  223. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ir.json.gz +0 -0
  224. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/l2tpv3.py +113 -0
  225. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/lanconfigsecurity.py +16 -0
  226. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/leds.py +57 -0
  227. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/lldp.py +74 -0
  228. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/lmap.py +333 -0
  229. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/logical.py +135 -0
  230. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/managementserver.py +204 -0
  231. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/map.py +89 -0
  232. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/moca.py +365 -0
  233. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/mqtt.py +254 -0
  234. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/nat.py +108 -0
  235. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/neighbordiscovery.py +64 -0
  236. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/optical.py +53 -0
  237. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/packetcapturediagnostics.py +37 -0
  238. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/paths.py +13 -0
  239. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/paths.pyi +11041 -0
  240. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/pcp.py +131 -0
  241. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/pdu.py +94 -0
  242. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/periodicfiletransfer.py +104 -0
  243. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/periodicstatistics.py +57 -0
  244. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ppp.py +105 -0
  245. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ptm.py +52 -0
  246. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/qos.py +265 -0
  247. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/radsecproxy.py +93 -0
  248. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/routeradvertisement.py +57 -0
  249. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/routing.py +290 -0
  250. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/schedules.py +32 -0
  251. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/security.py +44 -0
  252. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/selftestdiagnostics.py +17 -0
  253. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/services.py +15 -0
  254. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/sessionmanagement.py +164 -0
  255. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/sfps.py +209 -0
  256. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/smartcardreaders.py +42 -0
  257. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/softwaremodules.py +243 -0
  258. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/ssh.py +90 -0
  259. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/stomp.py +40 -0
  260. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/syslog.py +108 -0
  261. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/thread.py +195 -0
  262. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/time.py +106 -0
  263. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/trustedelements.py +54 -0
  264. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/unixdomainsockets.py +37 -0
  265. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/upa.py +121 -0
  266. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/upnp.py +164 -0
  267. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/usb.py +154 -0
  268. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/userinterface.py +121 -0
  269. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/users.py +80 -0
  270. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/uspagent.py +247 -0
  271. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/uspservices.py +37 -0
  272. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/vxlan.py +103 -0
  273. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/wifi.py +2300 -0
  274. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/wireguard.py +93 -0
  275. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/wwc.py +82 -0
  276. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/xmpp.py +64 -0
  277. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/xpon.py +276 -0
  278. bbfmodels-0.3.0/src/bbfmodels/tr181_cwmp/zigbee.py +243 -0
  279. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/__init__.py +20 -0
  280. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/atm.py +77 -0
  281. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/basapm.py +45 -0
  282. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/bridging.py +198 -0
  283. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/bulkdata.py +113 -0
  284. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/captiveportal.py +19 -0
  285. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/cellular.py +146 -0
  286. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/collectiondevice.py +31 -0
  287. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/connectionmonitoring.py +58 -0
  288. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/cwmpmanagementserver.py +16 -0
  289. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/device.py +204 -0
  290. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/deviceinfo.py +390 -0
  291. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dhcpv4.py +234 -0
  292. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dhcpv6.py +231 -0
  293. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dlna.py +29 -0
  294. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dns.py +219 -0
  295. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/docsis.py +245 -0
  296. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dsl.py +469 -0
  297. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dslite.py +34 -0
  298. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/dynamicdns.py +62 -0
  299. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ethernet.py +224 -0
  300. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/fap.py +239 -0
  301. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/fast.py +187 -0
  302. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/faultmgmt.py +97 -0
  303. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/firewall.py +309 -0
  304. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/fwe.py +50 -0
  305. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/gatewayinfo.py +21 -0
  306. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ghn.py +141 -0
  307. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/gre.py +104 -0
  308. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/hardware.py +99 -0
  309. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/homeplug.py +82 -0
  310. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/hosts.py +96 -0
  311. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/hpna.py +118 -0
  312. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ieee1905.py +405 -0
  313. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ieee8021x.py +73 -0
  314. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/interfacestack.py +20 -0
  315. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/iotcapability.py +196 -0
  316. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ip.py +201 -0
  317. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ipsec.py +225 -0
  318. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ipv6rd.py +33 -0
  319. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ir.json.gz +0 -0
  320. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/l2tpv3.py +112 -0
  321. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/lanconfigsecurity.py +16 -0
  322. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/leds.py +57 -0
  323. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/lldp.py +74 -0
  324. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/lmap.py +333 -0
  325. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/localagent.py +357 -0
  326. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/logical.py +132 -0
  327. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/map.py +88 -0
  328. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/moca.py +328 -0
  329. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/mqtt.py +252 -0
  330. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/nat.py +108 -0
  331. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/neighbordiscovery.py +64 -0
  332. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/node.py +18 -0
  333. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/optical.py +52 -0
  334. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/paths.py +13 -0
  335. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/paths.pyi +10344 -0
  336. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/pcp.py +131 -0
  337. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/pdu.py +94 -0
  338. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/periodicfiletransfer.py +105 -0
  339. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/periodicstatistics.py +57 -0
  340. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ppp.py +103 -0
  341. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/proxieddevice.py +34 -0
  342. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ptm.py +51 -0
  343. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/qos.py +265 -0
  344. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/radsecproxy.py +93 -0
  345. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/routeradvertisement.py +57 -0
  346. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/routing.py +285 -0
  347. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/schedules.py +32 -0
  348. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/security.py +45 -0
  349. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/services.py +15 -0
  350. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/sessionmanagement.py +164 -0
  351. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/sfps.py +209 -0
  352. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/smartcardreaders.py +41 -0
  353. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/softwaremodules.py +253 -0
  354. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/ssh.py +90 -0
  355. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/standby.py +17 -0
  356. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/stomp.py +40 -0
  357. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/syslog.py +108 -0
  358. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/thread.py +193 -0
  359. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/time.py +106 -0
  360. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/trustedelements.py +54 -0
  361. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/unixdomainsockets.py +37 -0
  362. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/upa.py +108 -0
  363. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/upnp.py +164 -0
  364. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/usb.py +152 -0
  365. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/userinterface.py +120 -0
  366. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/users.py +71 -0
  367. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/uspservices.py +37 -0
  368. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/vxlan.py +102 -0
  369. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/wifi.py +2250 -0
  370. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/wireguard.py +92 -0
  371. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/wwc.py +82 -0
  372. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/xmpp.py +64 -0
  373. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/xpon.py +275 -0
  374. bbfmodels-0.3.0/src/bbfmodels/tr181_usp/zigbee.py +242 -0
  375. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/__init__.py +20 -0
  376. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/accessmgmt.py +148 -0
  377. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/capabilities.py +116 -0
  378. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/cellconfig.py +2292 -0
  379. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/fapcontrol.py +195 -0
  380. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/fapservice.py +31 -0
  381. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/ir.json.gz +0 -0
  382. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/paths.py +13 -0
  383. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/paths.pyi +2476 -0
  384. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/rem.py +357 -0
  385. bbfmodels-0.3.0/src/bbfmodels/tr196_cwmp/transport.py +143 -0
  386. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/__init__.py +20 -0
  387. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/accessmgmt.py +148 -0
  388. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/capabilities.py +116 -0
  389. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/cellconfig.py +2292 -0
  390. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/fapcontrol.py +195 -0
  391. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/fapservice.py +31 -0
  392. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/ir.json.gz +0 -0
  393. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/paths.py +13 -0
  394. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/paths.pyi +2476 -0
  395. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/rem.py +357 -0
  396. bbfmodels-0.3.0/src/bbfmodels/tr196_usp/transport.py +143 -0
  397. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/__init__.py +20 -0
  398. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/accesscontrolcluster.py +88 -0
  399. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/accountlogincluster.py +16 -0
  400. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/actionscluster.py +43 -0
  401. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/activatedcarbonfiltermonitoringcluster.py +31 -0
  402. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/administratorcommissioningcluster.py +19 -0
  403. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/airqualitycluster.py +17 -0
  404. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/applicationbasiccluster.py +31 -0
  405. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/applicationlaunchercluster.py +32 -0
  406. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/audiooutputcluster.py +28 -0
  407. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/basicinformationcluster.py +54 -0
  408. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/bindingcluster.py +28 -0
  409. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/booleanstatecluster.py +17 -0
  410. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/booleanstateconfigurationcluster.py +23 -0
  411. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/bridgeddevicebasicinformationcluster.py +41 -0
  412. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/cameraavsettingsuserlevelmanagementcluster.py +64 -0
  413. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/cameraavstreammanagementcluster.py +213 -0
  414. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/carbondioxideconcentrationmeasurementcluster.py +26 -0
  415. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/carbonmonoxideconcentrationmeasurementcluster.py +26 -0
  416. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/channelcluster.py +54 -0
  417. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/chimecluster.py +28 -0
  418. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/closurecontrolcluster.py +39 -0
  419. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/closuredimensioncluster.py +58 -0
  420. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/colorcontrolcluster.py +68 -0
  421. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/commissionercontrolcluster.py +17 -0
  422. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/commoditymeteringcluster.py +28 -0
  423. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/commoditypricecluster.py +73 -0
  424. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/commoditytariffcluster.py +275 -0
  425. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/contentappobservercluster.py +16 -0
  426. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/contentcontrolcluster.py +86 -0
  427. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/contentlaunchercluster.py +18 -0
  428. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/descriptorcluster.py +42 -0
  429. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/deviceenergymanagementcluster.py +92 -0
  430. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/deviceenergymanagementmodecluster.py +16 -0
  431. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/diagnosticlogscluster.py +16 -0
  432. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/dishwasheralarmcluster.py +20 -0
  433. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/dishwashermodecluster.py +37 -0
  434. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/doorlockcluster.py +61 -0
  435. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ecosysteminformationcluster.py +59 -0
  436. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/electricalenergymeasurementcluster.py +104 -0
  437. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/electricalgridconditionscluster.py +43 -0
  438. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/electricalpowermeasurementcluster.py +98 -0
  439. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/endpoint.py +19 -0
  440. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/energyevsecluster.py +39 -0
  441. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/energyevsemodecluster.py +16 -0
  442. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/energypreferencecluster.py +39 -0
  443. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ethernetnetworkdiagnosticscluster.py +25 -0
  444. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/fabric.py +20 -0
  445. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/fancontrolcluster.py +28 -0
  446. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/fixedlabelcluster.py +26 -0
  447. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/flowmeasurementcluster.py +18 -0
  448. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/formaldehydeconcentrationmeasurementcluster.py +26 -0
  449. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/generalcommissioningcluster.py +35 -0
  450. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/generaldiagnosticscluster.py +40 -0
  451. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/groupkeymanagementcluster.py +39 -0
  452. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/groupscluster.py +17 -0
  453. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/hepafiltermonitoringcluster.py +31 -0
  454. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/icdmanagementcluster.py +36 -0
  455. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/identifycluster.py +18 -0
  456. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/illuminancemeasurementcluster.py +19 -0
  457. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ir.json.gz +0 -0
  458. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/jointfabricadministratorcluster.py +17 -0
  459. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/jointfabricdatastorecluster.py +219 -0
  460. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/keypadinputcluster.py +16 -0
  461. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/laundrydryercontrolscluster.py +18 -0
  462. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/laundrywashercontrolscluster.py +20 -0
  463. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/laundrywashermodecluster.py +37 -0
  464. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/levelcontrolcluster.py +26 -0
  465. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/localizationconfigurationcluster.py +18 -0
  466. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/lowpowercluster.py +16 -0
  467. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/matterservice.py +423 -0
  468. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/mediainputcluster.py +29 -0
  469. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/mediaplaybackcluster.py +99 -0
  470. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/messagescluster.py +41 -0
  471. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/meteridentificationcluster.py +29 -0
  472. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/microwaveovencontrolcluster.py +24 -0
  473. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/microwaveovenmodecluster.py +16 -0
  474. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/modeselectcluster.py +41 -0
  475. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/network.py +4217 -0
  476. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/networkcommissioningcluster.py +36 -0
  477. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/nitrogendioxideconcentrationmeasurementcluster.py +26 -0
  478. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/occupancysensingcluster.py +18 -0
  479. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/onoffcluster.py +21 -0
  480. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/operationalcredentialscluster.py +44 -0
  481. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/operationalstatecluster.py +39 -0
  482. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/otasoftwareupdateprovidercluster.py +16 -0
  483. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/otasoftwareupdaterequestorcluster.py +29 -0
  484. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ovencavityoperationalstatecluster.py +39 -0
  485. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ovenmodecluster.py +16 -0
  486. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/ozoneconcentrationmeasurementcluster.py +26 -0
  487. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/paths.py +13 -0
  488. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/paths.pyi +6314 -0
  489. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pm10concentrationmeasurementcluster.py +26 -0
  490. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pm1concentrationmeasurementcluster.py +26 -0
  491. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pm25concentrationmeasurementcluster.py +26 -0
  492. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/powersourcecluster.py +48 -0
  493. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/powersourceconfigurationcluster.py +17 -0
  494. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/powertopologycluster.py +18 -0
  495. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pressuremeasurementcluster.py +21 -0
  496. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pumpconfigurationandcontrolcluster.py +39 -0
  497. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/pushavstreamtransportcluster.py +99 -0
  498. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/radonconcentrationmeasurementcluster.py +26 -0
  499. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/refrigeratoralarmcluster.py +20 -0
  500. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/refrigeratorandtemperaturecontrolledcabinetmodecluster.py +37 -0
  501. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/relativehumiditymeasurementcluster.py +18 -0
  502. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/rvccleanmodecluster.py +16 -0
  503. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/rvcoperationalstatecluster.py +39 -0
  504. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/rvcrunmodecluster.py +16 -0
  505. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/scenesmanagementcluster.py +30 -0
  506. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/serviceareacluster.py +74 -0
  507. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/smokecoalarmcluster.py +29 -0
  508. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/softwarediagnosticscluster.py +32 -0
  509. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/soilmeasurementcluster.py +43 -0
  510. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/switchcluster.py +19 -0
  511. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/targetnavigatorcluster.py +27 -0
  512. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/temperaturecontrolcluster.py +20 -0
  513. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/temperaturemeasurementcluster.py +18 -0
  514. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/thermostatcluster.py +127 -0
  515. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/thermostatuserinterfaceconfigurationcluster.py +19 -0
  516. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/threadborderroutermanagementcluster.py +22 -0
  517. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/threadnetworkdiagnosticscluster.py +143 -0
  518. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/threadnetworkdirectorycluster.py +29 -0
  519. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/timeformatlocalizationcluster.py +19 -0
  520. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/timesynchronizationcluster.py +57 -0
  521. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/tlscertificatemanagementcluster.py +39 -0
  522. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/tlsclientmanagementcluster.py +31 -0
  523. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/totalvolatileorganiccompoundsconcentrationmeasurementcluster.py +26 -0
  524. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/unitlocalizationcluster.py +18 -0
  525. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/userlabelcluster.py +26 -0
  526. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/valveconfigurationandcontrolcluster.py +27 -0
  527. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/wakeonlancluster.py +18 -0
  528. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/waterheatermanagementcluster.py +22 -0
  529. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/waterheatermodecluster.py +16 -0
  530. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/watertanklevelmonitoringcluster.py +31 -0
  531. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/webrtctransportprovidercluster.py +31 -0
  532. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/webrtctransportrequestorcluster.py +31 -0
  533. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/wifinetworkdiagnosticscluster.py +29 -0
  534. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/wifinetworkmanagementcluster.py +18 -0
  535. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/windowcoveringcluster.py +30 -0
  536. bbfmodels-0.3.0/src/bbfmodels/tr517_usp/zonemanagementcluster.py +71 -0
  537. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/fixtures/mini-cwmp-full.xml +16 -1
  538. bbfmodels-0.3.0/tests/fixtures/mini-service-full.xml +21 -0
  539. bbfmodels-0.3.0/tests/test_generate.py +234 -0
  540. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_parser.py +55 -3
  541. bbfmodels-0.3.0/tests/test_paths.py +95 -0
  542. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_schema.py +4 -1
  543. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/uv.lock +1 -1
  544. bbfmodels-0.1.0/.release-please-manifest.json +0 -3
  545. bbfmodels-0.1.0/CHANGELOG.md +0 -9
  546. bbfmodels-0.1.0/docs/guides/quickstart.md +0 -127
  547. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.github/workflows/ci.yml +0 -0
  548. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.github/workflows/docs.yml +0 -0
  549. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.github/workflows/pr-title.yml +0 -0
  550. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.github/workflows/publish.yml +0 -0
  551. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.github/workflows/release-please.yml +0 -0
  552. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.gitignore +0 -0
  553. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/.python-version +0 -0
  554. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/LICENSE +0 -0
  555. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/NOTICE +0 -0
  556. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0001-one-parser-one-ir-several-emitters.md +0 -0
  557. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0002-names-stay-as-the-forum-wrote-them.md +0 -0
  558. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0003-parse-the-flattened-full-documents.md +0 -0
  559. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0004-generated-output-is-committed.md +0 -0
  560. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0005-python-models-are-pydantic.md +0 -0
  561. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0006-everything-optional-unknown-paths-kept.md +0 -0
  562. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0007-vendor-extensions-are-overlays.md +0 -0
  563. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0008-python-toolchain.md +0 -0
  564. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/context/decisions/0009-the-tree-keeps-wire-text.md +0 -0
  565. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/assets/images/ispx-icon.png +0 -0
  566. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/assets/js/copy-code.js +0 -0
  567. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/assets/js/powered-by.js +0 -0
  568. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/assets/stylesheets/extra.css +0 -0
  569. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/docs/changelog.md +0 -0
  570. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/hooks/changelog.py +0 -0
  571. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/hooks/test_changelog.py +0 -0
  572. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/release-notes/0.1.0.md +0 -0
  573. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/release-please-config.json +0 -0
  574. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/requirements.txt +0 -0
  575. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/scripts/bootstrap.sh +0 -0
  576. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/codec.py +0 -0
  577. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/ir.py +0 -0
  578. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/py.typed +0 -0
  579. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/schema.py +0 -0
  580. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/src/bbfmodels/tree.py +0 -0
  581. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/fixtures/mini-usp-full.xml +0 -0
  582. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_cli.py +0 -0
  583. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_codec.py +0 -0
  584. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_documents.py +0 -0
  585. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/tests/test_tree.py +0 -0
  586. {bbfmodels-0.1.0 → bbfmodels-0.3.0}/wrangler.jsonc +0 -0
@@ -0,0 +1,70 @@
1
+ name: announce-release
2
+
3
+ # Posts a release's notes to the ispx Discord when they land on main.
4
+ # release-notes/<version>.md is written after the Release PR merges and
5
+ # lands by its own PR, so the notes file
6
+ # arriving on main is the moment the release is told, and only a file
7
+ # added by the push counts: an edit to existing notes is a wording fix,
8
+ # not a release. The dispatch input re-posts one version by hand, which
9
+ # is also how the webhook is tried out.
10
+ on:
11
+ push:
12
+ branches: [main]
13
+ paths:
14
+ - "release-notes/**"
15
+ workflow_dispatch:
16
+ inputs:
17
+ version:
18
+ description: Version whose notes to post, for example 0.2.1
19
+ required: true
20
+ type: string
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ concurrency:
26
+ group: announce-release
27
+ cancel-in-progress: false
28
+
29
+ jobs:
30
+ announce:
31
+ runs-on: ubuntu-latest
32
+ timeout-minutes: 5
33
+ steps:
34
+ - name: Checkout
35
+ uses: actions/checkout@v4
36
+
37
+ - name: Set up Python
38
+ uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.12"
41
+
42
+ - name: Find the versions to post
43
+ id: versions
44
+ env:
45
+ BEFORE: ${{ github.event.before }}
46
+ REQUESTED: ${{ inputs.version }}
47
+ run: |
48
+ if [ -n "$REQUESTED" ]; then
49
+ versions="$REQUESTED"
50
+ else
51
+ git fetch --quiet --depth=1 origin "$BEFORE"
52
+ versions=$(git diff --name-only --diff-filter=A "$BEFORE" "$GITHUB_SHA" -- release-notes/ \
53
+ | sed -n 's#^release-notes/\(.*\)\.md$#\1#p' | sort -V | tr '\n' ' ')
54
+ fi
55
+ echo "list=$versions" >> "$GITHUB_OUTPUT"
56
+ echo "versions: ${versions:-none}"
57
+
58
+ - name: Post the notes
59
+ if: steps.versions.outputs.list != ''
60
+ env:
61
+ DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_RELEASES_WEBHOOK }}
62
+ VERSIONS: ${{ steps.versions.outputs.list }}
63
+ run: |
64
+ if [ -z "$DISCORD_WEBHOOK_URL" ]; then
65
+ echo "::warning::DISCORD_RELEASES_WEBHOOK is not set, nothing posted"
66
+ exit 0
67
+ fi
68
+ for v in $VERSIONS; do
69
+ python hooks/announce.py "$v"
70
+ done
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.0"
3
+ }
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ ## [0.3.0](https://github.com/ispx-limited/bbfmodels/compare/v0.2.1...v0.3.0) (2026-11-02)
4
+
5
+
6
+ ### Added
7
+
8
+ * **paths:** typed paths with autocomplete for every model, no pydantic model needed ([#17](https://github.com/ispx-limited/bbfmodels/issues/17)) ([ba3a7b7](https://github.com/ispx-limited/bbfmodels/commit/ba3a7b7781129477aed7ee015d51f9079521b331))
9
+
10
+ ## [0.2.1](https://github.com/ispx-limited/bbfmodels/compare/v0.2.0...v0.2.1) (2026-11-02)
11
+
12
+
13
+ ### Fixed
14
+
15
+ * **models:** generated files no longer record the tool version, which broke the release build ([#10](https://github.com/ispx-limited/bbfmodels/issues/10)) ([ab909c7](https://github.com/ispx-limited/bbfmodels/commit/ab909c7d67b102b11f09122d8c01cea674859e8c))
16
+ * **parser:** a vendor document's empty syntax is read as a string instead of failing ([#11](https://github.com/ispx-limited/bbfmodels/issues/11)) ([7cdb4a1](https://github.com/ispx-limited/bbfmodels/commit/7cdb4a1c4fa39b7741c90a67c84b43812c889fe2))
17
+ * **parser:** a vendor document's unknown vocabulary values fall back with a warning instead of failing ([#13](https://github.com/ispx-limited/bbfmodels/issues/13)) ([bb3e807](https://github.com/ispx-limited/bbfmodels/commit/bb3e80723320fdd69d2b2263ef066d790a28feb2))
18
+
19
+ ## [0.2.0](https://github.com/ispx-limited/bbfmodels/compare/v0.1.0...v0.2.0) (2026-11-02)
20
+
21
+
22
+ ### Added
23
+
24
+ * **models:** generated pydantic models for every published data model, and a generator for any document ([#7](https://github.com/ispx-limited/bbfmodels/issues/7)) ([adf73f2](https://github.com/ispx-limited/bbfmodels/commit/adf73f2004eb7cf24673a52298a251af45f39364))
25
+
26
+ ## 0.1.0 (2026-11-02)
27
+
28
+
29
+ ### Added
30
+
31
+ * **parser:** read a published document into the intermediate representation ([#1](https://github.com/ispx-limited/bbfmodels/issues/1)) ([462d045](https://github.com/ispx-limited/bbfmodels/commit/462d04530a7d3a7d62a3da440404f4afcadb2c4f))
32
+ * **runtime:** resolve paths, hold a device's values and validate them against the schema ([#3](https://github.com/ispx-limited/bbfmodels/issues/3)) ([35146ad](https://github.com/ispx-limited/bbfmodels/commit/35146adb52757ac9a05836415f87815135c55b94))
@@ -10,7 +10,12 @@ is for anyone, person or coding agent, working in the repository.
10
10
  architecture decision records and `context/README.md` indexes them. Read
11
11
  it before touching the parser, the IR or a generator, and add a record
12
12
  when a change makes or reverses a significant decision.
13
- - `src/bbfmodels/` is the package. `cli.py` is the command line entry point.
13
+ - `src/bbfmodels/` is the package. `cli.py` is the command line entry point,
14
+ `parser.py` reads the XML into the IR in `ir.py`, `schema.py`, `tree.py`
15
+ and `codec.py` are the runtime, `generate.py` writes the model packages.
16
+ - `src/bbfmodels/tr*/` are generated packages, one per published document.
17
+ Never edit them; run `make generate` after changing the generator or
18
+ the pinned documents in `sources.py`. A test fails when they are stale.
14
19
  - `tests/` holds the pytest suite.
15
20
  - `docs/` is the documentation site (mkdocs), built strictly in CI. A page
16
21
  exists when it has content; nothing is scaffolded empty.
@@ -20,7 +20,8 @@ make lint # format check, lint and type check, what CI runs
20
20
  rejects any other title.
21
21
  - One change per PR. PRs are squash merged, so the title is the commit.
22
22
  - Generated files are never edited by hand. Change the generator or the
23
- source document and regenerate; CI fails when committed output is stale.
23
+ pinned source document and run `make generate`; CI fails when committed
24
+ output is stale.
24
25
  - Attribute and class names keep the Forum's PascalCase verbatim.
25
26
  - The tool carries no knowledge of any vendor or product. Vendor behaviour
26
27
  comes from a vendor's own data model document, never from code.
@@ -1,5 +1,5 @@
1
1
  .DEFAULT_GOAL := help
2
- .PHONY: help build test lint run docs clean
2
+ .PHONY: help build test lint run generate docs clean
3
3
 
4
4
  help: ## List available targets
5
5
  @awk 'BEGIN {FS = ":.*## "} /^[a-zA-Z_-]+:.*## / {printf "%-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
@@ -18,6 +18,9 @@ lint: ## Format check, lint and type check, the same commands CI runs
18
18
  run: ## Run the command line tool
19
19
  uv run bbfmodels
20
20
 
21
+ generate: ## Regenerate the shipped model packages from the pinned documents
22
+ uv run bbfmodels generate
23
+
21
24
  docs: ## Build the documentation site strictly
22
25
  uv run --with-requirements requirements.txt --no-project python -m unittest discover -s hooks
23
26
  uv run --with-requirements requirements.txt --no-project mkdocs build --strict
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bbfmodels
3
- Version: 0.1.0
3
+ Version: 0.3.0
4
4
  Summary: Typed models and schema tooling for Broadband Forum data models (TR-181, TR-098, TR-104 and more), generated from the published XML
5
5
  Project-URL: Homepage, https://github.com/ispx-limited/bbfmodels
6
6
  Project-URL: Documentation, https://docs.bbfmodels.ispx.co/
@@ -40,20 +40,44 @@ the same parameter paths as strings. bbfmodels does it once:
40
40
  - A Python runtime that works from that representation: resolve a path,
41
41
  validate a value against the model's constraints, convert between the flat
42
42
  path and value lists that CWMP and USP carry on the wire and a typed tree.
43
- - Generated typed bindings: pydantic models for Python first, JSON Schema and
44
- TypeScript from the same representation, Go when there is a consumer.
43
+ - Generated typed bindings: pydantic models for Python, shipped for TR-181
44
+ and TR-098 and the service models (TR-104 voice, TR-135 set-top box,
45
+ TR-140 storage, TR-196 femtocell, TR-517 Matter), and generated on demand
46
+ for any other document, a vendor's included.
47
+ - Typed paths for code that only needs correct path strings:
48
+ `str(Device.WiFi.SSID[1].SSID)` with autocomplete over the whole model
49
+ and the parameter's definition one attribute away. JSON Schema and TypeScript follow from the
50
+ same representation, Go when there is a consumer.
45
51
 
46
52
  Names stay as the Forum wrote them. `Device.WiFi.SSID.{i}.SSID` is a table of
47
53
  `SSID` entries indexed by instance number, and the attribute is `SSID`, not
48
54
  `ssid`.
49
55
 
56
+ ## Install
57
+
58
+ ```sh
59
+ pip install bbfmodels
60
+ ```
61
+
62
+ Python 3.11 or later. The one runtime dependency is pydantic.
63
+
50
64
  ## Status
51
65
 
52
- Pre-release. The parser, the intermediate representation and the runtime
53
- are in place: `bbfmodels fetch` downloads the Forum's published documents,
54
- `bbfmodels ir` turns one into JSON, and the `Schema` and `Tree` classes
55
- resolve paths, hold a device's values and validate them. Generated Python
56
- models come next. Until the first release there is no package on PyPI.
66
+ Early. The parser, the intermediate representation, the runtime and the
67
+ generated Python models are in place. Commands and events in the generated
68
+ models, JSON Schema and TypeScript come next. Before 1.0 a minor release
69
+ may change the IR and the runtime API.
70
+
71
+ ```python
72
+ from bbfmodels.tr181_cwmp import Device
73
+
74
+ device = Device.from_flat(values_from_the_device)
75
+ radio = device.WiFi.Radio[1]
76
+ radio.Channel # 36, an int
77
+ radio.Enable # True
78
+ device.problems() # every value outside the model's constraints
79
+ device.flatten() # back to path and text pairs
80
+ ```
57
81
 
58
82
  The design decisions behind the code are in `context/decisions/`, indexed in
59
83
  `context/README.md`. Read them before changing the parser or the IR.
@@ -15,20 +15,44 @@ the same parameter paths as strings. bbfmodels does it once:
15
15
  - A Python runtime that works from that representation: resolve a path,
16
16
  validate a value against the model's constraints, convert between the flat
17
17
  path and value lists that CWMP and USP carry on the wire and a typed tree.
18
- - Generated typed bindings: pydantic models for Python first, JSON Schema and
19
- TypeScript from the same representation, Go when there is a consumer.
18
+ - Generated typed bindings: pydantic models for Python, shipped for TR-181
19
+ and TR-098 and the service models (TR-104 voice, TR-135 set-top box,
20
+ TR-140 storage, TR-196 femtocell, TR-517 Matter), and generated on demand
21
+ for any other document, a vendor's included.
22
+ - Typed paths for code that only needs correct path strings:
23
+ `str(Device.WiFi.SSID[1].SSID)` with autocomplete over the whole model
24
+ and the parameter's definition one attribute away. JSON Schema and TypeScript follow from the
25
+ same representation, Go when there is a consumer.
20
26
 
21
27
  Names stay as the Forum wrote them. `Device.WiFi.SSID.{i}.SSID` is a table of
22
28
  `SSID` entries indexed by instance number, and the attribute is `SSID`, not
23
29
  `ssid`.
24
30
 
31
+ ## Install
32
+
33
+ ```sh
34
+ pip install bbfmodels
35
+ ```
36
+
37
+ Python 3.11 or later. The one runtime dependency is pydantic.
38
+
25
39
  ## Status
26
40
 
27
- Pre-release. The parser, the intermediate representation and the runtime
28
- are in place: `bbfmodels fetch` downloads the Forum's published documents,
29
- `bbfmodels ir` turns one into JSON, and the `Schema` and `Tree` classes
30
- resolve paths, hold a device's values and validate them. Generated Python
31
- models come next. Until the first release there is no package on PyPI.
41
+ Early. The parser, the intermediate representation, the runtime and the
42
+ generated Python models are in place. Commands and events in the generated
43
+ models, JSON Schema and TypeScript come next. Before 1.0 a minor release
44
+ may change the IR and the runtime API.
45
+
46
+ ```python
47
+ from bbfmodels.tr181_cwmp import Device
48
+
49
+ device = Device.from_flat(values_from_the_device)
50
+ radio = device.WiFi.Radio[1]
51
+ radio.Channel # 36, an int
52
+ radio.Enable # True
53
+ device.problems() # every value outside the model's constraints
54
+ device.flatten() # back to path and text pairs
55
+ ```
32
56
 
33
57
  The design decisions behind the code are in `context/decisions/`, indexed in
34
58
  `context/README.md`. Read them before changing the parser or the IR.
@@ -20,3 +20,5 @@ changes, a new record is written and the old one is marked superseded.
20
20
  | [0007](decisions/0007-vendor-extensions-are-overlays.md) | Vendor extensions are overlays in the same schema | Accepted |
21
21
  | [0008](decisions/0008-python-toolchain.md) | Python toolchain: uv, ruff, mypy, pytest, standard library XML | Accepted |
22
22
  | [0009](decisions/0009-the-tree-keeps-wire-text.md) | The data tree keeps wire text and decodes on demand | Accepted |
23
+ | [0010](decisions/0010-generated-python-packages.md) | One generated package per document, lenient on input, strict in `problems` | Accepted |
24
+ | [0011](decisions/0011-typed-paths-are-a-stub-over-the-schema.md) | Typed paths are a generic runtime plus a stub, not generated classes | Accepted |
@@ -0,0 +1,64 @@
1
+ # 0010: One generated package per document, lenient on input, strict in `problems`
2
+
3
+ ## Context
4
+
5
+ Decision 0005 settled on pydantic models built lazily. Generating them
6
+ raised questions the decision did not answer: how packages and classes are
7
+ named, what a field's type is when the model gives an enumeration or a
8
+ range, how values the model does not allow are treated, and how a Forum
9
+ parameter can be named like a Python helper.
10
+
11
+ ## Decision
12
+
13
+ - **One package per published document**, named after it: `tr181_cwmp`,
14
+ `tr181_usp`, `tr098`, `tr104_cwmp`, and so on. The CWMP and USP editions
15
+ of a document differ in commands, events and a few objects, and a user
16
+ works against one of them; an older issue that is still deployed carries
17
+ its issue number (`tr104_1`, the voice model of TR-098 gateways). The
18
+ package ships the IR it was generated from as `ir.json.gz` and exposes
19
+ it through `schema()`.
20
+ - **Service models are generated as the document writes them.** A service
21
+ model's root (`VoiceService.{i}.`) is a table that a device mounts under
22
+ its `Services.` object, and the document does not say under which root.
23
+ The classes carry the document's paths; the mount is given when
24
+ converting: `VoiceService.from_flat(values, "Device.Services.VoiceService.1.")`.
25
+ Documents that only hold components (TR-143, TR-157) are not generated,
26
+ because their content is already merged into the root models.
27
+ - **A class per object, a module per top-level subtree.** The root object
28
+ is a class named after it (`Device`) in `device.py`; every other object
29
+ is `WiFi_Radio_Stats`, its path with the root dropped, in `wifi.py`.
30
+ Children are emitted before parents, annotations are evaluated eagerly
31
+ rather than as strings, and every helper is imported under a
32
+ leading-underscore alias. Together these make a class body resolve a
33
+ class name before a field of the same name exists in it, and keep a
34
+ parameter named `Param` (TR-181 has one) from shadowing the helper.
35
+ The class's own metadata, its schema path and the package holding its
36
+ IR, lives in dunder attributes (`__bbf_path__`, `__bbf_package__`):
37
+ Forum names never start with an underscore, so nothing can collide with
38
+ them, and pydantic leaves dunder names alone.
39
+ - **Types coerce, facets report.** A field's type is the parameter's
40
+ Python type: `int`, `bool`, `datetime`, `bytes`, `Decimal`, `str`, or a
41
+ comma-list of one of them. Ranges, sizes, patterns and enumerations are
42
+ not pydantic constraints, because a real device returns out-of-range
43
+ values and vendor enumeration members and a model that rejects them
44
+ cannot hold what the device said (decision 0006). `problems()` reports
45
+ every facet violation from the shipped IR instead. An enumeration is
46
+ typed `Literal[...] | str`, so an editor completes the Forum's values and
47
+ any other string still validates.
48
+ - **Everything optional, tables are `dict[int, Child]`, unknown paths are
49
+ kept** as pydantic extras, nested dicts for unknown objects, and
50
+ `flatten()` writes them back. `flatten()` writes canonical text (`true`,
51
+ not `1`) because the model holds typed values, not wire text; the data
52
+ tree (decision 0009) is the exact round-trip surface.
53
+ - **No descriptions in generated code.** They are three megabytes for
54
+ TR-181 and live in the shipped IR, reachable through `schema()`.
55
+
56
+ ## Consequences
57
+
58
+ - `import bbfmodels.tr181_cwmp` takes about a third of a second and the
59
+ first validation about a fifth; the test suite asserts a ceiling.
60
+ - A field whose Forum name collides with a pydantic attribute is emitted
61
+ with a trailing underscore and an alias of the original name, so wire
62
+ conversion is unaffected. None of the shipped documents needs it today.
63
+ - Generated code is excluded from the formatter and the linter, and
64
+ type-checked like the rest of the package.
@@ -0,0 +1,44 @@
1
+ # 0011: Typed paths are a generic runtime plus a stub, not generated classes
2
+
3
+ ## Context
4
+
5
+ Not every user wants models. Code that queries an ACS API asks for a
6
+ parameter by its path string and gets a string back, and what it needs
7
+ from bbfmodels is a correct path with autocomplete and the parameter's
8
+ definition one step away. Generating a class per object with a property
9
+ per member would give that, at the cost of another megabyte of code per
10
+ package, import time to match, and a second copy of every name the models
11
+ already carry.
12
+
13
+ ## Decision
14
+
15
+ Typed paths are one generic runtime (`bbfmodels.paths`) that walks the
16
+ package's shipped IR, plus a generated stub file (`paths.pyi`) per package
17
+ that declares every object and parameter with the Python type of its
18
+ value. The runtime `paths.py` in a package is three lines: the root path
19
+ over the package's schema. Editors and type checkers read the stub; the
20
+ interpreter never does.
21
+
22
+ - `str()` of a path is the data path. A table renders as its partial path
23
+ and offers `search` for the USP wildcard form and `schema_path` for the
24
+ `{i}` form. Paths compare and hash as strings.
25
+ - `definition` returns the IR object or parameter.
26
+ - An unknown name is an `AttributeError`. A name the schema does not list
27
+ is reached with `child()`, so a typo in a standard name is never taken
28
+ for a vendor parameter.
29
+ - Identifiers follow the models' rule (`N11kEnable` for `11kEnable`), and
30
+ the runtime maps the identifier back to the Forum name.
31
+
32
+ pydantic remains a dependency even for a user who only wants paths, because
33
+ the IR the runtime walks is built on it. That is accepted: the cost is one
34
+ ubiquitous package, and a second dependency-free distribution can be split
35
+ out if someone needs it.
36
+
37
+ ## Consequences
38
+
39
+ - Autocomplete over the whole of TR-181 with no import cost: the stub for
40
+ TR-181 is a few hundred kilobytes that only tools read.
41
+ - The first attribute access loads the package's IR (about 50 ms); every
42
+ one after that is a dictionary lookup.
43
+ - The value type in the stub (`ParamPath[int]`) is documentation for the
44
+ reader and the type checker; the runtime does not use it.
@@ -0,0 +1,22 @@
1
+ # Command line
2
+
3
+ ```
4
+ bbfmodels fetch [NAME ...] [--list cwmp|usp] [--into DIR]
5
+ bbfmodels ir DOCUMENT [-o FILE] [--indent N]
6
+ bbfmodels ir-schema
7
+ bbfmodels generate [DOCUMENT --package NAME] [--root DIR]
8
+ bbfmodels --version
9
+ ```
10
+
11
+ | Command | Does |
12
+ | --- | --- |
13
+ | `fetch` | Downloads published documents into the cache; no names means the core set. `--list` prints what the Forum publishes for a protocol. |
14
+ | `ir` | Parses a document and writes the IR as JSON, to stdout or `-o`. |
15
+ | `ir-schema` | Prints the JSON Schema of the IR. |
16
+ | `generate` | Writes a package of pydantic models from a document under `--root` (default `src`). With no document, regenerates every shipped package. |
17
+
18
+ The cache is `~/.cache/bbfmodels`, or `$XDG_CACHE_HOME/bbfmodels`, or
19
+ `$BBFMODELS_CACHE` when set.
20
+
21
+ Exit status is 0 on success, 1 when a document cannot be read or a file
22
+ cannot be written, with the reason on stderr, and 2 for a usage error.
@@ -0,0 +1,117 @@
1
+ # Documents and the IR
2
+
3
+ The Broadband Forum publishes each data model as XML in the TR-106 schema,
4
+ in two forms. The modular files assemble objects from imports and reusable
5
+ components; the flattened `-full.xml` files have all of that resolved.
6
+ bbfmodels reads the flattened form only.
7
+
8
+ ## Fetching
9
+
10
+ `fetch` downloads a document into a local cache, `~/.cache/bbfmodels` or
11
+ `$BBFMODELS_CACHE`, and reuses what is there. Published files never change.
12
+
13
+ ```sh
14
+ bbfmodels fetch # the core set
15
+ bbfmodels fetch tr-181-2-21-0-usp-full.xml # one document
16
+ bbfmodels fetch --list cwmp # everything published for CWMP
17
+ bbfmodels fetch --list usp
18
+ ```
19
+
20
+ The core set is TR-098, TR-104 (both issues), TR-135, TR-140, TR-157,
21
+ TR-181 (CWMP and USP), TR-196 and TR-517. The same call exists in Python:
22
+
23
+ ```python
24
+ from bbfmodels.sources import fetch, available, CORE
25
+
26
+ path = fetch("tr-181-2-21-0-cwmp-full.xml")
27
+ ```
28
+
29
+ ## The intermediate representation
30
+
31
+ `ir` parses a document into the intermediate representation (IR), the one
32
+ structure everything else in bbfmodels reads:
33
+
34
+ ```sh
35
+ bbfmodels ir tr-181-2-21-0-cwmp-full.xml -o tr-181.json --indent 2
36
+ bbfmodels ir-schema > ir-schema.json # the IR's JSON Schema
37
+ ```
38
+
39
+ A document has named data types and models. A model has objects keyed by
40
+ path, with `{i}` marking a table exactly as the specification writes it.
41
+ An object has parameters, and in USP documents commands and events; a
42
+ parameter has a syntax with its base type, the name of its data type if it
43
+ used one, and its facets.
44
+
45
+ ```json
46
+ {
47
+ "spec": "urn:broadband-forum-org:tr-181-2-21-0-cwmp",
48
+ "protocol": "cwmp",
49
+ "models": [{
50
+ "name": "Device:2.21",
51
+ "objects": {
52
+ "Device.WiFi.Radio.{i}.": {
53
+ "path": "Device.WiFi.Radio.{i}.",
54
+ "access": "readOnly",
55
+ "min_entries": 0,
56
+ "max_entries": null,
57
+ "num_entries_parameter": "RadioNumberOfEntries",
58
+ "unique_keys": [{"functional": false, "parameters": ["Alias"]}, {"functional": false, "parameters": ["Name"]}],
59
+ "parameters": {
60
+ "Channel": {
61
+ "name": "Channel",
62
+ "access": "readWrite",
63
+ "syntax": {
64
+ "base_type": "unsignedInt",
65
+ "facets": {"ranges": [{"min_inclusive": 1, "max_inclusive": 255}]}
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }]
72
+ }
73
+ ```
74
+
75
+ Fields at their default are left out: an object without `status` is
76
+ current, a parameter without `list` is a single value, `max_entries` of
77
+ `null` is unbounded.
78
+
79
+ Named data types are resolved. A parameter declared as `IPv4Address` has
80
+ `"data_type": "IPv4Address"` and a syntax whose base type and facets are
81
+ the fully inherited ones, so no consumer needs a second lookup. The
82
+ document's `data_types` table is there for emitters that want to generate
83
+ a named type.
84
+
85
+ In Python:
86
+
87
+ ```python
88
+ from bbfmodels.parser import parse_file
89
+
90
+ doc = parse_file("tr-181-2-21-0-cwmp-full.xml")
91
+ model = doc.models[0]
92
+ radio = model.objects["Device.WiFi.Radio.{i}."]
93
+ radio.multi_instance # True
94
+ radio.name, radio.parent_path # 'Radio', 'Device.WiFi.'
95
+ channel = radio.parameters["Channel"].syntax
96
+ channel.base_type # <BaseType.UNSIGNED_INT: 'unsignedInt'>
97
+ channel.facets.ranges[0].max_inclusive # 255
98
+ reboot = parse_file("tr-181-2-21-0-usp-full.xml").models[0].objects["Device."].commands["Reboot()"]
99
+ reboot.input.parameters["Cause"].mandatory # False
100
+ ```
101
+
102
+ ## What the parser tolerates
103
+
104
+ The published documents are not always well-formed XML, and vendor
105
+ documents captured from devices depart from the schema in small ways. The
106
+ parser repairs what it has seen and warns where it had to decide:
107
+
108
+ | In the document | What happens |
109
+ | --- | --- |
110
+ | Bare `&` or literal `<OUI>` markup in prose | Escaped before parsing |
111
+ | An attribute published as `value="""` | Read as a quote |
112
+ | Whitespace around a name (`name="Queueing "`) | Dropped |
113
+ | An empty `<syntax/>` | Read as a string, with a `ParseWarning` |
114
+ | An unknown `status`, `access` or `activeNotify` value | The conservative default (`current`, `readOnly`, `normal`), with a `ParseWarning` |
115
+ | `<import>` or `<component>` elements | Rejected: use the flattened `-full.xml` edition |
116
+
117
+ Anything else the schema does not allow is a `ParseError` naming the place.