mundler 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8bff85e95c9055e66797b7e104e4781625b8184b0d9a8e1992e0e05a2db566ec
4
+ data.tar.gz: b1afb00af0ef0a556f7be323cbe7dab1e8e14ce84026e75079c5498173a291ce
5
+ SHA512:
6
+ metadata.gz: cb8b8c78f8d369b30d670b60da360c7ee33a6c990a82bf424aa309ac49ecde96c1a525baf4b0e182ff670288093b7321c073540f41082d3b15ef2f53d2b4fff1
7
+ data.tar.gz: 07da326cea2279e896f5f05b33c74f71e1fcd7b0245d5f2f1794d6ccd916aef652a798c9f1a8613ab4b5010628fd0ce4b03e130a9da4c84eb46bf41186448f3d
@@ -0,0 +1,16 @@
1
+ require "digest"
2
+ require "fileutils"
3
+ require "tempfile"
4
+
5
+ require "mundler/version"
6
+ require "mundler/config"
7
+ require "mundler/build_config"
8
+ require "mundler/dsl"
9
+ require "mundler/mruby"
10
+ require "mundler/project"
11
+
12
+ module Mundler
13
+ class CompilationError < StandardError; end
14
+ class NotInstalledError < StandardError; end
15
+ class MundlefileNotFound < StandardError; end
16
+ end
@@ -0,0 +1,75 @@
1
+ module Mundler
2
+ class BuildConfig
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
+
7
+ def tempfile
8
+ tempfile = Tempfile.new("build_config.rb")
9
+ File.write(tempfile, contents)
10
+ tempfile
11
+ end
12
+
13
+ def gemboxes
14
+ @config.gemboxes.map do |gembox|
15
+ "conf.gembox #{gembox.inspect}"
16
+ end.join("\n")
17
+ end
18
+
19
+ def gems
20
+ @config.gems.map do |gem|
21
+ # e.g. gem = {:name=>"mruby-regexp-pcre", :path=>nil, :github=>nil, :core=>nil}
22
+ args = ":mgem => #{gem[:name].inspect}"
23
+
24
+ if gem[:github]
25
+ args = ":github => #{gem[:github].inspect}"
26
+ elsif gem[:path]
27
+ args = ":path => #{gem[:path].inspect}"
28
+ elsif gem[:core]
29
+ args = ":core => #{gem[:core].inspect}"
30
+ end
31
+
32
+ "conf.gem #{args}"
33
+ end.join("\n ")
34
+ end
35
+
36
+ def mruby_version
37
+ mruby_url = @config.mruby[:url]
38
+
39
+ version = (
40
+ @config.mruby[:tag] ||
41
+ @config.mruby[:branch] ||
42
+ @config.mruby[:version]
43
+ )
44
+
45
+ "#{mruby_url} #{version}"
46
+ end
47
+
48
+ private
49
+
50
+ def platforms
51
+ @config.platforms.map do |platform|
52
+ type = @config.platform_types[platform[:name].to_s]
53
+ raise "Can't find platform: #{platform[:name]}" unless type
54
+ type.config(platform, self)
55
+ end.join("\n")
56
+ end
57
+
58
+ def contents
59
+ contents = <<~CONTENTS
60
+ # #{mruby_version}
61
+
62
+ MRuby::Build.new do |conf|
63
+ toolchain :clang
64
+
65
+ #{gemboxes}
66
+ #{gems}
67
+ end
68
+
69
+ #{platforms}
70
+ CONTENTS
71
+
72
+ contents.strip + "\n"
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,90 @@
1
+ require "thor"
2
+
3
+ module Mundler
4
+ class CLI < Thor
5
+ include Thor::Actions
6
+
7
+ def self.exit_on_failure?
8
+ true
9
+ end
10
+
11
+ desc "install", "Download and compile mruby"
12
+ def install
13
+ Mundler::Project.new(Dir.pwd).install
14
+ rescue Mundler::CompilationError
15
+ $stderr.puts("\e[31mFailed to install\e[0m")
16
+ exit 1
17
+ rescue Interrupt
18
+ $stderr.puts("\e[31mUser cancelled\e[0m")
19
+ exit 1
20
+ rescue MundlefileNotFound
21
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
22
+ exit 1
23
+ end
24
+
25
+ desc "update", "Same as install except it forces recompile"
26
+ def update
27
+ project = Mundler::Project.new(Dir.pwd)
28
+ project.clean
29
+ project.install
30
+ rescue Mundler::CompilationError
31
+ $stderr.puts("\e[31mFailed to install\e[0m")
32
+ exit 1
33
+ rescue Interrupt
34
+ $stderr.puts("\e[31mUser cancelled\e[0m")
35
+ exit 1
36
+ rescue MundlefileNotFound
37
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
38
+ exit 1
39
+ end
40
+
41
+ desc "summary", "Print a summary of installed libraries and binaries"
42
+ def summary
43
+ project = Mundler::Project.new(Dir.pwd)
44
+ project.print_summary
45
+ rescue Interrupt
46
+ $stderr.puts("\e[31mUser cancelled\e[0m")
47
+ exit 1
48
+ rescue MundlefileNotFound
49
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
50
+ exit 1
51
+ end
52
+
53
+ desc "clean", "Removes cached versions of mruby."
54
+ def clean
55
+ Mundler::Project.new(Dir.pwd).clean
56
+ rescue Interrupt
57
+ $stderr.puts("\e[31mUser cancelled\e[0m")
58
+ exit 1
59
+ rescue MundlefileNotFound
60
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
61
+ exit 1
62
+ end
63
+
64
+ desc "exec", "Execute command with mruby's bin prepended to $PATH"
65
+ def exec(*args)
66
+ Mundler::Project.new(Dir.pwd).exec(args)
67
+ rescue Interrupt
68
+ exit 1
69
+ rescue NotInstalledError
70
+ $stderr.puts("\e[31mChanges to the Mundlefile have been detected. Run `mundle install` and try again.\e[0m")
71
+ exit 1
72
+ rescue MundlefileNotFound
73
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
74
+ exit 1
75
+ end
76
+
77
+ desc "path", "Prints out the path relevant to the compiled version of mruby relevant to the `Mundlefile`"
78
+ def path
79
+ puts Mundler::Project.new(Dir.pwd).path
80
+ rescue Interrupt
81
+ $stderr.puts("\e[31mUser cancelled\e[0m")
82
+ exit 1
83
+ rescue MundlefileNotFound
84
+ $stderr.puts("\e[31mMundlefile not found in the current directory\e[0m")
85
+ exit 1
86
+ end
87
+
88
+ default_task :install
89
+ end
90
+ end
@@ -0,0 +1,44 @@
1
+ module Mundler
2
+ class Config
3
+ def initialize
4
+ @mruby = {
5
+ url: "https://github.com/mruby/mruby",
6
+ branch: "stable"
7
+ }
8
+
9
+ @platforms = []
10
+ @gemboxes = []
11
+ @gems = []
12
+ @platform_types = {}
13
+ end
14
+
15
+ attr_reader :mruby
16
+ attr_reader :platform_types
17
+
18
+ def hex
19
+ Digest::MD5.hexdigest(to_s)
20
+ end
21
+
22
+ def gemboxes
23
+ @gemboxes.sort!
24
+ end
25
+
26
+ def gems
27
+ @gems.sort_by! { |platform| platform[:name] }
28
+ end
29
+
30
+ def platforms
31
+ @platforms.sort_by! { |platform| platform[:name] }
32
+ end
33
+
34
+ def to_s
35
+ <<~HASHABLE
36
+ #{mruby.inspect}
37
+ #{platforms.inspect}
38
+ #{platform_types.keys.sort.inspect}
39
+ #{gemboxes.inspect}
40
+ #{gems.inspect}
41
+ HASHABLE
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,47 @@
1
+ module Mundler
2
+ class DSL
3
+ def initialize(path)
4
+ @config = Config.new
5
+ @path = path
6
+ end
7
+
8
+ def evaluate!
9
+ platforms = Dir.glob(File.join(__dir__, "platforms", "*.rb"))
10
+ platforms.each do |platform|
11
+ instance_eval(File.read(platform))
12
+ end
13
+ begin
14
+ instance_eval(File.read(@path), @path)
15
+ rescue Errno::ENOENT
16
+ raise MundlefileNotFound
17
+ end
18
+ end
19
+
20
+ attr_reader :config
21
+
22
+ private
23
+
24
+ def mruby(url: nil, tag: nil, branch: nil)
25
+ branch = "stable" if tag.nil? && branch.nil?
26
+ config.mruby[:url] = url if url
27
+ config.mruby[:branch] = branch if branch
28
+ config.mruby[:tag] = tag if tag
29
+ end
30
+
31
+ def gembox(name)
32
+ config.gemboxes << name.to_s
33
+ end
34
+
35
+ def define_platform(name, platform_class)
36
+ config.platform_types[name.to_s] = platform_class
37
+ end
38
+
39
+ def platform(name, options)
40
+ config.platforms << { name: name.to_s, options: options }
41
+ end
42
+
43
+ def gem(name, core: nil, path: nil, github: nil)
44
+ config.gems << { name: name, path: path, github: github, core: core }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,184 @@
1
+ module Mundler
2
+ class MRuby
3
+ def initialize(config)
4
+ @config = config
5
+ @path = File.join(ENV["HOME"], ".mundler", config.hex)
6
+
7
+ # Protect just incase, as we're doing an rm_rf
8
+ raise "Something went wrong" if config.hex.length == 0
9
+ end
10
+
11
+ attr_reader :path
12
+
13
+ def delete_repository
14
+ FileUtils.rm_rf(@path)
15
+ end
16
+
17
+ def clone_repository
18
+ success_indicator = File.join(@path, ".mundler_cloned_successfully")
19
+ return if File.file?(success_indicator)
20
+
21
+ mruby_url = @config.mruby[:url]
22
+
23
+ version = (
24
+ @config.mruby[:tag] ||
25
+ @config.mruby[:branch] ||
26
+ @config.mruby[:version]
27
+ )
28
+
29
+ FileUtils.rm_rf(@path)
30
+ FileUtils.mkdir_p(@path)
31
+ FileUtils.cd(@path)
32
+ git_clone = Proc.new do
33
+ system(
34
+ {
35
+ # The {mundler gem path}/cached_git directory contains a binary called
36
+ # `git` that will run instead of normal git, making a cache of a
37
+ # clone.
38
+ "PATH" => ([cached_git_dir] + ENV["PATH"].split(":")).join(":")
39
+ },
40
+ "git clone #{mruby_url} . >/dev/null 2>&1"
41
+ ) || error_out("Failed to clone mruby: #{mruby_url}")
42
+ end
43
+
44
+ if defined?(Bundler) && Bundler.respond_to?(:with_unbundled_env)
45
+ Bundler.with_unbundled_env(&git_clone)
46
+ elsif defined?(Bundler)
47
+ Bundler.with_clean_env(&git_clone)
48
+ else
49
+ git_clone.call
50
+ end
51
+
52
+ if version
53
+ system("git reset --hard #{version} >/dev/null 2>&1") ||
54
+ error_out("Failed to set version to #{version}")
55
+ end
56
+
57
+ FileUtils.touch(success_indicator)
58
+ end
59
+
60
+ def exec(args)
61
+ raise NotInstalledError unless installed?
62
+
63
+ bin_dir = File.join(@path, "bin")
64
+ path = bin_dir + ":" + ENV['PATH']
65
+ Process.spawn({ "PATH" => path }, *args)
66
+ Process.wait
67
+ exit($?.exitstatus) if $?.exitstatus
68
+ end
69
+
70
+ def compile(build_config)
71
+ logfile = Tempfile.new(['mundler_build', '.log'])
72
+
73
+ success_indicator = File.join(@path, ".mundler_built_successfully")
74
+ if File.file?(success_indicator)
75
+ return
76
+ end
77
+
78
+ FileUtils.cd(@path)
79
+
80
+ cleaned = false
81
+ covered = []
82
+ output_thread = Thread.new do
83
+ loop do
84
+ if cleaned
85
+ Dir.glob(File.join(Dir.pwd, "build", "*", "*", "*")).each do |file|
86
+ pathname = Pathname.new(file)
87
+ directory = pathname.directory? ? pathname.to_s : Pathname.new(file).dirname.to_s
88
+ next if covered.include?(directory)
89
+ covered << directory
90
+ print "\e[32m.\e[0m"
91
+ end
92
+ end
93
+ sleep(0.3)
94
+ end
95
+ end
96
+
97
+ clean = Proc.new do
98
+ rake = `which rake`.chomp
99
+ system(
100
+ {
101
+ "MRUBY_CONFIG" => build_config,
102
+ # The {mundler gem path}/cached_git directory contains a binary called
103
+ # `git` that will run instead of normal git, making a cache of a
104
+ # clone.
105
+ "PATH" => ([cached_git_dir] + ENV["PATH"].split(":")).join(":")
106
+ },
107
+ "#{rake} clean >#{logfile.path} 2>&1 && #{rake} deep_clean >#{logfile.path} 2>&1"
108
+ ) || begin
109
+ $stderr.print "\e[31mF\e[0m"
110
+ $stderr.puts "\n\n"
111
+ $stderr.puts File.read(logfile)
112
+
113
+ raise Mundler::CompilationError
114
+ end
115
+
116
+ cleaned = true
117
+ end
118
+
119
+ compile = Proc.new do
120
+ rake = `which rake`.chomp
121
+ system(
122
+ {
123
+ "MRUBY_CONFIG" => build_config,
124
+ # The {mundler gem path}/cached_git directory contains a binary called
125
+ # `git` that will run instead of normal git, making a cache of a
126
+ # clone.
127
+ "PATH" => ([cached_git_dir] + ENV["PATH"].split(":")).join(":")
128
+ },
129
+ "#{rake} >#{logfile.path} 2>&1"
130
+ ) || begin
131
+ $stderr.print "\e[31mF\e[0m"
132
+ $stderr.puts "\n\n"
133
+ $stderr.puts File.read(logfile)
134
+
135
+ raise Mundler::CompilationError
136
+ end
137
+ end
138
+
139
+ if defined?(Bundler) && Bundler.respond_to?(:with_unbundled_env)
140
+ Bundler.with_unbundled_env(&clean)
141
+ Bundler.with_unbundled_env(&compile)
142
+ elsif defined?(Bundler)
143
+ Bundler.with_clean_env(&clean)
144
+ Bundler.with_clean_env(&compile)
145
+ else
146
+ clean.call
147
+ compile.call
148
+ end
149
+
150
+ output_thread.kill
151
+ FileUtils.touch(success_indicator)
152
+ ensure
153
+ logfile.close
154
+ logfile.delete
155
+ end
156
+
157
+ def print_summary
158
+ FileUtils.cd(@path)
159
+ puts "Libraries:"
160
+ Dir.glob(File.join(Dir.pwd, "**", "*.a")).each { |a| puts "* " + a.split("build/").last }
161
+
162
+ binaries = Dir.glob(File.join(Dir.pwd, "build", "host", "bin", "*"))
163
+ if binaries.count > 0
164
+ puts ""
165
+ puts "Binaries:"
166
+ binaries.each { |a| puts "* " + a.split("/").last }
167
+ end
168
+ end
169
+
170
+ private
171
+
172
+ def installed?
173
+ success_indicator = File.join(@path, ".mundler_built_successfully")
174
+ File.file?(success_indicator)
175
+ end
176
+
177
+ def cached_git_dir
178
+ dir = File.expand_path(File.join(__dir__, "..", "..", "cached_git"))
179
+ raise "cached git not found" unless File.file?(File.join(dir, "git"))
180
+ raise "cached git not found" unless File.file?(File.join(dir, "cached_git"))
181
+ dir
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,42 @@
1
+ module IOSPlatform
2
+ def self.config(options, build_config)
3
+ valid_archs = [:armv7, :arm64]
4
+ options[:archs] ||= valid_archs
5
+
6
+ options[:archs].map do |arch|
7
+ unless valid_archs.include?(arch)
8
+ raise "Invalid architecture #{arch}. Valid values: #{valid_archs}"
9
+ end
10
+
11
+ minimum_ios_version = options[:minimum_ios_sdk_version] || "10.0"
12
+ ios_sdk = `xcrun --sdk iphoneos --show-sdk-path`.chomp
13
+
14
+ clang = `xcrun -find clang`.chomp
15
+ flags = %W(
16
+ -O3
17
+ -miphoneos-version-min=#{minimum_ios_version}
18
+ -arch #{arch}
19
+ -isysroot #{ios_sdk}
20
+ )
21
+
22
+ <<~BUILD
23
+ MRuby::CrossBuild.new("ios__#{arch}") do |conf|
24
+ #{build_config.gemboxes}
25
+ #{build_config.gems}
26
+
27
+ conf.cc do |cc|
28
+ cc.command = #{clang.inspect}
29
+ cc.flags = #{flags.inspect}
30
+ end
31
+
32
+ conf.linker do |l|
33
+ l.command = #{clang.inspect}
34
+ l.flags = #{flags.inspect}
35
+ end
36
+ end
37
+ BUILD
38
+ end.join("\n")
39
+ end
40
+ end
41
+
42
+ define_platform "ios", IOSPlatform
@@ -0,0 +1,42 @@
1
+ module IOSSimulatorPlatform
2
+ def self.config(options, build_config)
3
+ valid_archs = [:i386, :x86_64]
4
+ options[:archs] ||= valid_archs
5
+
6
+ options[:archs].map do |arch|
7
+ unless valid_archs.include?(arch)
8
+ raise "Invalid architecture #{arch}. Valid values: #{valid_archs}"
9
+ end
10
+
11
+ minimum_ios_version = options[:minimum_ios_sdk_version] || "10.0"
12
+ ios_simulator_sdk = `xcrun --sdk iphonesimulator --show-sdk-path`.chomp
13
+
14
+ clang = `xcrun -find clang`.chomp
15
+ flags = %W(
16
+ -O3
17
+ -mios-simulator-version-min=#{minimum_ios_version}
18
+ -arch #{arch}
19
+ -isysroot #{ios_simulator_sdk}
20
+ )
21
+
22
+ <<~BUILD
23
+ MRuby::CrossBuild.new("ios_simulator__#{arch}") do |conf|
24
+ #{build_config.gemboxes}
25
+ #{build_config.gems}
26
+
27
+ conf.cc do |cc|
28
+ cc.command = #{clang.inspect}
29
+ cc.flags = #{flags.inspect}
30
+ end
31
+
32
+ conf.linker do |l|
33
+ l.command = #{clang.inspect}
34
+ l.flags = #{flags.inspect}
35
+ end
36
+ end
37
+ BUILD
38
+ end.join("\n")
39
+ end
40
+ end
41
+
42
+ define_platform "ios_simulator", IOSSimulatorPlatform
@@ -0,0 +1,51 @@
1
+ module Mundler
2
+ class Project
3
+ def initialize(project_path)
4
+ @project_path = project_path
5
+ @mruby = MRuby.new(config)
6
+ end
7
+
8
+ def install(&blk)
9
+ @mruby.clone_repository
10
+ build_config = BuildConfig.new(config).tempfile
11
+ @mruby.compile(build_config.path)
12
+ FileUtils.cp(build_config.path, File.join(@project_path, "Mundlefile.lock"))
13
+ ensure
14
+ if build_config
15
+ build_config.close
16
+ build_config.delete
17
+ end
18
+ end
19
+
20
+ def print_summary
21
+ @mruby.print_summary
22
+ end
23
+
24
+ def clean
25
+ @mruby.delete_repository
26
+ end
27
+
28
+ def exec(args)
29
+ @mruby.exec(args)
30
+ end
31
+
32
+ def path
33
+ @mruby.path
34
+ end
35
+
36
+ private
37
+
38
+ def config
39
+ @config ||= begin
40
+ mundlefile_path = (
41
+ ENV["MUNDLEFILE_PATH"] ||
42
+ File.join(@project_path, "Mundlefile")
43
+ )
44
+
45
+ dsl = DSL.new(mundlefile_path)
46
+ dsl.evaluate!
47
+ dsl.config
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module Mundler
2
+ VERSION = "0.5.0"
3
+ end
data/exe/mundle ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mundler"
5
+ require "mundler/cli"
6
+
7
+ Mundler::CLI.start(ARGV)
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mundler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Inkpen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A simple tool help download and compile mruby when gems change
56
+ email:
57
+ - dan2552@gmail.com
58
+ executables:
59
+ - mundle
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler.rb"
64
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/build_config.rb"
65
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/cli.rb"
66
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/config.rb"
67
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/dsl.rb"
68
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/mruby.rb"
69
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/platforms/ios.rb"
70
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/platforms/ios_simulator.rb"
71
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/project.rb"
72
+ - "/Users/dan2552/Dropbox/experiments/mundler/lib/mundler/version.rb"
73
+ - exe/mundle
74
+ homepage: https://github.com/Dan2552/mundler
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubygems_version: 3.0.3
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: A simple tool help download and compile mruby when gems change
97
+ test_files: []