code-ruby 1.6.1 → 1.6.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f8a1afa22e9271512b0bef2197c9036cd85cab51dbd9dea4f1c7954ea1b4130
4
- data.tar.gz: 5b711b476024c29ec4d9eeb4f6d9d1c741b488b1a9816cd38b9220d6fe093e01
3
+ metadata.gz: 31de900f45b607432af42419aedea361f2a751aa6d635caaa01edced89a2a591
4
+ data.tar.gz: 121236f92f037d3ba10b45a8d92dabd08972241262c588cfbe370ff60822f642
5
5
  SHA512:
6
- metadata.gz: 0af9ea0b81e48d9b7ada87302ca5ff2bd6f4d8264bb9d968baa21173c34f69140ca047bbd5d95f440aa1e4eb50e7347ed9c19ad98f89fe8a9e9d2da0c1730a14
7
- data.tar.gz: 61817cefd553d497fe30651d3fb9909c26681207c6831701cf1ab2bc050319c94af9b371e552ac501d880590880b1e47aa1f6dd69d70e595d656dd8778f5424f
6
+ metadata.gz: f3774304c7976b6295f49c6da4a9ccd473151cb0097f8e3848a58941498a8b3502c477f6095c148811d72b43bbbbbdf869848c4ceeac87515b47fc596a55d1aa
7
+ data.tar.gz: edb7ff295ed91f0b555f2e8e8bab351a2002ff80db28aaaab037d4d7c22b42d55b3a41712e73a64855c872ad8d7579dee9d4dbe23119a37211c902c870adc165
data/.rubocop.yml CHANGED
@@ -30,6 +30,8 @@ Lint/MissingSuper:
30
30
  Enabled: false
31
31
  Lint/PercentStringArray:
32
32
  Enabled: false
33
+ Lint/SafeNavigationChain:
34
+ Enabled: false
33
35
  Lint/ShadowingOuterLocalVariable:
34
36
  Enabled: false
35
37
  Lint/SuppressedException:
@@ -120,8 +122,6 @@ Style/StringLiterals:
120
122
  Enabled: false
121
123
  Style/StringLiteralsInInterpolation:
122
124
  Enabled: false
123
- Lint/SafeNavigationChain:
124
- Enabled: false
125
125
  plugins:
126
126
  - rubocop-factory_bot
127
127
  - rubocop-performance
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- code-ruby (1.6.1)
4
+ code-ruby (1.6.3)
5
5
  activesupport
6
6
  base64
7
7
  bigdecimal
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6.1
1
+ 1.6.3
data/bin/code CHANGED
@@ -46,7 +46,11 @@ RubyProf.start if profile
46
46
  input = 'loop { print("> ") puts(evaluate(read)) }' if input.blank?
47
47
 
48
48
  if parsed.options.parse
49
- pp Code::Parser.parse(input).to_raw
49
+ begin
50
+ pp Code::Parser.parse(input).to_raw
51
+ rescue Exception => e
52
+ warn e.message
53
+ end
50
54
  else
51
55
  begin
52
56
  print(
@@ -58,7 +62,7 @@ else
58
62
  timeout: parsed.options.timeout
59
63
  )
60
64
  )
61
- rescue Code::Error => e
65
+ rescue Exception => e
62
66
  warn e.message
63
67
  end
64
68
  end
@@ -8,10 +8,15 @@ class Code
8
8
  def initialize(parsed)
9
9
  return if parsed.blank?
10
10
 
11
- @name = parsed.delete(:name).presence
11
+ @name =
12
+ parsed.delete(:name).presence || parsed[:regular_splat].presence ||
13
+ parsed[:keyword_splat].presence || parsed[:spread].presence ||
14
+ parsed[:block].presence
12
15
  @keyword = parsed.delete(:keyword).present?
13
16
  @regular_splat = parsed.delete(:regular_splat).present?
14
17
  @keyword_splat = parsed.delete(:keyword_splat).present?
18
+ @spread = parsed.delete(:spread).present?
19
+ @block = parsed.delete(:block).present?
15
20
  @default = Code.new(parsed.delete(:default)) if parsed.key?(:default)
16
21
  end
17
22
 
@@ -35,6 +40,14 @@ class Code
35
40
  !!@keyword_splat
36
41
  end
37
42
 
43
+ def spread?
44
+ !!@spread
45
+ end
46
+
47
+ def block?
48
+ !!@block
49
+ end
50
+
38
51
  def to_h
39
52
  {
40
53
  name: name,
@@ -42,6 +55,8 @@ class Code
42
55
  keyword?: keyword?,
43
56
  regular_splat?: regular_splat?,
44
57
  keyword_splat?: keyword_splat?,
58
+ spread?: spread?,
59
+ block?: block?,
45
60
  default: default
46
61
  }
47
62
  end
@@ -18,6 +18,7 @@ class Code
18
18
  elsif parent?
19
19
  parent.code_lookup!(code_identifier)
20
20
  else
21
+ binding.irb
21
22
  raise Error, "#{code_identifier} is not defined"
22
23
  end
23
24
  end
@@ -693,18 +693,14 @@ class Code
693
693
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
694
694
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
695
695
 
696
- Date.new(
697
- raw.change(
698
- year: code_years.code_to_integer.raw + code_year.code_to_integer.raw,
699
- month:
700
- code_months.code_to_integer.raw + code_month.code_to_integer.raw,
701
- day: code_days.code_to_integer.raw + code_day.code_to_integer.raw,
702
- wday:
703
- code_week_days.code_to_integer.raw +
704
- code_week_day.code_to_integer.raw,
705
- cweek: code_weeks.code_to_integer.raw + code_week.code_to_integer.raw
706
- )
707
- )
696
+ year = code_years.code_to_integer.raw + code_year.code_to_integer.raw
697
+ month = code_months.code_to_integer.raw + code_month.code_to_integer.raw
698
+ day = code_days.code_to_integer.raw + code_day.code_to_integer.raw
699
+ week_day =
700
+ code_week_days.code_to_integer.raw + code_week_day.code_to_integer.raw
701
+ week = code_weeks.code_to_integer.raw + code_week.code_to_integer.raw
702
+
703
+ code_change(year:, month:, day:, week_day:, week:)
708
704
  end
709
705
 
710
706
  def code_substract(
@@ -726,18 +722,14 @@ class Code
726
722
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
727
723
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
728
724
 
729
- Date.new(
730
- raw.change(
731
- year: code_years.code_to_integer.raw - code_year.code_to_integer.raw,
732
- month:
733
- code_months.code_to_integer.raw - code_month.code_to_integer.raw,
734
- day: code_days.code_to_integer.raw - code_day.code_to_integer.raw,
735
- wday:
736
- code_week_days.code_to_integer.raw -
737
- code_week_day.code_to_integer.raw,
738
- cweek: code_weeks.code_to_integer.raw - code_week.code_to_integer.raw
739
- )
740
- )
725
+ year = code_years.code_to_integer.raw - code_year.code_to_integer.raw
726
+ month = code_months.code_to_integer.raw - code_month.code_to_integer.raw
727
+ day = code_days.code_to_integer.raw - code_day.code_to_integer.raw
728
+ week_day =
729
+ code_week_days.code_to_integer.raw - code_week_day.code_to_integer.raw
730
+ week = code_weeks.code_to_integer.raw - code_week.code_to_integer.raw
731
+
732
+ code_change(year:, month:, day:, week_day:, week:)
741
733
  end
742
734
 
743
735
  def code_change(
@@ -759,23 +751,20 @@ class Code
759
751
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
760
752
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
761
753
 
762
- if code_year.something? || code_month.something? ||
763
- code_day.something? || code_week_day.something? ||
764
- code_week.something?
765
- Date.new(
766
- raw.change(
767
- **{
768
- year: code_year.raw,
769
- month: code_month.raw,
770
- day: code_day.raw,
771
- wday: code_week_day.raw,
772
- cweek: code_week.raw
773
- }.compact
774
- )
775
- )
776
- else
777
- Date.new(self)
778
- end
754
+ year = code_year.raw || code_years.raw
755
+ month = code_month.raw || code_months.raw
756
+ day = code_day.raw || code_days.raw
757
+ wday = code_week_day.raw || code_week_days.raw
758
+ cweek = code_week.raw || code_weeks.raw
759
+
760
+ dup = raw.dup
761
+ dup += (year - raw.year).years
762
+ dup += (month - raw.month).months
763
+ dup += (day - raw.day).days
764
+ dup += (wday - raw.wday).days
765
+ dup += (cweek - raw.to_date.cweek).weeks
766
+
767
+ Date.new(dup)
779
768
  end
780
769
  end
781
770
  end
@@ -38,12 +38,19 @@ class Code
38
38
 
39
39
  code_parameters.raw.each.with_index do |code_parameter, index|
40
40
  code_argument =
41
- if code_parameter.regular_splat?
41
+ if code_parameter.spread?
42
+ code_arguments
43
+ elsif code_parameter.regular_splat?
42
44
  code_arguments
43
45
  elsif code_parameter.keyword_splat?
44
46
  code_arguments.raw.detect do |code_argument|
45
47
  code_argument.is_a?(Dictionary)
46
48
  end || Dictionary.new
49
+ elsif code_parameter.block?
50
+ code_arguments
51
+ .raw
52
+ .detect { |code_argument| code_argument.is_a?(Function) }
53
+ .to_code
47
54
  elsif code_parameter.keyword?
48
55
  code_arguments
49
56
  .raw
@@ -71,7 +78,11 @@ class Code
71
78
  code_parameters
72
79
  .raw
73
80
  .inject([]) do |signature, code_parameter|
74
- if code_parameter.keyword_splat?
81
+ if code_parameter.spread?
82
+ signature + [Object.repeat]
83
+ elsif code_parameter.block?
84
+ signature + [Function]
85
+ elsif code_parameter.keyword_splat?
75
86
  signature + [Dictionary.maybe]
76
87
  elsif code_parameter.regular_splat?
77
88
  signature + [Object.repeat]
@@ -23,6 +23,14 @@ class Code
23
23
  Boolean.new(code_get(:keyword_splat?))
24
24
  end
25
25
 
26
+ def code_block?
27
+ Boolean.new(code_get(:block?))
28
+ end
29
+
30
+ def code_spread?
31
+ Boolean.new(code_get(:spread?))
32
+ end
33
+
26
34
  def code_required?
27
35
  code_default.code_falsy?
28
36
  end
@@ -62,6 +70,14 @@ class Code
62
70
  def keyword_splat?
63
71
  code_keyword_splat?.truthy?
64
72
  end
73
+
74
+ def spread?
75
+ code_spread?.truthy?
76
+ end
77
+
78
+ def block?
79
+ code_block?.truthy?
80
+ end
65
81
  end
66
82
  end
67
83
  end
@@ -831,27 +831,30 @@ class Code
831
831
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
832
832
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
833
833
  code_hour = hour.to_code.nothing? ? hours.to_code : hour.to_code
834
- code_minute =
835
- minute.to_code.nothing? ? minutes.to_code : minute.to_code
836
- code_second =
837
- second.to_code.nothing? ? seconds.to_code : second.to_code
838
-
839
- Time.new(
840
- raw.change(
841
- year: code_years.code_to_integer.raw + code_year.code_to_integer.raw,
842
- month:
843
- code_months.code_to_integer.raw + code_month.code_to_integer.raw,
844
- day: code_days.code_to_integer.raw + code_day.code_to_integer.raw,
845
- wday:
846
- code_week_days.code_to_integer.raw +
847
- code_week_day.code_to_integer.raw,
848
- cweek: code_weeks.code_to_integer.raw + code_week.code_to_integer.raw,
849
- hour: code_hours.code_to_integer.raw + code_hour.code_to_integer.raw,
850
- min:
851
- code_minutes.code_to_integer.raw + code_minute.code_to_integer.raw,
852
- sec:
853
- code_seconds.code_to_integer.raw + code_second.code_to_integer.raw
854
- )
834
+ code_minute = minute.to_code.nothing? ? minutes.to_code : minute.to_code
835
+ code_second = second.to_code.nothing? ? seconds.to_code : second.to_code
836
+
837
+ year = code_years.code_to_integer.raw + code_year.code_to_integer.raw
838
+ month = code_months.code_to_integer.raw + code_month.code_to_integer.raw
839
+ day = code_days.code_to_integer.raw + code_day.code_to_integer.raw
840
+ week_day =
841
+ code_week_days.code_to_integer.raw + code_week_day.code_to_integer.raw
842
+ week = code_weeks.code_to_integer.raw + code_week.code_to_integer.raw
843
+ hour = code_hours.code_to_integer.raw + code_hour.code_to_integer.raw
844
+ minute =
845
+ code_minutes.code_to_integer.raw + code_minute.code_to_integer.raw
846
+ second =
847
+ code_seconds.code_to_integer.raw + code_second.code_to_integer.raw
848
+
849
+ code_change(
850
+ year:,
851
+ month:,
852
+ day:,
853
+ week_day:,
854
+ week:,
855
+ hour:,
856
+ minute:,
857
+ second:
855
858
  )
856
859
  end
857
860
 
@@ -880,27 +883,30 @@ class Code
880
883
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
881
884
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
882
885
  code_hour = hour.to_code.nothing? ? hours.to_code : hour.to_code
883
- code_minute =
884
- minute.to_code.nothing? ? minutes.to_code : minute.to_code
885
- code_second =
886
- second.to_code.nothing? ? seconds.to_code : second.to_code
887
-
888
- Time.new(
889
- raw.change(
890
- year: code_years.code_to_integer.raw - code_year.code_to_integer.raw,
891
- month:
892
- code_months.code_to_integer.raw - code_month.code_to_integer.raw,
893
- day: code_days.code_to_integer.raw - code_day.code_to_integer.raw,
894
- wday:
895
- code_week_days.code_to_integer.raw -
896
- code_week_day.code_to_integer.raw,
897
- cweek: code_weeks.code_to_integer.raw - code_week.code_to_integer.raw,
898
- hour: code_hours.code_to_integer.raw - code_hour.code_to_integer.raw,
899
- min:
900
- code_minutes.code_to_integer.raw - code_minute.code_to_integer.raw,
901
- sec:
902
- code_seconds.code_to_integer.raw - code_second.code_to_integer.raw
903
- )
886
+ code_minute = minute.to_code.nothing? ? minutes.to_code : minute.to_code
887
+ code_second = second.to_code.nothing? ? seconds.to_code : second.to_code
888
+
889
+ year = code_years.code_to_integer.raw - code_year.code_to_integer.raw
890
+ month = code_months.code_to_integer.raw - code_month.code_to_integer.raw
891
+ day = code_days.code_to_integer.raw - code_day.code_to_integer.raw
892
+ week_day =
893
+ code_week_days.code_to_integer.raw - code_week_day.code_to_integer.raw
894
+ week = code_weeks.code_to_integer.raw - code_week.code_to_integer.raw
895
+ hour = code_hours.code_to_integer.raw - code_hour.code_to_integer.raw
896
+ minute =
897
+ code_minutes.code_to_integer.raw - code_minute.code_to_integer.raw
898
+ second =
899
+ code_seconds.code_to_integer.raw - code_second.code_to_integer.raw
900
+
901
+ code_change(
902
+ year:,
903
+ month:,
904
+ day:,
905
+ week_day:,
906
+ week:,
907
+ hour:,
908
+ minute:,
909
+ second:
904
910
  )
905
911
  end
906
912
 
@@ -929,32 +935,29 @@ class Code
929
935
  week_day.to_code.nothing? ? week_days.to_code : week_day.to_code
930
936
  code_week = week.to_code.nothing? ? weeks.to_code : week.to_code
931
937
  code_hour = hour.to_code.nothing? ? hours.to_code : hour.to_code
932
- code_minute =
933
- minute.to_code.nothing? ? minutes.to_code : minute.to_code
934
- code_second =
935
- second.to_code.nothing? ? seconds.to_code : second.to_code
936
-
937
- if code_year.something? || code_month.something? ||
938
- code_day.something? || code_week_day.something? ||
939
- code_week.something? || code_hour.something? ||
940
- code_minute.something? || code_second.something?
941
- Time.new(
942
- raw.change(
943
- **{
944
- year: code_year.raw,
945
- month: code_month.raw,
946
- day: code_day.raw,
947
- wday: code_week_day.raw,
948
- cweek: code_week.raw,
949
- hour: code_hour.raw,
950
- min: code_minute.raw,
951
- sec: code_second.raw
952
- }.compact
953
- )
954
- )
955
- else
956
- Time.new(self)
957
- end
938
+ code_minute = minute.to_code.nothing? ? minutes.to_code : minute.to_code
939
+ code_second = second.to_code.nothing? ? seconds.to_code : second.to_code
940
+
941
+ year = code_year.raw || code_years.raw
942
+ month = code_month.raw || code_months.raw
943
+ day = code_day.raw || code_days.raw
944
+ wday = code_week_day.raw || code_week_days.raw
945
+ cweek = code_week.raw || code_weeks.raw
946
+ hour = code_hour.raw || code_hours.raw
947
+ min = code_minute.raw || code_minutes.raw
948
+ sec = code_second.raw || code_seconds.raw
949
+
950
+ dup = raw.dup
951
+ dup += (year - raw.year).years
952
+ dup += (month - raw.month).months
953
+ dup += (day - raw.day).days
954
+ dup += (wday - raw.wday).days
955
+ dup += (cweek - raw.to_date.cweek).weeks
956
+ dup += (hour - raw.hour).hours
957
+ dup += (min - raw.min).minutes
958
+ dup += (sec - raw.sec).seconds
959
+
960
+ Time.new(dup)
958
961
  end
959
962
  end
960
963
  end
@@ -67,6 +67,18 @@ class Code
67
67
  str("end")
68
68
  end
69
69
 
70
+ def asterisk
71
+ str("*")
72
+ end
73
+
74
+ def ampersand
75
+ str("&")
76
+ end
77
+
78
+ def spread_operator
79
+ str("...") | str("..") | str(".")
80
+ end
81
+
70
82
  def keyword_argument
71
83
  name.aka(:name) << whitespace? << colon << code.aka(:value)
72
84
  end
@@ -87,13 +99,19 @@ class Code
87
99
  ).repeat << whitespace? << closing_parenthesis.ignore.maybe
88
100
  end
89
101
 
102
+ def prefix
103
+ (asterisk << asterisk).aka(:keyword_splat) |
104
+ asterisk.aka(:regular_splat) | ampersand.aka(:block) |
105
+ spread_operator.aka(:spread)
106
+ end
107
+
90
108
  def keyword_parameter
91
109
  name.aka(:name) << whitespace? << colon.aka(:keyword) <<
92
110
  code_present.aka(:default).maybe
93
111
  end
94
112
 
95
113
  def regular_parameter
96
- name.aka(:name) << whitespace? <<
114
+ ((prefix.maybe << name.aka(:name)) | prefix) << whitespace? <<
97
115
  (equal << whitespace? << code_present.aka(:default)).maybe
98
116
  end
99
117
 
@@ -35,6 +35,10 @@ class Code
35
35
  str("end")
36
36
  end
37
37
 
38
+ def spread_operator
39
+ str("...") | str("..") | str(".")
40
+ end
41
+
38
42
  def opening_parenthesis
39
43
  str("(")
40
44
  end
@@ -77,7 +81,8 @@ class Code
77
81
 
78
82
  def prefix
79
83
  (asterisk << asterisk).aka(:keyword_splat) |
80
- asterisk.aka(:regular_splat) | ampersand.aka(:block)
84
+ asterisk.aka(:regular_splat) | ampersand.aka(:block) |
85
+ spread_operator.aka(:spread)
81
86
  end
82
87
 
83
88
  def keyword_parameter
@@ -86,7 +91,7 @@ class Code
86
91
  end
87
92
 
88
93
  def regular_parameter
89
- prefix.maybe << name.aka(:name) << whitespace? <<
94
+ ((prefix.maybe << name.aka(:name)) | prefix) << whitespace? <<
90
95
  (equal << whitespace? << code_present.aka(:default)).maybe
91
96
  end
92
97
 
@@ -139,6 +139,10 @@ class Code
139
139
  str("?")
140
140
  end
141
141
 
142
+ def special_name
143
+ str("...") | str("..") | str(".") | str("**") | str("*") | str("&")
144
+ end
145
+
142
146
  def reserved_character
143
147
  ampersand | equal | pipe | dot | colon | comma | space | newline |
144
148
  opening_curly_bracket | closing_curly_bracket | opening_parenthesis |
@@ -167,8 +171,13 @@ class Code
167
171
  end
168
172
 
169
173
  def root
170
- (keyword << separator).absent << special_characters.absent <<
171
- character.repeat(1)
174
+ (
175
+ special_name |
176
+ (
177
+ (keyword << separator).absent << special_characters.absent <<
178
+ character.repeat(1)
179
+ )
180
+ )
172
181
  end
173
182
  end
174
183
  end
data/lib/code-ruby.rb CHANGED
@@ -14,6 +14,7 @@ require "stringio"
14
14
  require "timeout"
15
15
  require "uri"
16
16
  require "zeitwerk"
17
+ require "date"
17
18
 
18
19
  loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
19
20
  loader.ignore("#{__dir__}/code-ruby.rb")
data/spec/code_spec.rb CHANGED
@@ -268,8 +268,8 @@ RSpec.describe Code do
268
268
  ["Class(true, 1)", "Boolean"],
269
269
  ["Class.new(Boolean, Time)", "Boolean"],
270
270
  ["Class.new(Time, Boolean)", "Time"],
271
- ['Date("2024-3-2").to_string', ":2024-03-02"],
272
- ['Date("2024-3-2").to_string', ":2024-03-02"],
271
+ %w[Date("2024-3-2").to_string :2024-03-02],
272
+ %w[Date("2024-3-2").to_string :2024-03-02],
273
273
  ["Decimal(1, :2)", "100"],
274
274
  ["Decimal(:1, 2)", "100.0"],
275
275
  ["Decimal.new(1, :2)", "100"],
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-06-21 00:00:00.000000000 Z
10
+ date: 2025-06-25 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport