Skip to content

Commit f40cb05

Browse files
update ruby dependencies and object classes
1 parent 4abda19 commit f40cb05

File tree

8 files changed

+146
-1
lines changed

8 files changed

+146
-1
lines changed

Gemfile.lock

+9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ PATH
1010
json
1111
language-ruby
1212
net-http
13+
nokogiri
1314
uri
1415
zeitwerk
1516

@@ -101,13 +102,21 @@ GEM
101102
libv8-node (18.19.0.0-arm64-darwin)
102103
libv8-node (18.19.0.0-x86_64-linux)
103104
logger (1.6.4)
105+
mini_portile2 (2.8.8)
104106
mini_racer (0.16.0)
105107
libv8-node (~> 18.19.0.0)
106108
minitest (5.25.4)
107109
mustermann (3.0.3)
108110
ruby2_keywords (~> 0.0.1)
109111
net-http (0.6.0)
110112
uri
113+
nokogiri (1.18.1)
114+
mini_portile2 (~> 2.8.2)
115+
racc (~> 1.4)
116+
nokogiri (1.18.1-arm64-darwin)
117+
racc (~> 1.4)
118+
nokogiri (1.18.1-x86_64-linux-gnu)
119+
racc (~> 1.4)
111120
openssl (3.2.1)
112121
ostruct (0.6.1)
113122
parallel (1.26.3)

code-ruby.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
2121
s.add_dependency "json"
2222
s.add_dependency "language-ruby"
2323
s.add_dependency "net-http"
24+
s.add_dependency "nokogiri"
2425
s.add_dependency "uri"
2526
s.add_dependency "zeitwerk"
2627

lib/code-ruby.rb

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require "json"
99
require "language-ruby"
1010
require "net/http"
11+
require "nokogiri"
1112
require "stringio"
1213
require "timeout"
1314
require "uri"
@@ -136,3 +137,9 @@ def to_code
136137
Code::Object::Dictionary.new(self)
137138
end
138139
end
140+
141+
class Nokogiri::XML::Element
142+
def to_code
143+
Code::Object::Html.new(self)
144+
end
145+
end

lib/code/object/dictionary.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def code_fetch_values(*arguments)
396396

397397
def code_flatten(level = nil)
398398
code_level = level.to_code
399-
code_level = Integer.new(-1) if level.nothing?
399+
code_level = Integer.new(-1) if code_level.nothing?
400400
code_to_list.code_flatten(code_level)
401401
end
402402

lib/code/object/html.rb

+58
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
class Code
44
class Object
55
class Html < Object
6+
def initialize(*args, **_kargs, &)
7+
if args.first.is_an?(Html)
8+
@raw = args.first.raw
9+
elsif args.first.is_a?(::Nokogiri::XML::NodeSet)
10+
@raw = args.first
11+
elsif args.first.is_a?(Nokogiri::XML::Node)
12+
@raw = args.first
13+
else
14+
@raw = Nokogiri::HTML(args.first.to_s)
15+
end
16+
end
17+
618
def self.call(**args)
719
code_operator = args.fetch(:operator, nil).to_code
820
code_arguments = args.fetch(:arguments, []).to_code
@@ -35,6 +47,52 @@ def self.code_escape(string = nil)
3547

3648
String.new(CGI.escapeHTML(string.to_s))
3749
end
50+
51+
def call(**args)
52+
code_operator = args.fetch(:operator, nil).to_code
53+
code_arguments = args.fetch(:arguments, []).to_code
54+
code_value = code_arguments.code_first
55+
globals = multi_fetch(args, *GLOBALS)
56+
57+
case code_operator.to_s
58+
when "css"
59+
sig(args) { String }
60+
code_css(code_value)
61+
when "map"
62+
sig(args) { Function }
63+
code_map(code_value, **globals)
64+
when "to_string"
65+
sig(args)
66+
code_to_string
67+
else
68+
super
69+
end
70+
end
71+
72+
def code_css(query)
73+
code_query = query.to_code
74+
75+
Html.new(raw.css(code_query.raw))
76+
end
77+
78+
def code_map(argument, **globals)
79+
code_argument = argument.to_code
80+
81+
List.new(
82+
raw.map.with_index do |element, index|
83+
code_argument.call(
84+
arguments: List.new([element.to_code, Integer.new(index), self]),
85+
**globals
86+
)
87+
rescue Error::Next => e
88+
e.code_value
89+
end
90+
)
91+
end
92+
93+
def code_to_string
94+
String.new(raw.text)
95+
end
3896
end
3997
end
4098
end

lib/code/object/list.rb

+52
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ def call(**args)
8181
when "select!"
8282
sig(args) { Function }
8383
code_select!(code_value, **globals)
84+
when "compact"
85+
sig(args) { Function.maybe }
86+
code_compact(code_value, **globals)
87+
when "compact!"
88+
sig(args) { Function.maybe }
89+
code_compact!(code_value, **globals)
8490
when "reject"
8591
sig(args) { Function }
8692
code_reject(code_value, **globals)
@@ -298,6 +304,52 @@ def code_reverse
298304
List.new(raw.reverse)
299305
end
300306

307+
def code_compact(argument = nil, **globals)
308+
code_argument = argument.to_code
309+
310+
index = 0
311+
312+
List.new(
313+
raw.compact do |code_element|
314+
if code_argument.nothing?
315+
code_element.falsy?
316+
else
317+
code_argument.call(
318+
arguments: List.new([code_element, Integer.new(index), self]),
319+
**globals
320+
).falsy?
321+
end
322+
rescue Error::Next => e
323+
e.code_value.falsy?
324+
ensure
325+
index += 1
326+
end
327+
)
328+
end
329+
330+
def code_compact!(argument = nil, **globals)
331+
code_argument = argument.to_code
332+
333+
index = 0
334+
335+
raw.compact! do |code_element|
336+
if code_argument.nothing?
337+
code_element.falsy?
338+
else
339+
code_argument.call(
340+
arguments: List.new([code_element, Integer.new(index), self]),
341+
**globals
342+
).falsy?
343+
end
344+
rescue Error::Next => e
345+
e.code_value.falsy?
346+
ensure
347+
index += 1
348+
end
349+
350+
self
351+
end
352+
301353
def code_select(argument, **globals)
302354
code_argument = argument.to_code
303355

lib/code/object/string.rb

+9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ def call(**args)
3131
when "include?"
3232
sig(args) { String }
3333
code_include?(code_value)
34+
when "first"
35+
sig(args) { Integer.maybe }
36+
code_first(code_value)
3437
when "reverse"
3538
sig(args)
3639
code_reverse
@@ -65,6 +68,12 @@ def code_reverse
6568
def code_to_function(**_globals)
6669
Function.new([{ name: "_" }], "_.#{raw}")
6770
end
71+
72+
def code_first(n = nil)
73+
code_n = n.to_code
74+
code_n = Integer.new(1) if code_n.nothing?
75+
String.new(raw.first(code_n.raw))
76+
end
6877
end
6978
end
7079
end

lib/code/object/time.rb

+9
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ def call(**args)
7171
when "hour"
7272
sig(args)
7373
code_hour
74+
when "format"
75+
sig(args) { String }
76+
code_format(code_value)
7477
else
7578
super
7679
end
@@ -101,6 +104,12 @@ def code_future?
101104
def code_hour
102105
Integer.new(raw.hour)
103106
end
107+
108+
def code_format(format)
109+
code_format = format.to_code
110+
111+
String.new(raw.strftime(code_format.raw))
112+
end
104113
end
105114
end
106115
end

0 commit comments

Comments
 (0)