chef 17.0.242-universal-mingw32 → 17.4.25-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -14
  3. data/Rakefile +2 -2
  4. data/chef.gemspec +10 -20
  5. data/lib/chef/action_collection.rb +6 -26
  6. data/lib/chef/application/base.rb +15 -0
  7. data/lib/chef/application.rb +4 -2
  8. data/lib/chef/chef_fs/file_pattern.rb +2 -2
  9. data/lib/chef/client.rb +7 -1
  10. data/lib/chef/compliance/default_attributes.rb +5 -3
  11. data/lib/chef/compliance/reporter/automate.rb +1 -1
  12. data/lib/chef/compliance/runner.rb +17 -3
  13. data/lib/chef/cookbook/cookbook_version_loader.rb +3 -3
  14. data/lib/chef/cookbook/gem_installer.rb +5 -1
  15. data/lib/chef/cookbook_version.rb +26 -4
  16. data/lib/chef/data_collector/run_end_message.rb +1 -1
  17. data/lib/chef/data_collector.rb +0 -1
  18. data/lib/chef/deprecated.rb +14 -4
  19. data/lib/chef/dsl/declare_resource.rb +5 -10
  20. data/lib/chef/dsl/render_helpers.rb +44 -0
  21. data/lib/chef/dsl/secret.rb +64 -0
  22. data/lib/chef/dsl/toml.rb +116 -0
  23. data/lib/chef/dsl/universal.rb +5 -0
  24. data/lib/chef/dsl.rb +1 -0
  25. data/lib/chef/event_dispatch/base.rb +2 -1
  26. data/lib/chef/exceptions.rb +23 -0
  27. data/lib/chef/formatters/doc.rb +2 -1
  28. data/lib/chef/formatters/error_mapper.rb +2 -2
  29. data/lib/chef/handler/slow_report.rb +66 -0
  30. data/lib/chef/handler.rb +46 -8
  31. data/lib/chef/json_compat.rb +1 -1
  32. data/lib/chef/node.rb +21 -20
  33. data/lib/chef/policy_builder/policyfile.rb +88 -45
  34. data/lib/chef/provider/directory.rb +6 -6
  35. data/lib/chef/provider/execute.rb +1 -1
  36. data/lib/chef/provider/file.rb +2 -2
  37. data/lib/chef/provider/group/dscl.rb +1 -1
  38. data/lib/chef/provider/launchd.rb +6 -6
  39. data/lib/chef/provider/link.rb +1 -1
  40. data/lib/chef/provider/lwrp_base.rb +1 -1
  41. data/lib/chef/provider/package/dnf/dnf_helper.py +11 -10
  42. data/lib/chef/provider/package/dnf/python_helper.rb +9 -8
  43. data/lib/chef/provider/package/habitat.rb +168 -0
  44. data/lib/chef/provider/package/powershell.rb +5 -0
  45. data/lib/chef/provider/package/yum/python_helper.rb +15 -10
  46. data/lib/chef/provider/package/yum/yum_helper.py +46 -62
  47. data/lib/chef/provider/package/yum.rb +1 -4
  48. data/lib/chef/provider/registry_key.rb +1 -1
  49. data/lib/chef/provider/service/systemd.rb +1 -1
  50. data/lib/chef/provider/subversion.rb +4 -4
  51. data/lib/chef/provider/support/yum_repo.erb +1 -1
  52. data/lib/chef/provider/support/zypper_repo.erb +4 -2
  53. data/lib/chef/provider/systemd_unit.rb +18 -17
  54. data/lib/chef/provider/template/content.rb +1 -1
  55. data/lib/chef/provider/user/mac.rb +3 -3
  56. data/lib/chef/provider/windows_script.rb +1 -1
  57. data/lib/chef/provider/yum_repository.rb +27 -43
  58. data/lib/chef/provider/zypper_repository.rb +30 -34
  59. data/lib/chef/provider.rb +26 -1
  60. data/lib/chef/provider_resolver.rb +8 -2
  61. data/lib/chef/providers.rb +1 -0
  62. data/lib/chef/resource/alternatives.rb +5 -5
  63. data/lib/chef/resource/apt_preference.rb +2 -2
  64. data/lib/chef/resource/apt_repository.rb +2 -2
  65. data/lib/chef/resource/apt_update.rb +4 -4
  66. data/lib/chef/resource/build_essential.rb +1 -1
  67. data/lib/chef/resource/chef_client_config.rb +10 -5
  68. data/lib/chef/resource/chef_client_cron.rb +3 -3
  69. data/lib/chef/resource/chef_client_launchd.rb +3 -3
  70. data/lib/chef/resource/chef_client_scheduled_task.rb +15 -15
  71. data/lib/chef/resource/chef_client_systemd_timer.rb +3 -3
  72. data/lib/chef/resource/chef_client_trusted_certificate.rb +2 -2
  73. data/lib/chef/resource/chef_handler.rb +2 -2
  74. data/lib/chef/resource/chef_sleep.rb +1 -1
  75. data/lib/chef/resource/chef_vault_secret.rb +2 -2
  76. data/lib/chef/resource/chocolatey_feature.rb +2 -2
  77. data/lib/chef/resource/chocolatey_source.rb +1 -1
  78. data/lib/chef/resource/cron/cron_d.rb +4 -6
  79. data/lib/chef/resource/cron_access.rb +1 -1
  80. data/lib/chef/resource/dmg_package.rb +1 -1
  81. data/lib/chef/resource/dsc_resource.rb +1 -1
  82. data/lib/chef/resource/execute.rb +5 -5
  83. data/lib/chef/resource/gem_package.rb +2 -1
  84. data/lib/chef/resource/group.rb +4 -4
  85. data/lib/chef/resource/habitat/_habitat_shared.rb +28 -0
  86. data/lib/chef/resource/habitat/habitat_package.rb +129 -0
  87. data/lib/chef/resource/habitat/habitat_sup.rb +329 -0
  88. data/lib/chef/resource/habitat/habitat_sup_systemd.rb +67 -0
  89. data/lib/chef/resource/habitat/habitat_sup_windows.rb +90 -0
  90. data/lib/chef/resource/habitat_config.rb +107 -0
  91. data/lib/chef/resource/habitat_install.rb +247 -0
  92. data/lib/chef/resource/habitat_service.rb +451 -0
  93. data/lib/chef/resource/habitat_user_toml.rb +92 -0
  94. data/lib/chef/resource/homebrew_cask.rb +18 -7
  95. data/lib/chef/resource/homebrew_package.rb +1 -1
  96. data/lib/chef/resource/homebrew_tap.rb +4 -3
  97. data/lib/chef/resource/homebrew_update.rb +2 -2
  98. data/lib/chef/resource/hostname.rb +49 -7
  99. data/lib/chef/resource/inspec_waiver_file_entry.rb +156 -0
  100. data/lib/chef/resource/kernel_module.rb +6 -6
  101. data/lib/chef/resource/launchd.rb +3 -3
  102. data/lib/chef/resource/locale.rb +1 -1
  103. data/lib/chef/resource/lwrp_base.rb +18 -3
  104. data/lib/chef/resource/macos_userdefaults.rb +2 -2
  105. data/lib/chef/resource/ohai_hint.rb +2 -6
  106. data/lib/chef/resource/openbsd_package.rb +17 -0
  107. data/lib/chef/resource/openssl_dhparam.rb +1 -2
  108. data/lib/chef/resource/openssl_ec_private_key.rb +1 -3
  109. data/lib/chef/resource/openssl_ec_public_key.rb +1 -3
  110. data/lib/chef/resource/openssl_rsa_private_key.rb +1 -3
  111. data/lib/chef/resource/openssl_rsa_public_key.rb +1 -3
  112. data/lib/chef/resource/openssl_x509_certificate.rb +1 -4
  113. data/lib/chef/resource/openssl_x509_crl.rb +1 -3
  114. data/lib/chef/resource/openssl_x509_request.rb +1 -3
  115. data/lib/chef/resource/osx_profile.rb +3 -3
  116. data/lib/chef/resource/plist.rb +1 -1
  117. data/lib/chef/resource/powershell_package_source.rb +2 -4
  118. data/lib/chef/resource/reboot.rb +38 -9
  119. data/lib/chef/resource/remote_directory.rb +2 -2
  120. data/lib/chef/resource/remote_file.rb +3 -3
  121. data/lib/chef/resource/rhsm_errata.rb +0 -2
  122. data/lib/chef/resource/rhsm_errata_level.rb +1 -5
  123. data/lib/chef/resource/rhsm_repo.rb +15 -0
  124. data/lib/chef/resource/rhsm_subscription.rb +5 -5
  125. data/lib/chef/resource/ruby_block.rb +100 -0
  126. data/lib/chef/resource/scm/subversion.rb +1 -1
  127. data/lib/chef/resource/ssh_known_hosts_entry.rb +4 -7
  128. data/lib/chef/resource/sudo.rb +2 -6
  129. data/lib/chef/resource/support/HabService.dll.config.erb +19 -0
  130. data/lib/chef/resource/support/client.erb +8 -1
  131. data/lib/chef/resource/support/sup.toml.erb +179 -0
  132. data/lib/chef/resource/swap_file.rb +2 -6
  133. data/lib/chef/resource/sysctl.rb +2 -2
  134. data/lib/chef/resource/systemd_unit.rb +3 -3
  135. data/lib/chef/resource/timezone.rb +1 -1
  136. data/lib/chef/resource/user_ulimit.rb +2 -2
  137. data/lib/chef/resource/windows_ad_join.rb +2 -2
  138. data/lib/chef/resource/windows_audit_policy.rb +2 -2
  139. data/lib/chef/resource/windows_auto_run.rb +2 -2
  140. data/lib/chef/resource/windows_certificate.rb +1 -1
  141. data/lib/chef/resource/windows_defender.rb +163 -0
  142. data/lib/chef/resource/windows_defender_exclusion.rb +125 -0
  143. data/lib/chef/resource/windows_dfs_folder.rb +2 -2
  144. data/lib/chef/resource/windows_dfs_namespace.rb +2 -2
  145. data/lib/chef/resource/windows_dns_record.rb +2 -2
  146. data/lib/chef/resource/windows_dns_zone.rb +2 -2
  147. data/lib/chef/resource/windows_env.rb +1 -1
  148. data/lib/chef/resource/windows_feature.rb +3 -3
  149. data/lib/chef/resource/windows_feature_dism.rb +3 -5
  150. data/lib/chef/resource/windows_feature_powershell.rb +3 -3
  151. data/lib/chef/resource/windows_firewall_profile.rb +2 -2
  152. data/lib/chef/resource/windows_firewall_rule.rb +20 -6
  153. data/lib/chef/resource/windows_font.rb +2 -2
  154. data/lib/chef/resource/windows_pagefile.rb +104 -65
  155. data/lib/chef/resource/windows_path.rb +4 -4
  156. data/lib/chef/resource/windows_printer.rb +80 -61
  157. data/lib/chef/resource/windows_printer_port.rb +48 -65
  158. data/lib/chef/resource/windows_security_policy.rb +7 -4
  159. data/lib/chef/resource/windows_share.rb +2 -2
  160. data/lib/chef/resource/windows_shortcut.rb +1 -1
  161. data/lib/chef/resource/windows_task.rb +2 -2
  162. data/lib/chef/resource/windows_uac.rb +3 -5
  163. data/lib/chef/resource/windows_update_settings.rb +259 -0
  164. data/lib/chef/resource/windows_user_privilege.rb +2 -2
  165. data/lib/chef/resource/windows_workgroup.rb +2 -2
  166. data/lib/chef/resource/yum_package.rb +11 -15
  167. data/lib/chef/resource/zypper_package.rb +4 -4
  168. data/lib/chef/resource/zypper_repository.rb +28 -8
  169. data/lib/chef/resource.rb +20 -25
  170. data/lib/chef/resource_builder.rb +8 -2
  171. data/lib/chef/resource_inspector.rb +6 -2
  172. data/lib/chef/resource_reporter.rb +0 -1
  173. data/lib/chef/resources.rb +13 -1
  174. data/lib/chef/run_lock.rb +1 -1
  175. data/lib/chef/runner.rb +1 -1
  176. data/lib/chef/secret_fetcher/aws_secrets_manager.rb +65 -0
  177. data/lib/chef/secret_fetcher/azure_key_vault.rb +78 -0
  178. data/lib/chef/secret_fetcher/base.rb +76 -0
  179. data/lib/chef/secret_fetcher/example.rb +46 -0
  180. data/lib/chef/secret_fetcher.rb +55 -0
  181. data/lib/chef/shell/ext.rb +3 -3
  182. data/lib/chef/version.rb +1 -1
  183. data/lib/chef/win32/api.rb +9 -2
  184. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  185. data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
  186. data/spec/data/knife_subcommand/test_explicit_category.rb +7 -0
  187. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -0
  188. data/spec/data/knife_subcommand/test_yourself.rb +21 -0
  189. data/spec/functional/mixin/from_file_spec.rb +1 -1
  190. data/spec/functional/resource/dnf_package_spec.rb +857 -537
  191. data/spec/functional/resource/group_spec.rb +1 -1
  192. data/spec/functional/resource/link_spec.rb +1 -1
  193. data/spec/functional/resource/remote_file_spec.rb +1 -1
  194. data/spec/functional/resource/windows_env_spec.rb +2 -2
  195. data/spec/functional/resource/windows_hostname_spec.rb +91 -0
  196. data/spec/functional/resource/windows_pagefile_spec.rb +98 -0
  197. data/spec/functional/resource/yum_package_spec.rb +495 -428
  198. data/spec/integration/client/client_spec.rb +0 -20
  199. data/spec/integration/compliance/compliance_spec.rb +1 -0
  200. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -1
  201. data/spec/integration/recipes/resource_action_spec.rb +6 -6
  202. data/spec/integration/recipes/unified_mode_spec.rb +70 -0
  203. data/spec/spec_helper.rb +3 -0
  204. data/spec/support/chef_helpers.rb +1 -1
  205. data/spec/support/shared/functional/execute_resource.rb +1 -1
  206. data/spec/support/shared/functional/knife.rb +37 -0
  207. data/spec/support/shared/integration/knife_support.rb +192 -0
  208. data/spec/support/shared/unit/knife_shared.rb +39 -0
  209. data/spec/support/shared/unit/provider/file.rb +3 -9
  210. data/spec/unit/chef_fs/file_system/repository/directory_spec.rb +1 -1
  211. data/spec/unit/compliance/runner_spec.rb +46 -2
  212. data/spec/unit/cookbook_version_spec.rb +52 -0
  213. data/spec/unit/data_collector_spec.rb +47 -1
  214. data/spec/unit/dsl/render_helpers_spec.rb +102 -0
  215. data/spec/unit/dsl/secret_spec.rb +71 -0
  216. data/spec/unit/handler_spec.rb +8 -2
  217. data/spec/unit/policy_builder/dynamic_spec.rb +0 -5
  218. data/spec/unit/policy_builder/policyfile_spec.rb +144 -56
  219. data/spec/unit/provider/apt_update_spec.rb +3 -1
  220. data/spec/unit/provider/link_spec.rb +1 -1
  221. data/spec/unit/provider/mount/aix_spec.rb +1 -1
  222. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -0
  223. data/spec/unit/provider/package/powershell_spec.rb +74 -12
  224. data/spec/unit/provider/package/yum/python_helper_spec.rb +1 -0
  225. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  226. data/spec/unit/provider/systemd_unit_spec.rb +2 -2
  227. data/spec/unit/provider/zypper_repository_spec.rb +3 -10
  228. data/spec/unit/provider_spec.rb +23 -0
  229. data/spec/unit/resource/homebrew_cask_spec.rb +29 -11
  230. data/spec/unit/resource/inspec_waiver_file_entry_spec.rb +80 -0
  231. data/spec/unit/resource/rhsm_subscription_spec.rb +50 -3
  232. data/spec/unit/resource/systemd_unit_spec.rb +1 -1
  233. data/spec/unit/resource/windows_defender_exclusion_spec.rb +62 -0
  234. data/spec/unit/resource/windows_defender_spec.rb +71 -0
  235. data/spec/unit/resource/windows_firewall_rule_spec.rb +12 -7
  236. data/spec/unit/resource/windows_pagefile_spec.rb +4 -9
  237. data/spec/unit/resource/windows_update_settings_spec.rb +64 -0
  238. data/spec/unit/resource/zypper_repository_spec.rb +1 -1
  239. data/spec/unit/resource_spec.rb +19 -8
  240. data/spec/unit/secret_fetcher/aws_secrets_manager_spec.rb +70 -0
  241. data/spec/unit/secret_fetcher/azure_key_vault_spec.rb +70 -0
  242. data/spec/unit/secret_fetcher_spec.rb +82 -0
  243. data/tasks/rspec.rb +4 -9
  244. metadata +65 -161
  245. data/lib/chef/provider/package/yum/simplejson/LICENSE.txt +0 -79
  246. data/lib/chef/provider/package/yum/simplejson/__init__.py +0 -318
  247. data/lib/chef/provider/package/yum/simplejson/__init__.pyc +0 -0
  248. data/lib/chef/provider/package/yum/simplejson/decoder.py +0 -354
  249. data/lib/chef/provider/package/yum/simplejson/decoder.pyc +0 -0
  250. data/lib/chef/provider/package/yum/simplejson/encoder.py +0 -440
  251. data/lib/chef/provider/package/yum/simplejson/encoder.pyc +0 -0
  252. data/lib/chef/provider/package/yum/simplejson/scanner.py +0 -65
  253. data/lib/chef/provider/package/yum/simplejson/scanner.pyc +0 -0
  254. data/lib/chef/provider/package/yum/simplejson/tool.py +0 -37
@@ -1,440 +0,0 @@
1
- """Implementation of JSONEncoder
2
- """
3
- import re
4
-
5
- try:
6
- from simplejson._speedups import encode_basestring_ascii as c_encode_basestring_ascii
7
- except ImportError:
8
- c_encode_basestring_ascii = None
9
- try:
10
- from simplejson._speedups import make_encoder as c_make_encoder
11
- except ImportError:
12
- c_make_encoder = None
13
-
14
- ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
15
- ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
16
- HAS_UTF8 = re.compile(r'[\x80-\xff]')
17
- ESCAPE_DCT = {
18
- '\\': '\\\\',
19
- '"': '\\"',
20
- '\b': '\\b',
21
- '\f': '\\f',
22
- '\n': '\\n',
23
- '\r': '\\r',
24
- '\t': '\\t',
25
- }
26
- for i in range(0x20):
27
- #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
28
- ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
29
-
30
- # Assume this produces an infinity on all machines (probably not guaranteed)
31
- INFINITY = float('1e66666')
32
- FLOAT_REPR = repr
33
-
34
- def encode_basestring(s):
35
- """Return a JSON representation of a Python string
36
-
37
- """
38
- def replace(match):
39
- return ESCAPE_DCT[match.group(0)]
40
- return '"' + ESCAPE.sub(replace, s) + '"'
41
-
42
-
43
- def py_encode_basestring_ascii(s):
44
- """Return an ASCII-only JSON representation of a Python string
45
-
46
- """
47
- if isinstance(s, str) and HAS_UTF8.search(s) is not None:
48
- s = s.decode('utf-8')
49
- def replace(match):
50
- s = match.group(0)
51
- try:
52
- return ESCAPE_DCT[s]
53
- except KeyError:
54
- n = ord(s)
55
- if n < 0x10000:
56
- #return '\\u{0:04x}'.format(n)
57
- return '\\u%04x' % (n,)
58
- else:
59
- # surrogate pair
60
- n -= 0x10000
61
- s1 = 0xd800 | ((n >> 10) & 0x3ff)
62
- s2 = 0xdc00 | (n & 0x3ff)
63
- #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
64
- return '\\u%04x\\u%04x' % (s1, s2)
65
- return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
66
-
67
-
68
- encode_basestring_ascii = c_encode_basestring_ascii or py_encode_basestring_ascii
69
-
70
- class JSONEncoder(object):
71
- """Extensible JSON <http://json.org> encoder for Python data structures.
72
-
73
- Supports the following objects and types by default:
74
-
75
- +-------------------+---------------+
76
- | Python | JSON |
77
- +===================+===============+
78
- | dict | object |
79
- +-------------------+---------------+
80
- | list, tuple | array |
81
- +-------------------+---------------+
82
- | str, unicode | string |
83
- +-------------------+---------------+
84
- | int, long, float | number |
85
- +-------------------+---------------+
86
- | True | true |
87
- +-------------------+---------------+
88
- | False | false |
89
- +-------------------+---------------+
90
- | None | null |
91
- +-------------------+---------------+
92
-
93
- To extend this to recognize other objects, subclass and implement a
94
- ``.default()`` method with another method that returns a serializable
95
- object for ``o`` if possible, otherwise it should call the superclass
96
- implementation (to raise ``TypeError``).
97
-
98
- """
99
- item_separator = ', '
100
- key_separator = ': '
101
- def __init__(self, skipkeys=False, ensure_ascii=True,
102
- check_circular=True, allow_nan=True, sort_keys=False,
103
- indent=None, separators=None, encoding='utf-8', default=None):
104
- """Constructor for JSONEncoder, with sensible defaults.
105
-
106
- If skipkeys is false, then it is a TypeError to attempt
107
- encoding of keys that are not str, int, long, float or None. If
108
- skipkeys is True, such items are simply skipped.
109
-
110
- If ensure_ascii is true, the output is guaranteed to be str
111
- objects with all incoming unicode characters escaped. If
112
- ensure_ascii is false, the output will be unicode object.
113
-
114
- If check_circular is true, then lists, dicts, and custom encoded
115
- objects will be checked for circular references during encoding to
116
- prevent an infinite recursion (which would cause an OverflowError).
117
- Otherwise, no such check takes place.
118
-
119
- If allow_nan is true, then NaN, Infinity, and -Infinity will be
120
- encoded as such. This behavior is not JSON specification compliant,
121
- but is consistent with most JavaScript based encoders and decoders.
122
- Otherwise, it will be a ValueError to encode such floats.
123
-
124
- If sort_keys is true, then the output of dictionaries will be
125
- sorted by key; this is useful for regression tests to ensure
126
- that JSON serializations can be compared on a day-to-day basis.
127
-
128
- If indent is a non-negative integer, then JSON array
129
- elements and object members will be pretty-printed with that
130
- indent level. An indent level of 0 will only insert newlines.
131
- None is the most compact representation.
132
-
133
- If specified, separators should be a (item_separator, key_separator)
134
- tuple. The default is (', ', ': '). To get the most compact JSON
135
- representation you should specify (',', ':') to eliminate whitespace.
136
-
137
- If specified, default is a function that gets called for objects
138
- that can't otherwise be serialized. It should return a JSON encodable
139
- version of the object or raise a ``TypeError``.
140
-
141
- If encoding is not None, then all input strings will be
142
- transformed into unicode using that encoding prior to JSON-encoding.
143
- The default is UTF-8.
144
-
145
- """
146
-
147
- self.skipkeys = skipkeys
148
- self.ensure_ascii = ensure_ascii
149
- self.check_circular = check_circular
150
- self.allow_nan = allow_nan
151
- self.sort_keys = sort_keys
152
- self.indent = indent
153
- if separators is not None:
154
- self.item_separator, self.key_separator = separators
155
- if default is not None:
156
- self.default = default
157
- self.encoding = encoding
158
-
159
- def default(self, o):
160
- """Implement this method in a subclass such that it returns
161
- a serializable object for ``o``, or calls the base implementation
162
- (to raise a ``TypeError``).
163
-
164
- For example, to support arbitrary iterators, you could
165
- implement default like this::
166
-
167
- def default(self, o):
168
- try:
169
- iterable = iter(o)
170
- except TypeError:
171
- pass
172
- else:
173
- return list(iterable)
174
- return JSONEncoder.default(self, o)
175
-
176
- """
177
- raise TypeError(repr(o) + " is not JSON serializable")
178
-
179
- def encode(self, o):
180
- """Return a JSON string representation of a Python data structure.
181
-
182
- >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
183
- '{"foo": ["bar", "baz"]}'
184
-
185
- """
186
- # This is for extremely simple cases and benchmarks.
187
- if isinstance(o, basestring):
188
- if isinstance(o, str):
189
- _encoding = self.encoding
190
- if (_encoding is not None
191
- and not (_encoding == 'utf-8')):
192
- o = o.decode(_encoding)
193
- if self.ensure_ascii:
194
- return encode_basestring_ascii(o)
195
- else:
196
- return encode_basestring(o)
197
- # This doesn't pass the iterator directly to ''.join() because the
198
- # exceptions aren't as detailed. The list call should be roughly
199
- # equivalent to the PySequence_Fast that ''.join() would do.
200
- chunks = self.iterencode(o, _one_shot=True)
201
- if not isinstance(chunks, (list, tuple)):
202
- chunks = list(chunks)
203
- return ''.join(chunks)
204
-
205
- def iterencode(self, o, _one_shot=False):
206
- """Encode the given object and yield each string
207
- representation as available.
208
-
209
- For example::
210
-
211
- for chunk in JSONEncoder().iterencode(bigobject):
212
- mysocket.write(chunk)
213
-
214
- """
215
- if self.check_circular:
216
- markers = {}
217
- else:
218
- markers = None
219
- if self.ensure_ascii:
220
- _encoder = encode_basestring_ascii
221
- else:
222
- _encoder = encode_basestring
223
- if self.encoding != 'utf-8':
224
- def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
225
- if isinstance(o, str):
226
- o = o.decode(_encoding)
227
- return _orig_encoder(o)
228
-
229
- def floatstr(o, allow_nan=self.allow_nan, _repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY):
230
- # Check for specials. Note that this type of test is processor- and/or
231
- # platform-specific, so do tests which don't depend on the internals.
232
-
233
- if o != o:
234
- text = 'NaN'
235
- elif o == _inf:
236
- text = 'Infinity'
237
- elif o == _neginf:
238
- text = '-Infinity'
239
- else:
240
- return _repr(o)
241
-
242
- if not allow_nan:
243
- raise ValueError(
244
- "Out of range float values are not JSON compliant: " +
245
- repr(o))
246
-
247
- return text
248
-
249
-
250
- if _one_shot and c_make_encoder is not None and not self.indent and not self.sort_keys:
251
- _iterencode = c_make_encoder(
252
- markers, self.default, _encoder, self.indent,
253
- self.key_separator, self.item_separator, self.sort_keys,
254
- self.skipkeys, self.allow_nan)
255
- else:
256
- _iterencode = _make_iterencode(
257
- markers, self.default, _encoder, self.indent, floatstr,
258
- self.key_separator, self.item_separator, self.sort_keys,
259
- self.skipkeys, _one_shot)
260
- return _iterencode(o, 0)
261
-
262
- def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
263
- ## HACK: hand-optimized bytecode; turn globals into locals
264
- False=False,
265
- True=True,
266
- ValueError=ValueError,
267
- basestring=basestring,
268
- dict=dict,
269
- float=float,
270
- id=id,
271
- int=int,
272
- isinstance=isinstance,
273
- list=list,
274
- long=long,
275
- str=str,
276
- tuple=tuple,
277
- ):
278
-
279
- def _iterencode_list(lst, _current_indent_level):
280
- if not lst:
281
- yield '[]'
282
- return
283
- if markers is not None:
284
- markerid = id(lst)
285
- if markerid in markers:
286
- raise ValueError("Circular reference detected")
287
- markers[markerid] = lst
288
- buf = '['
289
- if _indent is not None:
290
- _current_indent_level += 1
291
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
292
- separator = _item_separator + newline_indent
293
- buf += newline_indent
294
- else:
295
- newline_indent = None
296
- separator = _item_separator
297
- first = True
298
- for value in lst:
299
- if first:
300
- first = False
301
- else:
302
- buf = separator
303
- if isinstance(value, basestring):
304
- yield buf + _encoder(value)
305
- elif value is None:
306
- yield buf + 'null'
307
- elif value is True:
308
- yield buf + 'true'
309
- elif value is False:
310
- yield buf + 'false'
311
- elif isinstance(value, (int, long)):
312
- yield buf + str(value)
313
- elif isinstance(value, float):
314
- yield buf + _floatstr(value)
315
- else:
316
- yield buf
317
- if isinstance(value, (list, tuple)):
318
- chunks = _iterencode_list(value, _current_indent_level)
319
- elif isinstance(value, dict):
320
- chunks = _iterencode_dict(value, _current_indent_level)
321
- else:
322
- chunks = _iterencode(value, _current_indent_level)
323
- for chunk in chunks:
324
- yield chunk
325
- if newline_indent is not None:
326
- _current_indent_level -= 1
327
- yield '\n' + (' ' * (_indent * _current_indent_level))
328
- yield ']'
329
- if markers is not None:
330
- del markers[markerid]
331
-
332
- def _iterencode_dict(dct, _current_indent_level):
333
- if not dct:
334
- yield '{}'
335
- return
336
- if markers is not None:
337
- markerid = id(dct)
338
- if markerid in markers:
339
- raise ValueError("Circular reference detected")
340
- markers[markerid] = dct
341
- yield '{'
342
- if _indent is not None:
343
- _current_indent_level += 1
344
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
345
- item_separator = _item_separator + newline_indent
346
- yield newline_indent
347
- else:
348
- newline_indent = None
349
- item_separator = _item_separator
350
- first = True
351
- if _sort_keys:
352
- items = dct.items()
353
- items.sort(key=lambda kv: kv[0])
354
- else:
355
- items = dct.iteritems()
356
- for key, value in items:
357
- if isinstance(key, basestring):
358
- pass
359
- # JavaScript is weakly typed for these, so it makes sense to
360
- # also allow them. Many encoders seem to do something like this.
361
- elif isinstance(key, float):
362
- key = _floatstr(key)
363
- elif key is True:
364
- key = 'true'
365
- elif key is False:
366
- key = 'false'
367
- elif key is None:
368
- key = 'null'
369
- elif isinstance(key, (int, long)):
370
- key = str(key)
371
- elif _skipkeys:
372
- continue
373
- else:
374
- raise TypeError("key " + repr(key) + " is not a string")
375
- if first:
376
- first = False
377
- else:
378
- yield item_separator
379
- yield _encoder(key)
380
- yield _key_separator
381
- if isinstance(value, basestring):
382
- yield _encoder(value)
383
- elif value is None:
384
- yield 'null'
385
- elif value is True:
386
- yield 'true'
387
- elif value is False:
388
- yield 'false'
389
- elif isinstance(value, (int, long)):
390
- yield str(value)
391
- elif isinstance(value, float):
392
- yield _floatstr(value)
393
- else:
394
- if isinstance(value, (list, tuple)):
395
- chunks = _iterencode_list(value, _current_indent_level)
396
- elif isinstance(value, dict):
397
- chunks = _iterencode_dict(value, _current_indent_level)
398
- else:
399
- chunks = _iterencode(value, _current_indent_level)
400
- for chunk in chunks:
401
- yield chunk
402
- if newline_indent is not None:
403
- _current_indent_level -= 1
404
- yield '\n' + (' ' * (_indent * _current_indent_level))
405
- yield '}'
406
- if markers is not None:
407
- del markers[markerid]
408
-
409
- def _iterencode(o, _current_indent_level):
410
- if isinstance(o, basestring):
411
- yield _encoder(o)
412
- elif o is None:
413
- yield 'null'
414
- elif o is True:
415
- yield 'true'
416
- elif o is False:
417
- yield 'false'
418
- elif isinstance(o, (int, long)):
419
- yield str(o)
420
- elif isinstance(o, float):
421
- yield _floatstr(o)
422
- elif isinstance(o, (list, tuple)):
423
- for chunk in _iterencode_list(o, _current_indent_level):
424
- yield chunk
425
- elif isinstance(o, dict):
426
- for chunk in _iterencode_dict(o, _current_indent_level):
427
- yield chunk
428
- else:
429
- if markers is not None:
430
- markerid = id(o)
431
- if markerid in markers:
432
- raise ValueError("Circular reference detected")
433
- markers[markerid] = o
434
- o = _default(o)
435
- for chunk in _iterencode(o, _current_indent_level):
436
- yield chunk
437
- if markers is not None:
438
- del markers[markerid]
439
-
440
- return _iterencode
@@ -1,65 +0,0 @@
1
- """JSON token scanner
2
- """
3
- import re
4
- try:
5
- from simplejson._speedups import make_scanner as c_make_scanner
6
- except ImportError:
7
- c_make_scanner = None
8
-
9
- __all__ = ['make_scanner']
10
-
11
- NUMBER_RE = re.compile(
12
- r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
13
- (re.VERBOSE | re.MULTILINE | re.DOTALL))
14
-
15
- def py_make_scanner(context):
16
- parse_object = context.parse_object
17
- parse_array = context.parse_array
18
- parse_string = context.parse_string
19
- match_number = NUMBER_RE.match
20
- encoding = context.encoding
21
- strict = context.strict
22
- parse_float = context.parse_float
23
- parse_int = context.parse_int
24
- parse_constant = context.parse_constant
25
- object_hook = context.object_hook
26
-
27
- def _scan_once(string, idx):
28
- try:
29
- nextchar = string[idx]
30
- except IndexError:
31
- raise StopIteration
32
-
33
- if nextchar == '"':
34
- return parse_string(string, idx + 1, encoding, strict)
35
- elif nextchar == '{':
36
- return parse_object((string, idx + 1), encoding, strict, _scan_once, object_hook)
37
- elif nextchar == '[':
38
- return parse_array((string, idx + 1), _scan_once)
39
- elif nextchar == 'n' and string[idx:idx + 4] == 'null':
40
- return None, idx + 4
41
- elif nextchar == 't' and string[idx:idx + 4] == 'true':
42
- return True, idx + 4
43
- elif nextchar == 'f' and string[idx:idx + 5] == 'false':
44
- return False, idx + 5
45
-
46
- m = match_number(string, idx)
47
- if m is not None:
48
- integer, frac, exp = m.groups()
49
- if frac or exp:
50
- res = parse_float(integer + (frac or '') + (exp or ''))
51
- else:
52
- res = parse_int(integer)
53
- return res, m.end()
54
- elif nextchar == 'N' and string[idx:idx + 3] == 'NaN':
55
- return parse_constant('NaN'), idx + 3
56
- elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity':
57
- return parse_constant('Infinity'), idx + 8
58
- elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
59
- return parse_constant('-Infinity'), idx + 9
60
- else:
61
- raise StopIteration
62
-
63
- return _scan_once
64
-
65
- make_scanner = c_make_scanner or py_make_scanner