rupkl 0.1.0

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.
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuPkl
4
+ class PklObject
5
+ include Enumerable
6
+
7
+ def initialize(properties, entries, elements)
8
+ @properties = properties
9
+ @entries = entries
10
+ @elements = elements
11
+ define_property_accessors
12
+ end
13
+
14
+ def [](key)
15
+ if properties.key?(key)
16
+ properties[key]
17
+ elsif key.is_a?(Integer) && key < elements.size
18
+ elements[key]
19
+ else
20
+ entries[key]
21
+ end
22
+ end
23
+
24
+ def members
25
+ @members ||=
26
+ [
27
+ *properties.to_a,
28
+ *entries.to_a,
29
+ *elements
30
+ ]
31
+ end
32
+
33
+ def properties
34
+ @properties ||= {}
35
+ end
36
+
37
+ def entries
38
+ @entries ||= {}
39
+ end
40
+
41
+ def elements
42
+ @elements ||= []
43
+ end
44
+
45
+ {
46
+ members: :each, properties: :each_property,
47
+ entries: :each_entry, elements: :each_element
48
+ }.each do |accessor, method|
49
+ class_eval(<<~M, __FILE__, __LINE__ + 1)
50
+ # def each(&block)
51
+ # if block_given?
52
+ # members.each(&block)
53
+ # else
54
+ # members.each
55
+ # end
56
+ # end
57
+ def #{method}(&block)
58
+ if block_given?
59
+ #{accessor}.each(&block)
60
+ else
61
+ #{accessor}.each
62
+ end
63
+ end
64
+ M
65
+ end
66
+
67
+ def to_s
68
+ if element_only?
69
+ elements.to_s
70
+ else
71
+ "{#{mixed_to_s}}"
72
+ end
73
+ end
74
+
75
+ def inspect
76
+ to_s
77
+ end
78
+
79
+ def pretty_print(pp)
80
+ if element_only?
81
+ pp.pp(elements)
82
+ else
83
+ pp_mixed(pp)
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ def define_property_accessors
90
+ return unless @properties
91
+
92
+ properties.each_key do |name|
93
+ singleton_class.class_eval(<<~M, __FILE__, __LINE__ + 1)
94
+ # def foo
95
+ # properties[__method__]
96
+ # end
97
+ def #{name}
98
+ properties[__method__]
99
+ end
100
+ M
101
+ end
102
+ end
103
+
104
+ def element_only?
105
+ properties.empty? && entries.empty? && !elements.empty?
106
+ end
107
+
108
+ def mixed_to_s
109
+ [properties, entries, elements]
110
+ .reject(&:empty?)
111
+ .map { _1.to_s[1..-2] }
112
+ .join(', ')
113
+ end
114
+
115
+ def pp_mixed(pp)
116
+ pp.group(1, '{', '}') do
117
+ pp.seplist(pp_members, nil, :each) do |(member, type)|
118
+ pp_mixed_body(pp, type, member)
119
+ end
120
+ end
121
+ end
122
+
123
+ def pp_members
124
+ [
125
+ *properties.to_a.product([:property]),
126
+ *entries.to_a.product([:entry]),
127
+ *elements.product([:element])
128
+ ]
129
+ end
130
+
131
+ def pp_mixed_body(pp, type, member)
132
+ if type in :property | :entry
133
+ pp_hash_pair(pp, *member)
134
+ else
135
+ pp.pp(member)
136
+ end
137
+ end
138
+
139
+ def pp_hash_pair(pp, key, value)
140
+ pp.group do
141
+ pp.pp(key)
142
+ pp.text('=>')
143
+ pp.group(1) do
144
+ pp.breakable('')
145
+ pp.pp(value)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuPkl
4
+ VERSION = '0.1.0'
5
+ end
data/lib/rupkl.rb ADDED
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+ require 'parslet'
5
+ require 'facets/module/basename'
6
+
7
+ require_relative 'rupkl/version'
8
+ require_relative 'rupkl/exception'
9
+ require_relative 'rupkl/pkl_object'
10
+ require_relative 'rupkl/node/value_common'
11
+ require_relative 'rupkl/node/struct_common'
12
+ require_relative 'rupkl/node/boolean'
13
+ require_relative 'rupkl/node/number'
14
+ require_relative 'rupkl/node/string'
15
+ require_relative 'rupkl/node/identifier'
16
+ require_relative 'rupkl/node/member_reference'
17
+ require_relative 'rupkl/node/operation'
18
+ require_relative 'rupkl/node/object'
19
+ require_relative 'rupkl/node/dynamic'
20
+ require_relative 'rupkl/node/pkl_class'
21
+ require_relative 'rupkl/node/pkl_module'
22
+ require_relative 'rupkl/parser'
23
+ require_relative 'rupkl/parser/misc'
24
+ require_relative 'rupkl/parser/literal'
25
+ require_relative 'rupkl/parser/identifier'
26
+ require_relative 'rupkl/parser/expression'
27
+ require_relative 'rupkl/parser/object'
28
+ require_relative 'rupkl/parser/pkl_class'
29
+ require_relative 'rupkl/parser/pkl_module'
30
+
31
+ module RuPkl
32
+ class << self
33
+ def load(string_or_io, filename: nil)
34
+ pkl =
35
+ if string_or_io.respond_to?(:read)
36
+ string_or_io.read
37
+ else
38
+ string_or_io
39
+ end
40
+ node = Parser.new.parse(pkl, filename: filename, root: :pkl_module)
41
+ node.to_ruby(nil)
42
+ end
43
+
44
+ def load_file(filename)
45
+ File.open(filename, 'r') { |io| load(io, filename: filename) }
46
+ end
47
+ end
48
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rupkl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Taichi Ishitani
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: facets
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: parslet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.0
41
+ description: Pkl parser for Ruby
42
+ email:
43
+ - taichi730@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - CODE_OF_CONDUCT.md
49
+ - LICENSE.txt
50
+ - README.md
51
+ - lib/rupkl.rb
52
+ - lib/rupkl/exception.rb
53
+ - lib/rupkl/node/boolean.rb
54
+ - lib/rupkl/node/dynamic.rb
55
+ - lib/rupkl/node/identifier.rb
56
+ - lib/rupkl/node/member_reference.rb
57
+ - lib/rupkl/node/number.rb
58
+ - lib/rupkl/node/object.rb
59
+ - lib/rupkl/node/operation.rb
60
+ - lib/rupkl/node/pkl_class.rb
61
+ - lib/rupkl/node/pkl_module.rb
62
+ - lib/rupkl/node/string.rb
63
+ - lib/rupkl/node/struct_common.rb
64
+ - lib/rupkl/node/value_common.rb
65
+ - lib/rupkl/parser.rb
66
+ - lib/rupkl/parser/expression.rb
67
+ - lib/rupkl/parser/identifier.rb
68
+ - lib/rupkl/parser/literal.rb
69
+ - lib/rupkl/parser/misc.rb
70
+ - lib/rupkl/parser/object.rb
71
+ - lib/rupkl/parser/pkl_class.rb
72
+ - lib/rupkl/parser/pkl_module.rb
73
+ - lib/rupkl/pkl_object.rb
74
+ - lib/rupkl/version.rb
75
+ homepage: https://github.com/taichi-ishitani/rupkl
76
+ licenses:
77
+ - MIT
78
+ metadata:
79
+ homepage_uri: https://github.com/taichi-ishitani/rupkl
80
+ source_code_uri: https://github.com/taichi-ishitani/rupkl
81
+ rubygems_mfa_required: 'true'
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '3.0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubygems_version: 3.5.5
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Pkl parser for Ruby
101
+ test_files: []