code-ruby 3.1.2 → 4.0.1

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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/code +100 -20
  4. data/lib/code/concerns/shared.rb +335 -15
  5. data/lib/code/format.rb +33 -15
  6. data/lib/code/network.rb +82 -0
  7. data/lib/code/node/call.rb +80 -2
  8. data/lib/code/node/call_argument.rb +14 -0
  9. data/lib/code/node/code.rb +4 -3
  10. data/lib/code/node/function_parameter.rb +7 -4
  11. data/lib/code/node/list.rb +32 -2
  12. data/lib/code/node/square_bracket.rb +4 -2
  13. data/lib/code/object/base_64.rb +132 -6
  14. data/lib/code/object/boolean.rb +56 -0
  15. data/lib/code/object/class.rb +143 -2
  16. data/lib/code/object/code.rb +108 -7
  17. data/lib/code/object/context.rb +59 -1
  18. data/lib/code/object/cryptography.rb +69 -0
  19. data/lib/code/object/date.rb +13800 -462
  20. data/lib/code/object/decimal.rb +1098 -0
  21. data/lib/code/object/dictionary.rb +1861 -11
  22. data/lib/code/object/duration.rb +24 -0
  23. data/lib/code/object/function.rb +289 -27
  24. data/lib/code/object/global.rb +447 -1
  25. data/lib/code/object/html.rb +181 -7
  26. data/lib/code/object/http.rb +253 -17
  27. data/lib/code/object/ics.rb +76 -13
  28. data/lib/code/object/identifier_list.rb +30 -10
  29. data/lib/code/object/integer.rb +1265 -2
  30. data/lib/code/object/json.rb +80 -1
  31. data/lib/code/object/list.rb +3371 -10
  32. data/lib/code/object/nothing.rb +53 -0
  33. data/lib/code/object/number.rb +120 -0
  34. data/lib/code/object/parameter.rb +149 -0
  35. data/lib/code/object/range.rb +530 -14
  36. data/lib/code/object/smtp.rb +103 -12
  37. data/lib/code/object/string.rb +968 -3
  38. data/lib/code/object/super.rb +11 -1
  39. data/lib/code/object/time.rb +13932 -498
  40. data/lib/code/object/url.rb +67 -0
  41. data/lib/code/object.rb +582 -0
  42. data/lib/code/parser.rb +194 -55
  43. data/lib/code-ruby.rb +3 -0
  44. data/lib/code.rb +30 -3
  45. metadata +135 -84
  46. data/.github/dependabot.yml +0 -15
  47. data/.github/workflows/ci.yml +0 -38
  48. data/.gitignore +0 -30
  49. data/.node-version +0 -1
  50. data/.npm-version +0 -1
  51. data/.prettierignore +0 -2
  52. data/.rspec +0 -1
  53. data/.rubocop.yml +0 -140
  54. data/.ruby-version +0 -1
  55. data/.tool-versions +0 -3
  56. data/AGENTS.md +0 -43
  57. data/Gemfile +0 -22
  58. data/Gemfile.lock +0 -292
  59. data/Rakefile +0 -5
  60. data/bin/bundle +0 -123
  61. data/bin/bundle-audit +0 -31
  62. data/bin/bundler-audit +0 -31
  63. data/bin/dorian +0 -31
  64. data/bin/rspec +0 -31
  65. data/bin/rubocop +0 -31
  66. data/bin/test +0 -5
  67. data/code-ruby.gemspec +0 -34
  68. data/docs/precedence.txt +0 -36
  69. data/package-lock.json +0 -14
  70. data/package.json +0 -7
  71. data/spec/bin/code_spec.rb +0 -48
  72. data/spec/code/format_spec.rb +0 -153
  73. data/spec/code/node/call_spec.rb +0 -11
  74. data/spec/code/object/boolean_spec.rb +0 -18
  75. data/spec/code/object/cryptography_spec.rb +0 -25
  76. data/spec/code/object/decimal_spec.rb +0 -50
  77. data/spec/code/object/dictionary_spec.rb +0 -98
  78. data/spec/code/object/function_spec.rb +0 -268
  79. data/spec/code/object/http_spec.rb +0 -33
  80. data/spec/code/object/ics_spec.rb +0 -50
  81. data/spec/code/object/integer_spec.rb +0 -42
  82. data/spec/code/object/list_spec.rb +0 -22
  83. data/spec/code/object/nothing_spec.rb +0 -14
  84. data/spec/code/object/range_spec.rb +0 -23
  85. data/spec/code/object/string_spec.rb +0 -26
  86. data/spec/code/parser/boolean_spec.rb +0 -11
  87. data/spec/code/parser/chained_call_spec.rb +0 -16
  88. data/spec/code/parser/dictionary_spec.rb +0 -18
  89. data/spec/code/parser/function_spec.rb +0 -16
  90. data/spec/code/parser/group_spec.rb +0 -11
  91. data/spec/code/parser/if_modifier_spec.rb +0 -18
  92. data/spec/code/parser/list_spec.rb +0 -17
  93. data/spec/code/parser/number_spec.rb +0 -11
  94. data/spec/code/parser/string_spec.rb +0 -20
  95. data/spec/code/parser_spec.rb +0 -52
  96. data/spec/code/type_spec.rb +0 -21
  97. data/spec/code_spec.rb +0 -717
  98. data/spec/spec_helper.rb +0 -21
  99. data/spec/zeitwerk/loader_spec.rb +0 -7
@@ -3,6 +3,47 @@
3
3
  class Code
4
4
  class Object
5
5
  class Json < Object
6
+ CLASS_DOCUMENTATION = {
7
+ name: "Json",
8
+ description: "parses json text and serializes values as json text.",
9
+ examples: [
10
+ "Json.parse(\"{}\")",
11
+ "Json.generate({ a: 1 })",
12
+ "Json.generate([1, 2], { pretty: true })"
13
+ ]
14
+ }.freeze
15
+ CLASS_FUNCTIONS = {
16
+ "parse" => {
17
+ name: "parse",
18
+ description:
19
+ "returns a value parsed from json text, or nothing when parsing fails.",
20
+ examples: [
21
+ "Json.parse(\"{}\")",
22
+ "Json.parse(\"[1,2]\")",
23
+ "Json.parse(\"bad json\")"
24
+ ]
25
+ },
26
+ "generate" => {
27
+ name: "generate",
28
+ description:
29
+ "returns json text for a value, optionally formatted for readability.",
30
+ examples: [
31
+ "Json.generate({ a: 1 })",
32
+ "Json.generate([1, 2])",
33
+ "Json.generate({ a: 1 }, { pretty: true })"
34
+ ]
35
+ }
36
+ }.freeze
37
+
38
+ def self.function_documentation(scope)
39
+ return CLASS_FUNCTIONS if scope == :class
40
+
41
+ {}
42
+ end
43
+
44
+ MAX_NESTING = 100
45
+ MAX_ITEMS = 10_000
46
+
6
47
  def self.call(**args)
7
48
  code_operator = args.fetch(:operator, nil).to_code
8
49
  code_arguments = args.fetch(:arguments, []).to_code
@@ -12,6 +53,17 @@ class Code
12
53
  when "parse"
13
54
  sig(args) { String }
14
55
  code_parse(code_value)
56
+ when "generate"
57
+ sig(args) { [Object, { pretty: Object::Boolean.maybe }] }
58
+
59
+ if code_arguments.code_second.something?
60
+ code_generate(
61
+ code_value,
62
+ pretty: code_arguments.code_second.code_get(:pretty)
63
+ )
64
+ else
65
+ code_generate(code_value)
66
+ end
15
67
  else
16
68
  super
17
69
  end
@@ -19,11 +71,38 @@ class Code
19
71
 
20
72
  def self.code_parse(value)
21
73
  code_value = value.to_code
74
+ ::Code.ensure_input_size!(code_value.raw, label: "json")
22
75
 
23
- ::JSON.parse(code_value.raw).to_code
76
+ parsed = ::JSON.parse(code_value.raw)
77
+ validate_shape!(parsed)
78
+ parsed.to_code
24
79
  rescue JSON::ParserError
25
80
  Nothing.new
26
81
  end
82
+
83
+ def self.code_generate(value, pretty: nil)
84
+ value.to_code.code_to_json(pretty: pretty)
85
+ end
86
+
87
+ def self.validate_shape!(value, depth: 0, count: 0)
88
+ raise Error, "json is too deeply nested" if depth > MAX_NESTING
89
+ raise Error, "json has too many items" if count > MAX_ITEMS
90
+
91
+ case value
92
+ when ::Array
93
+ count += value.size
94
+ value.each do |item|
95
+ count = validate_shape!(item, depth: depth + 1, count: count)
96
+ end
97
+ when ::Hash
98
+ count += value.size
99
+ value.each_value do |item|
100
+ count = validate_shape!(item, depth: depth + 1, count: count)
101
+ end
102
+ end
103
+
104
+ count
105
+ end
27
106
  end
28
107
  end
29
108
  end