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,10 +3,59 @@
3
3
  class Code
4
4
  class Object
5
5
  class Nothing < Object
6
+ CLASS_DOCUMENTATION = {
7
+ name: "Nothing",
8
+ description: "represents no value.",
9
+ examples: %w[nothing Nothing.new Nothing.new(1)]
10
+ }.freeze
11
+ INSTANCE_FUNCTIONS = {
12
+ "empty?" => {
13
+ name: "empty?",
14
+ description: "returns true because nothing has no contents.",
15
+ examples: %w[nothing.empty? Nothing.new.empty? Nothing.new(1).empty?]
16
+ },
17
+ "to_string" => {
18
+ name: "to_string",
19
+ description: "returns an empty string for nothing.",
20
+ examples: %w[
21
+ nothing.to_string
22
+ Nothing.new.to_string
23
+ Nothing.new(1).to_string
24
+ ]
25
+ },
26
+ "inspect" => {
27
+ name: "inspect",
28
+ description: "returns the source string for nothing.",
29
+ examples: %w[
30
+ nothing.inspect
31
+ Nothing.new.inspect
32
+ Nothing.new(1).inspect
33
+ ]
34
+ }
35
+ }.freeze
36
+
37
+ def self.function_documentation(scope)
38
+ return INSTANCE_FUNCTIONS if scope == :instance
39
+
40
+ {}
41
+ end
42
+
6
43
  def initialize(*_args, **_kargs, &_block)
7
44
  self.raw = nil
8
45
  end
9
46
 
47
+ def call(**args)
48
+ code_operator = args.fetch(:operator, nil).to_code
49
+
50
+ case code_operator.to_s
51
+ when "empty?"
52
+ sig(args)
53
+ code_empty?
54
+ else
55
+ super
56
+ end
57
+ end
58
+
10
59
  def truthy?
11
60
  false
12
61
  end
@@ -19,6 +68,10 @@ class Code
19
68
  true
20
69
  end
21
70
 
71
+ def code_empty?
72
+ Boolean.new(true)
73
+ end
74
+
22
75
  def code_to_string
23
76
  String.new
24
77
  end
@@ -3,6 +3,126 @@
3
3
  class Code
4
4
  class Object
5
5
  class Number < Object
6
+ CLASS_DOCUMENTATION = {
7
+ name: "Number",
8
+ description:
9
+ "represents numeric behavior shared by integers and decimals.",
10
+ examples: [
11
+ "Number.documentation.name",
12
+ "Number.instance_functions.keys.include?(:between?)",
13
+ "1.5.clamp(0, 1)"
14
+ ]
15
+ }.freeze
16
+ INSTANCE_FUNCTIONS = {
17
+ "between?" => {
18
+ name: "between?",
19
+ description: "returns whether the number is within inclusive bounds.",
20
+ examples: [
21
+ "2.between?(1, 3)",
22
+ "1.5.between?(1, 2)",
23
+ "4.between?(1, 3)"
24
+ ]
25
+ },
26
+ "clamp" => {
27
+ name: "clamp",
28
+ description: "returns the number limited to inclusive bounds.",
29
+ examples: ["5.clamp(1, 3)", "0.clamp(1, 3)", "2.5.clamp(1, 3)"]
30
+ },
31
+ "divide" => {
32
+ name: "divide",
33
+ description:
34
+ "returns floor division of the number by another number.",
35
+ examples: %w[5.divide(2) 10.divide(3) 9.5.divide(2)]
36
+ },
37
+ "divide_modulo" => {
38
+ name: "divide_modulo",
39
+ description: "returns floor division and modulo as a list.",
40
+ examples: %w[
41
+ 5.divide_modulo(2)
42
+ 10.divide_modulo(3)
43
+ 9.5.divide_modulo(2)
44
+ ]
45
+ },
46
+ "next" => {
47
+ name: "next",
48
+ description: "returns the number plus one.",
49
+ examples: %w[1.next 1.5.next -1.next]
50
+ },
51
+ "successor" => {
52
+ name: "successor",
53
+ description: "returns the number plus one, matching next.",
54
+ examples: %w[1.successor 1.5.successor -1.successor]
55
+ },
56
+ "previous" => {
57
+ name: "previous",
58
+ description: "returns the number minus one.",
59
+ examples: %w[1.previous 1.5.previous -1.previous]
60
+ },
61
+ "predecessor" => {
62
+ name: "predecessor",
63
+ description: "returns the number minus one, matching previous.",
64
+ examples: %w[1.predecessor 1.5.predecessor -1.predecessor]
65
+ },
66
+ "remainder" => {
67
+ name: "remainder",
68
+ description: "returns the remainder from division by another number.",
69
+ examples: %w[5.remainder(2) 10.remainder(3) 9.5.remainder(2)]
70
+ }
71
+ }.freeze
72
+
73
+ def self.function_documentation(scope)
74
+ return INSTANCE_FUNCTIONS if scope == :instance
75
+
76
+ {}
77
+ end
78
+
79
+ def code_between?(min, max)
80
+ code_min = min.to_code
81
+ code_max = max.to_code
82
+
83
+ Boolean.new(raw.between?(code_min.raw, code_max.raw))
84
+ end
85
+
86
+ def code_clamp(min, max)
87
+ code_min = min.to_code
88
+ code_max = max.to_code
89
+
90
+ self.class.new(raw.clamp(code_min.raw, code_max.raw))
91
+ end
92
+
93
+ def code_divide(other)
94
+ code_other = other.to_code
95
+
96
+ Integer.new(raw.div(code_other.raw))
97
+ end
98
+
99
+ def code_divide_modulo(other)
100
+ code_other = other.to_code
101
+
102
+ List.new(raw.divmod(code_other.raw))
103
+ end
104
+
105
+ def code_next
106
+ code_plus(Integer.new(1))
107
+ end
108
+
109
+ def code_previous
110
+ code_minus(Integer.new(1))
111
+ end
112
+
113
+ def code_remainder(other)
114
+ code_other = other.to_code
115
+
116
+ self.class.new(raw.remainder(code_other.raw))
117
+ end
118
+
119
+ def code_successor
120
+ code_next
121
+ end
122
+
123
+ def code_predecessor
124
+ code_previous
125
+ end
6
126
  end
7
127
  end
8
128
  end
@@ -3,6 +3,147 @@
3
3
  class Code
4
4
  class Object
5
5
  class Parameter < Dictionary
6
+ CLASS_DOCUMENTATION = {
7
+ name: "Parameter",
8
+ description:
9
+ "describes one function parameter with its name, kind flags, and default value.",
10
+ examples: [
11
+ "((name) => { name }).parameters.first",
12
+ "((name:) => { name }).parameters.first.keyword?",
13
+ "((name = :a) => { name }).parameters.first.default"
14
+ ]
15
+ }.freeze
16
+ INSTANCE_FUNCTIONS = {
17
+ "name" => {
18
+ name: "name",
19
+ description: "returns the parameter identifier name.",
20
+ examples: [
21
+ "((name) => { name }).parameters.first.name",
22
+ "((name = :a) => { name }).parameters.first.name",
23
+ "((...values) => { values }).parameters.first.name"
24
+ ]
25
+ },
26
+ "regular?" => {
27
+ name: "regular?",
28
+ description:
29
+ "returns whether the parameter is not a keyword parameter.",
30
+ examples: [
31
+ "((name) => { name }).parameters.first.regular?",
32
+ "((name:) => { name }).parameters.first.regular?",
33
+ "((...values) => { values }).parameters.first.regular?"
34
+ ]
35
+ },
36
+ "keyword?" => {
37
+ name: "keyword?",
38
+ description:
39
+ "returns whether the parameter is a named keyword parameter.",
40
+ examples: [
41
+ "((name:) => { name }).parameters.first.keyword?",
42
+ "((name) => { name }).parameters.first.keyword?",
43
+ "((**options) => { options }).parameters.first.keyword?"
44
+ ]
45
+ },
46
+ "regular_splat?" => {
47
+ name: "regular_splat?",
48
+ description:
49
+ "returns whether the parameter captures positional arguments with *.",
50
+ examples: [
51
+ "((...values) => { values }).parameters.first.regular_splat?",
52
+ "((*values) => { values }).parameters.first.regular_splat?",
53
+ "((name) => { name }).parameters.first.regular_splat?"
54
+ ]
55
+ },
56
+ "keyword_splat?" => {
57
+ name: "keyword_splat?",
58
+ description:
59
+ "returns whether the parameter captures keyword arguments with **.",
60
+ examples: [
61
+ "((**options) => { options }).parameters.first.keyword_splat?",
62
+ "((name:) => { name }).parameters.first.keyword_splat?",
63
+ "((name) => { name }).parameters.first.keyword_splat?"
64
+ ]
65
+ },
66
+ "block?" => {
67
+ name: "block?",
68
+ description:
69
+ "returns whether the parameter captures one function argument with &.",
70
+ examples: [
71
+ "((&block) => { block }).parameters.first.block?",
72
+ "((name) => { name }).parameters.first.block?",
73
+ "((&&blocks) => { blocks }).parameters.first.block?"
74
+ ]
75
+ },
76
+ "blocks?" => {
77
+ name: "blocks?",
78
+ description:
79
+ "returns whether the parameter captures remaining function arguments with &&.",
80
+ examples: [
81
+ "((&&blocks) => { blocks }).parameters.first.blocks?",
82
+ "((&block) => { block }).parameters.first.blocks?",
83
+ "((name) => { name }).parameters.first.blocks?"
84
+ ]
85
+ },
86
+ "spread?" => {
87
+ name: "spread?",
88
+ description:
89
+ "returns whether the parameter captures every provided argument with spread syntax.",
90
+ examples: [
91
+ "((...values) => { values }).parameters.first.spread?",
92
+ "((name) => { name }).parameters.first.spread?",
93
+ "((name:) => { name }).parameters.first.spread?"
94
+ ]
95
+ },
96
+ "required?" => {
97
+ name: "required?",
98
+ description: "returns whether the parameter has no default value.",
99
+ examples: [
100
+ "((name) => { name }).parameters.first.required?",
101
+ "((name = :a) => { name }).parameters.first.required?",
102
+ "((name:) => { name }).parameters.first.required?"
103
+ ]
104
+ },
105
+ "optional?" => {
106
+ name: "optional?",
107
+ description: "returns whether the parameter has a default value.",
108
+ examples: [
109
+ "((name = :a) => { name }).parameters.first.optional?",
110
+ "((name) => { name }).parameters.first.optional?",
111
+ "((name: :a) => { name }).parameters.first.optional?"
112
+ ]
113
+ },
114
+ "default" => {
115
+ name: "default",
116
+ description:
117
+ "returns the default value for the parameter, or nothing when none is set.",
118
+ examples: [
119
+ "((name = :a) => { name }).parameters.first.default",
120
+ "((name) => { name }).parameters.first.default",
121
+ "((name: :a) => { name }).parameters.first.default"
122
+ ]
123
+ }
124
+ }.freeze
125
+
126
+ def self.function_documentation(scope)
127
+ return INSTANCE_FUNCTIONS if scope == :instance
128
+
129
+ {}
130
+ end
131
+
132
+ def call(**args)
133
+ code_operator = args.fetch(:operator, nil).to_code
134
+
135
+ case code_operator.to_s
136
+ when "required?"
137
+ sig(args)
138
+ code_required?
139
+ when "optional?"
140
+ sig(args)
141
+ code_optional?
142
+ else
143
+ super
144
+ end
145
+ end
146
+
6
147
  def code_name
7
148
  String.new(code_get(:name))
8
149
  end
@@ -27,6 +168,10 @@ class Code
27
168
  Boolean.new(code_get(:block?))
28
169
  end
29
170
 
171
+ def code_blocks?
172
+ Boolean.new(code_get(:blocks?))
173
+ end
174
+
30
175
  def code_spread?
31
176
  Boolean.new(code_get(:spread?))
32
177
  end
@@ -74,6 +219,10 @@ class Code
74
219
  def block?
75
220
  code_block?.truthy?
76
221
  end
222
+
223
+ def blocks?
224
+ code_blocks?.truthy?
225
+ end
77
226
  end
78
227
  end
79
228
  end