dependabot-hex 0.107.13 → 0.107.14
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.
- checksums.yaml +4 -4
- data/helpers/deps/jason/.fetch +0 -0
- data/helpers/deps/jason/.hex +2 -0
- data/helpers/deps/jason/CHANGELOG.md +60 -0
- data/helpers/deps/jason/LICENSE +13 -0
- data/helpers/deps/jason/README.md +179 -0
- data/helpers/deps/jason/hex_metadata.config +20 -0
- data/helpers/deps/jason/lib/codegen.ex +158 -0
- data/helpers/deps/jason/lib/decoder.ex +657 -0
- data/helpers/deps/jason/lib/encode.ex +630 -0
- data/helpers/deps/jason/lib/encoder.ex +216 -0
- data/helpers/deps/jason/lib/formatter.ex +253 -0
- data/helpers/deps/jason/lib/fragment.ex +11 -0
- data/helpers/deps/jason/lib/helpers.ex +90 -0
- data/helpers/deps/jason/lib/jason.ex +228 -0
- data/helpers/deps/jason/mix.exs +92 -0
- metadata +18 -3
@@ -0,0 +1,90 @@
|
|
1
|
+
defmodule Jason.Helpers do
|
2
|
+
@moduledoc """
|
3
|
+
Provides macro facilities for partial compile-time encoding of JSON.
|
4
|
+
"""
|
5
|
+
|
6
|
+
alias Jason.{Codegen, Fragment}
|
7
|
+
|
8
|
+
@doc ~S"""
|
9
|
+
Encodes a JSON map from a compile-time keyword.
|
10
|
+
|
11
|
+
Encodes the keys at compile time and strives to create as flat iodata
|
12
|
+
structure as possible to achieve maximum efficiency. Does encoding
|
13
|
+
right at the call site, but returns an `%Jason.Fragment{}` struct
|
14
|
+
that needs to be passed to one of the "main" encoding functions -
|
15
|
+
for example `Jason.encode/2` for final encoding into JSON - this
|
16
|
+
makes it completely transparent for most uses.
|
17
|
+
|
18
|
+
Only allows keys that do not require escaping in any of the supported
|
19
|
+
encoding modes. This means only ASCII characters from the range
|
20
|
+
0x1F..0x7F excluding '\', '/' and '"' are allowed - this also excludes
|
21
|
+
all control characters like newlines.
|
22
|
+
|
23
|
+
Preserves the order of the keys.
|
24
|
+
|
25
|
+
## Example
|
26
|
+
|
27
|
+
iex> fragment = json_map(foo: 1, bar: 2)
|
28
|
+
iex> Jason.encode!(fragment)
|
29
|
+
"{\"foo\":1,\"bar\":2}"
|
30
|
+
|
31
|
+
"""
|
32
|
+
defmacro json_map(kv) do
|
33
|
+
escape = quote(do: escape)
|
34
|
+
encode_map = quote(do: encode_map)
|
35
|
+
encode_args = [escape, encode_map]
|
36
|
+
kv_iodata = Codegen.build_kv_iodata(Macro.expand(kv, __CALLER__), encode_args)
|
37
|
+
|
38
|
+
quote do
|
39
|
+
%Fragment{
|
40
|
+
encode: fn {unquote(escape), unquote(encode_map)} ->
|
41
|
+
unquote(kv_iodata)
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
@doc ~S"""
|
48
|
+
Encodes a JSON map from a variable containing a map and a compile-time
|
49
|
+
list of keys.
|
50
|
+
|
51
|
+
It is equivalent to calling `Map.take/2` before encoding. Otherwise works
|
52
|
+
similar to `json_map/2`.
|
53
|
+
|
54
|
+
## Example
|
55
|
+
|
56
|
+
iex> map = %{a: 1, b: 2, c: 3}
|
57
|
+
iex> fragment = json_map_take(map, [:c, :b])
|
58
|
+
iex> Jason.encode!(fragment)
|
59
|
+
"{\"c\":3,\"b\":2}"
|
60
|
+
|
61
|
+
"""
|
62
|
+
defmacro json_map_take(map, take) do
|
63
|
+
take = Macro.expand(take, __CALLER__)
|
64
|
+
kv = Enum.map(take, &{&1, generated_var(&1, Codegen)})
|
65
|
+
escape = quote(do: escape)
|
66
|
+
encode_map = quote(do: encode_map)
|
67
|
+
encode_args = [escape, encode_map]
|
68
|
+
kv_iodata = Codegen.build_kv_iodata(kv, encode_args)
|
69
|
+
|
70
|
+
quote do
|
71
|
+
case unquote(map) do
|
72
|
+
%{unquote_splicing(kv)} ->
|
73
|
+
%Fragment{
|
74
|
+
encode: fn {unquote(escape), unquote(encode_map)} ->
|
75
|
+
unquote(kv_iodata)
|
76
|
+
end
|
77
|
+
}
|
78
|
+
|
79
|
+
other ->
|
80
|
+
raise ArgumentError,
|
81
|
+
"expected a map with keys: #{unquote(inspect(take))}, got: #{inspect(other)}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# The same as Macro.var/2 except it sets generated: true
|
87
|
+
defp generated_var(name, context) do
|
88
|
+
{name, [generated: true], context}
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
defmodule Jason do
|
2
|
+
@moduledoc """
|
3
|
+
A blazing fast JSON parser and generator in pure Elixir.
|
4
|
+
"""
|
5
|
+
|
6
|
+
alias Jason.{Encode, Decoder, DecodeError, EncodeError, Formatter}
|
7
|
+
|
8
|
+
@type escape :: :json | :unicode_safe | :html_safe | :javascript_safe
|
9
|
+
@type maps :: :naive | :strict
|
10
|
+
|
11
|
+
@type encode_opt :: {:escape, escape} | {:maps, maps} | {:pretty, true | Formatter.opts()}
|
12
|
+
|
13
|
+
@type keys :: :atoms | :atoms! | :strings | :copy | (String.t() -> term)
|
14
|
+
|
15
|
+
@type strings :: :reference | :copy
|
16
|
+
|
17
|
+
@type decode_opt :: {:keys, keys} | {:strings, strings}
|
18
|
+
|
19
|
+
@doc """
|
20
|
+
Parses a JSON value from `input` iodata.
|
21
|
+
|
22
|
+
## Options
|
23
|
+
|
24
|
+
* `:keys` - controls how keys in objects are decoded. Possible values are:
|
25
|
+
|
26
|
+
* `:strings` (default) - decodes keys as binary strings,
|
27
|
+
* `:atoms` - keys are converted to atoms using `String.to_atom/1`,
|
28
|
+
* `:atoms!` - keys are converted to atoms using `String.to_existing_atom/1`,
|
29
|
+
* custom decoder - additionally a function accepting a string and returning a key
|
30
|
+
is accepted.
|
31
|
+
|
32
|
+
* `:strings` - controls how strings (including keys) are decoded. Possible values are:
|
33
|
+
|
34
|
+
* `:reference` (default) - when possible tries to create a sub-binary into the original
|
35
|
+
* `:copy` - always copies the strings. This option is especially useful when parts of the
|
36
|
+
decoded data will be stored for a long time (in ets or some process) to avoid keeping
|
37
|
+
the reference to the original data.
|
38
|
+
|
39
|
+
## Decoding keys to atoms
|
40
|
+
|
41
|
+
The `:atoms` option uses the `String.to_atom/1` call that can create atoms at runtime.
|
42
|
+
Since the atoms are not garbage collected, this can pose a DoS attack vector when used
|
43
|
+
on user-controlled data.
|
44
|
+
|
45
|
+
## Examples
|
46
|
+
|
47
|
+
iex> Jason.decode("{}")
|
48
|
+
{:ok, %{}}
|
49
|
+
|
50
|
+
iex> Jason.decode("invalid")
|
51
|
+
{:error, %Jason.DecodeError{data: "invalid", position: 0, token: nil}}
|
52
|
+
"""
|
53
|
+
@spec decode(iodata, [decode_opt]) :: {:ok, term} | {:error, DecodeError.t()}
|
54
|
+
def decode(input, opts \\ []) do
|
55
|
+
input = IO.iodata_to_binary(input)
|
56
|
+
Decoder.parse(input, format_decode_opts(opts))
|
57
|
+
end
|
58
|
+
|
59
|
+
@doc """
|
60
|
+
Parses a JSON value from `input` iodata.
|
61
|
+
|
62
|
+
Similar to `decode/2` except it will unwrap the error tuple and raise
|
63
|
+
in case of errors.
|
64
|
+
|
65
|
+
## Examples
|
66
|
+
|
67
|
+
iex> Jason.decode!("{}")
|
68
|
+
%{}
|
69
|
+
|
70
|
+
iex> Jason.decode!("invalid")
|
71
|
+
** (Jason.DecodeError) unexpected byte at position 0: 0x69 ('i')
|
72
|
+
|
73
|
+
"""
|
74
|
+
@spec decode!(iodata, [decode_opt]) :: term | no_return
|
75
|
+
def decode!(input, opts \\ []) do
|
76
|
+
case decode(input, opts) do
|
77
|
+
{:ok, result} -> result
|
78
|
+
{:error, error} -> raise error
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
@doc """
|
83
|
+
Generates JSON corresponding to `input`.
|
84
|
+
|
85
|
+
The generation is controlled by the `Jason.Encoder` protocol,
|
86
|
+
please refer to the module to read more on how to define the protocol
|
87
|
+
for custom data types.
|
88
|
+
|
89
|
+
## Options
|
90
|
+
|
91
|
+
* `:escape` - controls how strings are encoded. Possible values are:
|
92
|
+
|
93
|
+
* `:json` (default) - the regular JSON escaping as defined by RFC 7159.
|
94
|
+
* `:javascript_safe` - additionally escapes the LINE SEPARATOR (U+2028)
|
95
|
+
and PARAGRAPH SEPARATOR (U+2029) characters to make the produced JSON
|
96
|
+
valid JavaSciprt.
|
97
|
+
* `:html_safe` - similar to `:javascript`, but also escapes the `/`
|
98
|
+
caracter to prevent XSS.
|
99
|
+
* `:unicode_safe` - escapes all non-ascii characters.
|
100
|
+
|
101
|
+
* `:maps` - controls how maps are encoded. Possible values are:
|
102
|
+
|
103
|
+
* `:strict` - checks the encoded map for duplicate keys and raises
|
104
|
+
if they appear. For example `%{:foo => 1, "foo" => 2}` would be
|
105
|
+
rejected, since both keys would be encoded to the string `"foo"`.
|
106
|
+
* `:naive` (default) - does not perform the check.
|
107
|
+
|
108
|
+
* `:pretty` - controls pretty printing of the output. Possible values are:
|
109
|
+
|
110
|
+
* `true` to pretty print with default configuration
|
111
|
+
* a keyword of options as specified by `Jason.Formatter.pretty_print/2`.
|
112
|
+
|
113
|
+
## Examples
|
114
|
+
|
115
|
+
iex> Jason.encode(%{a: 1})
|
116
|
+
{:ok, ~S|{"a":1}|}
|
117
|
+
|
118
|
+
iex> Jason.encode("\\xFF")
|
119
|
+
{:error, %Jason.EncodeError{message: "invalid byte 0xFF in <<255>>"}}
|
120
|
+
|
121
|
+
"""
|
122
|
+
@spec encode(term, [encode_opt]) ::
|
123
|
+
{:ok, String.t()} | {:error, EncodeError.t() | Exception.t()}
|
124
|
+
def encode(input, opts \\ []) do
|
125
|
+
case do_encode(input, format_encode_opts(opts)) do
|
126
|
+
{:ok, result} -> {:ok, IO.iodata_to_binary(result)}
|
127
|
+
{:error, error} -> {:error, error}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
@doc """
|
132
|
+
Generates JSON corresponding to `input`.
|
133
|
+
|
134
|
+
Similar to `encode/1` except it will unwrap the error tuple and raise
|
135
|
+
in case of errors.
|
136
|
+
|
137
|
+
## Examples
|
138
|
+
|
139
|
+
iex> Jason.encode!(%{a: 1})
|
140
|
+
~S|{"a":1}|
|
141
|
+
|
142
|
+
iex> Jason.encode!("\\xFF")
|
143
|
+
** (Jason.EncodeError) invalid byte 0xFF in <<255>>
|
144
|
+
|
145
|
+
"""
|
146
|
+
@spec encode!(term, [encode_opt]) :: String.t() | no_return
|
147
|
+
def encode!(input, opts \\ []) do
|
148
|
+
case do_encode(input, format_encode_opts(opts)) do
|
149
|
+
{:ok, result} -> IO.iodata_to_binary(result)
|
150
|
+
{:error, error} -> raise error
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
@doc """
|
155
|
+
Generates JSON corresponding to `input` and returns iodata.
|
156
|
+
|
157
|
+
This function should be preferred to `encode/2`, if the generated
|
158
|
+
JSON will be handed over to one of the IO functions or sent
|
159
|
+
over the socket. The Erlang runtime is able to leverage vectorised
|
160
|
+
writes and avoid allocating a continuous buffer for the whole
|
161
|
+
resulting string, lowering memory use and increasing performance.
|
162
|
+
|
163
|
+
## Examples
|
164
|
+
|
165
|
+
iex> {:ok, iodata} = Jason.encode_to_iodata(%{a: 1})
|
166
|
+
iex> IO.iodata_to_binary(iodata)
|
167
|
+
~S|{"a":1}|
|
168
|
+
|
169
|
+
iex> Jason.encode_to_iodata("\\xFF")
|
170
|
+
{:error, %Jason.EncodeError{message: "invalid byte 0xFF in <<255>>"}}
|
171
|
+
|
172
|
+
"""
|
173
|
+
@spec encode_to_iodata(term, [encode_opt]) ::
|
174
|
+
{:ok, iodata} | {:error, EncodeError.t() | Exception.t()}
|
175
|
+
def encode_to_iodata(input, opts \\ []) do
|
176
|
+
do_encode(input, format_encode_opts(opts))
|
177
|
+
end
|
178
|
+
|
179
|
+
@doc """
|
180
|
+
Generates JSON corresponding to `input` and returns iodata.
|
181
|
+
|
182
|
+
Similar to `encode_to_iodata/1` except it will unwrap the error tuple
|
183
|
+
and raise in case of errors.
|
184
|
+
|
185
|
+
## Examples
|
186
|
+
|
187
|
+
iex> iodata = Jason.encode_to_iodata!(%{a: 1})
|
188
|
+
iex> IO.iodata_to_binary(iodata)
|
189
|
+
~S|{"a":1}|
|
190
|
+
|
191
|
+
iex> Jason.encode_to_iodata!("\\xFF")
|
192
|
+
** (Jason.EncodeError) invalid byte 0xFF in <<255>>
|
193
|
+
|
194
|
+
"""
|
195
|
+
@spec encode_to_iodata!(term, [encode_opt]) :: iodata | no_return
|
196
|
+
def encode_to_iodata!(input, opts \\ []) do
|
197
|
+
case do_encode(input, format_encode_opts(opts)) do
|
198
|
+
{:ok, result} -> result
|
199
|
+
{:error, error} -> raise error
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
defp do_encode(input, %{pretty: true} = opts) do
|
204
|
+
case Encode.encode(input, opts) do
|
205
|
+
{:ok, encoded} -> {:ok, Formatter.pretty_print_to_iodata(encoded)}
|
206
|
+
other -> other
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
defp do_encode(input, %{pretty: pretty} = opts) when pretty !== false do
|
211
|
+
case Encode.encode(input, opts) do
|
212
|
+
{:ok, encoded} -> {:ok, Formatter.pretty_print_to_iodata(encoded, pretty)}
|
213
|
+
other -> other
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
defp do_encode(input, opts) do
|
218
|
+
Encode.encode(input, opts)
|
219
|
+
end
|
220
|
+
|
221
|
+
defp format_encode_opts(opts) do
|
222
|
+
Enum.into(opts, %{escape: :json, maps: :naive})
|
223
|
+
end
|
224
|
+
|
225
|
+
defp format_decode_opts(opts) do
|
226
|
+
Enum.into(opts, %{keys: :strings, strings: :reference})
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
defmodule Jason.Mixfile do
|
2
|
+
use Mix.Project
|
3
|
+
|
4
|
+
@version "1.1.2"
|
5
|
+
|
6
|
+
def project() do
|
7
|
+
[
|
8
|
+
app: :jason,
|
9
|
+
version: @version,
|
10
|
+
elixir: "~> 1.4",
|
11
|
+
start_permanent: Mix.env() == :prod,
|
12
|
+
consolidate_protocols: Mix.env() != :test,
|
13
|
+
deps: deps(),
|
14
|
+
aliases: aliases(),
|
15
|
+
preferred_cli_env: ["bench.encode": :bench, "bench.decode": :bench, docs: :docs],
|
16
|
+
dialyzer: dialyzer(),
|
17
|
+
description: description(),
|
18
|
+
package: package(),
|
19
|
+
docs: docs()
|
20
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
def application() do
|
24
|
+
[
|
25
|
+
extra_applications: []
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
defp deps() do
|
30
|
+
[
|
31
|
+
{:decimal, "~> 1.0", optional: true},
|
32
|
+
{:benchee, "~> 0.8", only: :bench},
|
33
|
+
{:benchee_html, "~> 0.1", only: :bench, github: "michalmuskala/benchee_html"},
|
34
|
+
{:poison, "~> 3.0", only: :bench},
|
35
|
+
{:exjsx, "~> 4.0", only: :bench},
|
36
|
+
{:tiny, "~> 1.0", only: :bench},
|
37
|
+
{:jsone, "~> 1.4", only: :bench},
|
38
|
+
{:jiffy, "~> 0.14", only: :bench},
|
39
|
+
{:json, "~> 1.0", only: :bench},
|
40
|
+
{:dialyxir, "~> 0.5", only: [:dev, :test], runtime: false},
|
41
|
+
{:ex_doc, "~> 0.18", only: :docs},
|
42
|
+
] ++ maybe_stream_data()
|
43
|
+
end
|
44
|
+
|
45
|
+
defp maybe_stream_data() do
|
46
|
+
if Version.match?(System.version(), "~> 1.5") do
|
47
|
+
[{:stream_data, "~> 0.4", only: :test}]
|
48
|
+
else
|
49
|
+
[]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
defp aliases() do
|
54
|
+
[
|
55
|
+
"bench.encode": ["run bench/encode.exs"],
|
56
|
+
"bench.decode": ["run bench/decode.exs"]
|
57
|
+
]
|
58
|
+
end
|
59
|
+
|
60
|
+
defp dialyzer() do
|
61
|
+
[
|
62
|
+
ignore_warnings: "dialyzer.ignore"
|
63
|
+
]
|
64
|
+
end
|
65
|
+
|
66
|
+
defp description() do
|
67
|
+
"""
|
68
|
+
A blazing fast JSON parser and generator in pure Elixir.
|
69
|
+
"""
|
70
|
+
end
|
71
|
+
|
72
|
+
defp package() do
|
73
|
+
[
|
74
|
+
maintainers: ["Michał Muskała"],
|
75
|
+
licenses: ["Apache 2.0"],
|
76
|
+
links: %{"GitHub" => "https://github.com/michalmuskala/jason"}
|
77
|
+
]
|
78
|
+
end
|
79
|
+
|
80
|
+
defp docs() do
|
81
|
+
[
|
82
|
+
main: "readme",
|
83
|
+
name: "Jason",
|
84
|
+
source_ref: "v#{@version}",
|
85
|
+
canonical: "http://hexdocs.pm/jason",
|
86
|
+
source_url: "https://github.com/michalmuskala/jason",
|
87
|
+
extras: [
|
88
|
+
"README.md"
|
89
|
+
]
|
90
|
+
]
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-hex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.107.
|
4
|
+
version: 0.107.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.107.
|
19
|
+
version: 0.107.14
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.107.
|
26
|
+
version: 0.107.14
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: byebug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,6 +144,21 @@ extensions: []
|
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
146
|
- helpers/build
|
147
|
+
- helpers/deps/jason/.fetch
|
148
|
+
- helpers/deps/jason/.hex
|
149
|
+
- helpers/deps/jason/CHANGELOG.md
|
150
|
+
- helpers/deps/jason/LICENSE
|
151
|
+
- helpers/deps/jason/README.md
|
152
|
+
- helpers/deps/jason/hex_metadata.config
|
153
|
+
- helpers/deps/jason/lib/codegen.ex
|
154
|
+
- helpers/deps/jason/lib/decoder.ex
|
155
|
+
- helpers/deps/jason/lib/encode.ex
|
156
|
+
- helpers/deps/jason/lib/encoder.ex
|
157
|
+
- helpers/deps/jason/lib/formatter.ex
|
158
|
+
- helpers/deps/jason/lib/fragment.ex
|
159
|
+
- helpers/deps/jason/lib/helpers.ex
|
160
|
+
- helpers/deps/jason/lib/jason.ex
|
161
|
+
- helpers/deps/jason/mix.exs
|
147
162
|
- helpers/lib/check_update.exs
|
148
163
|
- helpers/lib/do_update.exs
|
149
164
|
- helpers/lib/parse_deps.exs
|