rupkl 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []