sweet-moon 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +40 -0
  5. data/Gemfile +12 -0
  6. data/Gemfile.lock +61 -0
  7. data/README.md +1149 -0
  8. data/components/api.rb +83 -0
  9. data/components/injections/injections_503.rb +21 -0
  10. data/components/injections/injections_514.rb +29 -0
  11. data/components/injections/injections_542.rb +49 -0
  12. data/components/injections.rb +11 -0
  13. data/components/interpreters/50/function.rb +52 -0
  14. data/components/interpreters/50/interpreter.rb +105 -0
  15. data/components/interpreters/50/reader.rb +65 -0
  16. data/components/interpreters/50/table.rb +99 -0
  17. data/components/interpreters/50/writer.rb +45 -0
  18. data/components/interpreters/51/function.rb +52 -0
  19. data/components/interpreters/51/interpreter.rb +104 -0
  20. data/components/interpreters/51/reader.rb +65 -0
  21. data/components/interpreters/51/table.rb +60 -0
  22. data/components/interpreters/51/writer.rb +45 -0
  23. data/components/interpreters/54/function.rb +52 -0
  24. data/components/interpreters/54/interpreter.rb +100 -0
  25. data/components/interpreters/54/reader.rb +65 -0
  26. data/components/interpreters/54/table.rb +60 -0
  27. data/components/interpreters/54/writer.rb +45 -0
  28. data/components/interpreters.rb +11 -0
  29. data/components/io.rb +11 -0
  30. data/config/tests.sample.yml +15 -0
  31. data/controllers/api.rb +143 -0
  32. data/controllers/cli/cli.rb +32 -0
  33. data/controllers/cli/help.rb +24 -0
  34. data/controllers/cli/signatures.rb +179 -0
  35. data/controllers/cli/version.rb +14 -0
  36. data/controllers/interpreter.rb +68 -0
  37. data/controllers/state.rb +74 -0
  38. data/dsl/api.rb +31 -0
  39. data/dsl/cache.rb +118 -0
  40. data/dsl/concerns/fennel.rb +13 -0
  41. data/dsl/concerns/packages.rb +37 -0
  42. data/dsl/errors.rb +28 -0
  43. data/dsl/fennel.rb +47 -0
  44. data/dsl/global.rb +42 -0
  45. data/dsl/state.rb +104 -0
  46. data/dsl/sweet_moon.rb +53 -0
  47. data/logic/api.rb +17 -0
  48. data/logic/interpreter.rb +84 -0
  49. data/logic/interpreters/interpreter_50.rb +34 -0
  50. data/logic/interpreters/interpreter_51.rb +37 -0
  51. data/logic/interpreters/interpreter_54.rb +41 -0
  52. data/logic/io.rb +6 -0
  53. data/logic/options.rb +14 -0
  54. data/logic/shared_object.rb +52 -0
  55. data/logic/signature.rb +258 -0
  56. data/logic/signatures/ffi_types.rb +27 -0
  57. data/logic/signatures/signatures_322.rb +418 -0
  58. data/logic/signatures/signatures_401.rb +243 -0
  59. data/logic/signatures/signatures_503.rb +575 -0
  60. data/logic/signatures/signatures_514.rb +460 -0
  61. data/logic/signatures/signatures_542.rb +591 -0
  62. data/logic/spec.rb +13 -0
  63. data/logic/tables.rb +32 -0
  64. data/ports/in/dsl/sweet-moon/errors.rb +3 -0
  65. data/ports/in/dsl/sweet-moon.rb +1 -0
  66. data/ports/in/shell/sweet-moon +5 -0
  67. data/ports/in/shell.rb +21 -0
  68. data/ports/out/shell.rb +9 -0
  69. data/sweet-moon.gemspec +35 -0
  70. metadata +137 -0
@@ -0,0 +1,104 @@
1
+ require_relative '../../../logic/interpreters/interpreter_51'
2
+
3
+ require_relative 'reader'
4
+ require_relative 'writer'
5
+ require_relative 'table'
6
+
7
+ module Component
8
+ module V51
9
+ Interpreter = {
10
+ version: Logic::V51::Interpreter[:version],
11
+
12
+ create_state!: ->(api) {
13
+ state = api.luaL_newstate
14
+ { state: state, error: state ? nil : :MemoryAllocation }
15
+ },
16
+
17
+ open_standard_libraries!: ->(api, state) {
18
+ api.luaL_openlibs(state)
19
+
20
+ { state: state }
21
+ },
22
+
23
+ load_file_and_push_chunck!: ->(api, state, path) {
24
+ result = api.luaL_loadfile(state, path)
25
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
26
+ },
27
+
28
+ push_chunk!: ->(api, state, value) {
29
+ result = api.luaL_loadstring(state, value)
30
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
31
+ },
32
+
33
+ set_table!: ->(api, state, variable, value) {
34
+ Table[:set!].(api, state, variable, value)
35
+ },
36
+
37
+ push_value!: ->(api, state, value) {
38
+ Writer[:push!].(api, state, value)
39
+ { state: state }
40
+ },
41
+
42
+ pop_and_set_as!: ->(api, state, variable) {
43
+ api.lua_pushstring(state, variable)
44
+ api.lua_insert(state, -2)
45
+ api.lua_settable(state, Logic::V51::Interpreter[:LUA_GLOBALSINDEX])
46
+ { state: state }
47
+ },
48
+
49
+ get_variable_and_push!: ->(api, state, variable, key = nil) {
50
+ api.lua_pushstring(state, variable.to_s)
51
+ api.lua_gettable(state, Logic::V51::Interpreter[:LUA_GLOBALSINDEX])
52
+
53
+ unless key.nil?
54
+ if api.lua_typename(state, api.lua_type(state, -1)).read_string == 'table'
55
+ Table[:read_field!].(api, state, key, -1)
56
+ else
57
+ api.lua_pushnil(state)
58
+ end
59
+ end
60
+
61
+ { state: state }
62
+ },
63
+
64
+ call!: ->(api, state, inputs = 0, outputs = 1) {
65
+ result = api.lua_pcall(state, inputs, outputs, 0)
66
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
67
+ },
68
+
69
+ read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
70
+ result = Component::V51::Reader[:read!].(api, state, stack_index)
71
+
72
+ api.lua_settop(state, -2) if result[:pop]
73
+ api.lua_settop(state, -2) if extra_pop
74
+
75
+ { state: state, output: result[:value] }
76
+ },
77
+
78
+ read_all!: ->(api, state) {
79
+ result = Reader[:read_all!].(api, state)
80
+
81
+ { state: state, output: result }
82
+ },
83
+
84
+ destroy_state!: ->(api, state) {
85
+ result = api.lua_close(state)
86
+
87
+ { state: nil, error: Interpreter[:_error].(api, state, result) }
88
+ },
89
+
90
+ _error: ->(api, state, code, options = {}) {
91
+ status = Logic::V51::Interpreter[:error][
92
+ Logic::V51::Interpreter[:status][code]
93
+ ] || :error
94
+
95
+ if code.is_a?(Numeric) && code >= 2
96
+ return { status: status } unless options[:pull]
97
+
98
+ { status: status,
99
+ value: Interpreter[:read_and_pop!].(api, state, -1)[:output] }
100
+ end
101
+ }
102
+ }
103
+ end
104
+ end
@@ -0,0 +1,65 @@
1
+ require 'ffi'
2
+
3
+ require_relative 'interpreter'
4
+ require_relative 'function'
5
+ require_relative 'table'
6
+
7
+ module Component
8
+ module V51
9
+ Reader = {
10
+ read_all!: ->(api, state) {
11
+ (1..api.lua_gettop(state)).map do
12
+ Interpreter[:read_and_pop!].(api, state)[:output]
13
+ end.reverse
14
+ },
15
+
16
+ read!: ->(api, state, stack_index = -1) {
17
+ stack_index = api.lua_gettop(state) if stack_index == -1
18
+
19
+ type = api.lua_typename(state, api.lua_type(state, stack_index)).read_string
20
+
21
+ case type
22
+ when 'string'
23
+ Reader[:read_string!].(api, state, stack_index)
24
+ when 'number'
25
+ Reader[:read_number!].(api, state, stack_index)
26
+ when 'no value'
27
+ { value: nil, pop: true, type: type }
28
+ when 'nil'
29
+ { value: nil, pop: true }
30
+ when 'boolean'
31
+ Reader[:read_boolean!].(api, state, stack_index)
32
+ when 'table'
33
+ Table[:read!].(api, state, stack_index)
34
+ when 'function'
35
+ Function[:read!].(api, state, stack_index)
36
+ else
37
+ # none nil boolean lightuserdata number
38
+ # string table function userdata thread
39
+ { value: "#{type}: 0x#{api.lua_topointer(state, stack_index).address}",
40
+ type: type, pop: true }
41
+ end
42
+ },
43
+
44
+ read_string!: ->(api, state, stack_index) {
45
+ { value: api.lua_tostring(state, stack_index).read_string,
46
+ pop: true }
47
+ },
48
+
49
+ read_number!: ->(api, state, stack_index) {
50
+ if api.respond_to?(:lua_isinteger) &&
51
+ api.respond_to?(:lua_tointeger) &&
52
+ api.lua_isinteger(state, stack_index) == 1
53
+
54
+ return { value: api.lua_tointeger(state, stack_index), pop: true }
55
+ end
56
+
57
+ { value: api.lua_tonumber(state, stack_index), pop: true }
58
+ },
59
+
60
+ read_boolean!: ->(api, state, stack_index) {
61
+ { value: api.lua_toboolean(state, stack_index) == 1, pop: true }
62
+ }
63
+ }
64
+ end
65
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../../logic/tables'
2
+
3
+ require_relative 'writer'
4
+ require_relative 'reader'
5
+
6
+ module Component
7
+ module V51
8
+ Table = {
9
+ push!: ->(api, state, list, stack_index = -1) {
10
+ stack_index = api.lua_gettop(state) if stack_index == -1
11
+
12
+ api.lua_createtable(state, list.size, 0)
13
+
14
+ if list.is_a? Hash
15
+ list.each_key do |key|
16
+ Writer[:push!].(api, state, key)
17
+ Writer[:push!].(api, state, list[key])
18
+ api.lua_settable(state, stack_index + 1)
19
+ end
20
+ else
21
+ list.each_with_index do |value, index|
22
+ Writer[:push!].(api, state, index + 1)
23
+ Writer[:push!].(api, state, value)
24
+ api.lua_settable(state, stack_index + 1)
25
+ end
26
+ end
27
+ },
28
+
29
+ read!: ->(api, state, stack_index) {
30
+ stack_index = api.lua_gettop(state) if stack_index == -1
31
+
32
+ type = api.lua_typename(state, api.lua_type(state, stack_index)).read_string
33
+
34
+ api.lua_pushnil(state)
35
+
36
+ return nil if type != 'table'
37
+
38
+ tuples = []
39
+
40
+ while api.lua_next(state, stack_index).positive?
41
+ value = Reader[:read!].(api, state, stack_index + 2)
42
+ key = Reader[:read!].(api, state, stack_index + 1)
43
+ api.lua_settop(state, -2) if value[:pop]
44
+
45
+ tuples << [key[:value], value[:value]]
46
+
47
+ break if value[:type] == 'no value'
48
+ end
49
+
50
+ { value: Logic::Tables[:to_hash_or_array].(tuples), pop: true }
51
+ },
52
+
53
+ read_field!: ->(api, state, expected_key, stack_index) {
54
+ expected_key = expected_key.to_s if expected_key.is_a? Symbol
55
+
56
+ api.lua_getfield(state, stack_index, expected_key)
57
+ }
58
+ }
59
+ end
60
+ end
@@ -0,0 +1,45 @@
1
+ require_relative 'function'
2
+ require_relative 'table'
3
+
4
+ module Component
5
+ module V51
6
+ Writer = {
7
+ push!: ->(api, state, value) {
8
+ case Writer[:_to_lua_type].(value)
9
+ when 'string'
10
+ api.lua_pushstring(state, value.to_s)
11
+ when 'number'
12
+ api.lua_pushnumber(state, value)
13
+ when 'integer'
14
+ if api.respond_to? :lua_pushinteger
15
+ api.lua_pushinteger(state, value)
16
+ else
17
+ api.lua_pushnumber(state, value)
18
+ end
19
+ when 'nil'
20
+ api.lua_pushnil(state)
21
+ when 'boolean'
22
+ api.lua_pushboolean(state, value ? 1 : 0)
23
+ when 'table'
24
+ Table[:push!].(api, state, value)
25
+ when 'function'
26
+ Function[:push!].(api, state, value)
27
+ else
28
+ api.lua_pushstring(
29
+ state, "#<#{value.class}:0x#{format('%016x', value.object_id)}>"
30
+ )
31
+ end
32
+ },
33
+
34
+ _to_lua_type: ->(value) {
35
+ return 'nil' if value.nil?
36
+ return 'function' if value.is_a?(Proc)
37
+ return 'integer' if value.is_a? Integer
38
+ return 'number' if value.is_a? Float
39
+ return 'table' if value.is_a?(Hash) || value.is_a?(Array)
40
+ return 'string' if value.is_a?(String) || value.instance_of?(Symbol)
41
+ return 'boolean' if [true, false].include? value
42
+ }
43
+ }
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../../logic/interpreters/interpreter_54'
2
+ require_relative '../../../dsl/errors'
3
+
4
+ require_relative 'writer'
5
+ require_relative 'reader'
6
+
7
+ module Component
8
+ module V54
9
+ Function = {
10
+ push!: ->(api, state, closure) {
11
+ handler = ->(current_state) {
12
+ input = Reader[:read_all!].(api, current_state)
13
+ result = closure.(*input)
14
+ Writer[:push!].(api, current_state, result)
15
+ return 1
16
+ }
17
+
18
+ api.lua_pushcclosure(state, handler, 0)
19
+ },
20
+
21
+ read!: ->(api, state, _stack_index) {
22
+ reference = api.luaL_ref(
23
+ state, Logic::V54::Interpreter[:LUA_REGISTRYINDEX]
24
+ )
25
+
26
+ { value: ->(input = [], output = 1) {
27
+ api.lua_rawgeti(
28
+ state, Logic::V54::Interpreter[:LUA_REGISTRYINDEX], reference
29
+ )
30
+
31
+ input.each do |value|
32
+ Writer[:push!].(api, state, value)
33
+ end
34
+
35
+ result = Interpreter[:call!].(api, state, input.size, output)
36
+
37
+ if result[:error]
38
+ raise SweetMoon::Errors::SweetMoonErrorHelper.for(
39
+ result[:error][:status]
40
+ ), result[:error][:value]
41
+ end
42
+
43
+ result = Reader[:read_all!].(api, state)
44
+
45
+ return result.first if output == 1
46
+
47
+ result
48
+ }, pop: false }
49
+ }
50
+ }
51
+ end
52
+ end
@@ -0,0 +1,100 @@
1
+ require_relative '../../../logic/interpreters/interpreter_54'
2
+
3
+ require_relative 'reader'
4
+ require_relative 'writer'
5
+ require_relative 'table'
6
+
7
+ module Component
8
+ module V54
9
+ Interpreter = {
10
+ version: Logic::V54::Interpreter[:version],
11
+
12
+ create_state!: ->(api) {
13
+ state = api.luaL_newstate
14
+ { state: state, error: state ? nil : :MemoryAllocation }
15
+ },
16
+
17
+ open_standard_libraries!: ->(api, state) {
18
+ api.luaL_openlibs(state)
19
+ { state: state }
20
+ },
21
+
22
+ load_file_and_push_chunck!: ->(api, state, path) {
23
+ result = api.luaL_loadfile(state, path)
24
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
25
+ },
26
+
27
+ push_chunk!: ->(api, state, value) {
28
+ result = api.luaL_loadstring(state, value)
29
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
30
+ },
31
+
32
+ set_table!: ->(api, state, variable, value) {
33
+ Table[:set!].(api, state, variable, value)
34
+ },
35
+
36
+ push_value!: ->(api, state, value) {
37
+ Writer[:push!].(api, state, value)
38
+ { state: state }
39
+ },
40
+
41
+ pop_and_set_as!: ->(api, state, variable) {
42
+ api.lua_setglobal(state, variable)
43
+ { state: state }
44
+ },
45
+
46
+ get_variable_and_push!: ->(api, state, variable, key = nil) {
47
+ api.lua_getglobal(state, variable.to_s)
48
+
49
+ unless key.nil?
50
+ if api.lua_typename(state, api.lua_type(state, -1)).read_string == 'table'
51
+ Table[:read_field!].(api, state, key, -1)
52
+ else
53
+ api.lua_pushnil(state)
54
+ end
55
+ end
56
+
57
+ { state: state }
58
+ },
59
+
60
+ call!: ->(api, state, inputs = 0, outputs = 1) {
61
+ result = api.lua_pcall(state, inputs, outputs, 0)
62
+ { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
63
+ },
64
+
65
+ read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
66
+ result = Component::V54::Reader[:read!].(api, state, stack_index)
67
+
68
+ api.lua_settop(state, -2) if result[:pop]
69
+ api.lua_settop(state, -2) if extra_pop
70
+
71
+ { state: state, output: result[:value] }
72
+ },
73
+
74
+ read_all!: ->(api, state) {
75
+ result = Reader[:read_all!].(api, state)
76
+
77
+ { state: state, output: result }
78
+ },
79
+
80
+ destroy_state!: ->(api, state) {
81
+ result = api.lua_close(state)
82
+
83
+ { state: nil, error: Interpreter[:_error].(api, state, result) }
84
+ },
85
+
86
+ _error: ->(api, state, code, options = {}) {
87
+ status = Logic::V54::Interpreter[:error][
88
+ Logic::V54::Interpreter[:status][code]
89
+ ] || :error
90
+
91
+ if code.is_a?(Numeric) && code >= 2
92
+ return { status: status } unless options[:pull]
93
+
94
+ { status: status,
95
+ value: Interpreter[:read_and_pop!].(api, state, -1)[:output] }
96
+ end
97
+ }
98
+ }
99
+ end
100
+ end
@@ -0,0 +1,65 @@
1
+ require 'ffi'
2
+
3
+ require_relative 'interpreter'
4
+ require_relative 'function'
5
+ require_relative 'table'
6
+
7
+ module Component
8
+ module V54
9
+ Reader = {
10
+ read_all!: ->(api, state) {
11
+ (1..api.lua_gettop(state)).map do
12
+ Interpreter[:read_and_pop!].(api, state)[:output]
13
+ end.reverse
14
+ },
15
+
16
+ read!: ->(api, state, stack_index = -1) {
17
+ stack_index = api.lua_gettop(state) if stack_index == -1
18
+
19
+ type = api.lua_typename(state, api.lua_type(state, stack_index)).read_string
20
+
21
+ case type
22
+ when 'string'
23
+ Reader[:read_string!].(api, state, stack_index)
24
+ when 'number'
25
+ Reader[:read_number!].(api, state, stack_index)
26
+ when 'no value'
27
+ { value: nil, pop: true, type: type }
28
+ when 'nil'
29
+ { value: nil, pop: true }
30
+ when 'boolean'
31
+ Reader[:read_boolean!].(api, state, stack_index)
32
+ when 'table'
33
+ Table[:read!].(api, state, stack_index)
34
+ when 'function'
35
+ Function[:read!].(api, state, stack_index)
36
+ else
37
+ # none nil boolean lightuserdata number
38
+ # string table function userdata thread
39
+ { value: "#{type}: 0x#{api.lua_topointer(state, stack_index).address}",
40
+ type: type, pop: true }
41
+ end
42
+ },
43
+
44
+ read_string!: ->(api, state, stack_index) {
45
+ { value: api.lua_tostring(state, stack_index).read_string,
46
+ pop: true }
47
+ },
48
+
49
+ read_number!: ->(api, state, stack_index) {
50
+ if api.respond_to?(:lua_isinteger) &&
51
+ api.respond_to?(:lua_tointeger) &&
52
+ api.lua_isinteger(state, stack_index) == 1
53
+
54
+ return { value: api.lua_tointeger(state, stack_index), pop: true }
55
+ end
56
+
57
+ { value: api.lua_tonumber(state, stack_index), pop: true }
58
+ },
59
+
60
+ read_boolean!: ->(api, state, stack_index) {
61
+ { value: api.lua_toboolean(state, stack_index) == 1, pop: true }
62
+ }
63
+ }
64
+ end
65
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../../logic/tables'
2
+
3
+ require_relative 'writer'
4
+ require_relative 'reader'
5
+
6
+ module Component
7
+ module V54
8
+ Table = {
9
+ push!: ->(api, state, list, stack_index = -1) {
10
+ stack_index = api.lua_gettop(state) if stack_index == -1
11
+
12
+ api.lua_createtable(state, list.size, 0)
13
+
14
+ if list.is_a? Hash
15
+ list.each_key do |key|
16
+ Writer[:push!].(api, state, key)
17
+ Writer[:push!].(api, state, list[key])
18
+ api.lua_settable(state, stack_index + 1)
19
+ end
20
+ else
21
+ list.each_with_index do |value, index|
22
+ Writer[:push!].(api, state, index + 1)
23
+ Writer[:push!].(api, state, value)
24
+ api.lua_settable(state, stack_index + 1)
25
+ end
26
+ end
27
+ },
28
+
29
+ read!: ->(api, state, stack_index) {
30
+ stack_index = api.lua_gettop(state) if stack_index == -1
31
+
32
+ type = api.lua_typename(state, api.lua_type(state, stack_index)).read_string
33
+
34
+ api.lua_pushnil(state)
35
+
36
+ return nil if type != 'table'
37
+
38
+ tuples = []
39
+
40
+ while api.lua_next(state, stack_index).positive?
41
+ value = Reader[:read!].(api, state, stack_index + 2)
42
+ key = Reader[:read!].(api, state, stack_index + 1)
43
+ api.lua_settop(state, -2) if value[:pop]
44
+
45
+ tuples << [key[:value], value[:value]]
46
+
47
+ break if value[:type] == 'no value' || key[:value].instance_of?(Proc)
48
+ end
49
+
50
+ { value: Logic::Tables[:to_hash_or_array].(tuples), pop: true }
51
+ },
52
+
53
+ read_field!: ->(api, state, expected_key, stack_index) {
54
+ expected_key = expected_key.to_s if expected_key.is_a? Symbol
55
+
56
+ api.lua_getfield(state, stack_index, expected_key)
57
+ }
58
+ }
59
+ end
60
+ end
@@ -0,0 +1,45 @@
1
+ require_relative 'function'
2
+ require_relative 'table'
3
+
4
+ module Component
5
+ module V54
6
+ Writer = {
7
+ push!: ->(api, state, value) {
8
+ case Writer[:_to_lua_type].(value)
9
+ when 'string'
10
+ api.lua_pushstring(state, value.to_s)
11
+ when 'number'
12
+ api.lua_pushnumber(state, value)
13
+ when 'integer'
14
+ if api.respond_to? :lua_pushinteger
15
+ api.lua_pushinteger(state, value)
16
+ else
17
+ api.lua_pushnumber(state, value)
18
+ end
19
+ when 'nil'
20
+ api.lua_pushnil(state)
21
+ when 'boolean'
22
+ api.lua_pushboolean(state, value ? 1 : 0)
23
+ when 'table'
24
+ Table[:push!].(api, state, value)
25
+ when 'function'
26
+ Function[:push!].(api, state, value)
27
+ else
28
+ api.lua_pushstring(
29
+ state, "#<#{value.class}:0x#{format('%016x', value.object_id)}>"
30
+ )
31
+ end
32
+ },
33
+
34
+ _to_lua_type: ->(value) {
35
+ return 'nil' if value.nil?
36
+ return 'function' if value.is_a?(Proc)
37
+ return 'integer' if value.is_a? Integer
38
+ return 'number' if value.is_a? Float
39
+ return 'table' if value.is_a?(Hash) || value.is_a?(Array)
40
+ return 'string' if value.is_a?(String) || value.instance_of?(Symbol)
41
+ return 'boolean' if [true, false].include? value
42
+ }
43
+ }
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'interpreters/50/interpreter'
2
+ require_relative 'interpreters/51/interpreter'
3
+ require_relative 'interpreters/54/interpreter'
4
+
5
+ module Component
6
+ Interpreters = {
7
+ '5.0' => { version: '5.0', interpreter: V50::Interpreter },
8
+ '5.1' => { version: '5.1', interpreter: V51::Interpreter },
9
+ '5.4' => { version: '5.4', interpreter: V54::Interpreter }
10
+ }
11
+ end
data/components/io.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'find'
2
+
3
+ module Component
4
+ IO = {
5
+ read!: ->(path) { File.read(path) },
6
+ write!: ->(path, content) { File.write(path, content) },
7
+ find_by_pattern!: ->(pattern) { Dir.glob(pattern) },
8
+ find_recursively!: ->(initial_path) { Find.find(initial_path) },
9
+ reject_non_existent!: ->(paths) { paths.select { |path| File.file?(path) } }
10
+ }
11
+ end
@@ -0,0 +1,15 @@
1
+ luarocks:
2
+ - /home/me/.luarocks/share/lua/5.4/?.lua
3
+ - /home/me/.luarocks/share/lua/5.4/?/init.lua
4
+ - /home/me/.luarocks/lib/lua/5.4/?.so
5
+
6
+ 5.4.4:
7
+ description: 'Lua 5.4.4 + Fennel 1.0.0'
8
+ shared_object: /resources/liblua.so.5.4.4
9
+ fennel: /resources/fennel.lua
10
+
11
+ 4.0.1:
12
+ description: 'Lua 4.0.1'
13
+ shared_objects:
14
+ - /resources/liblua.so.4.0.1
15
+ - /resources/liblualib.so.4.0.1