mgem 0.0.1
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.
- data/bin/mgem +69 -0
- data/lib/mgem.rb +128 -0
- metadata +50 -0
data/bin/mgem
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "#{File.dirname(__FILE__)}/../lib/mgem"
|
4
|
+
|
5
|
+
gems = load_gems unless ARGV[0] == 'help'
|
6
|
+
|
7
|
+
info_proc = lambda do |obj|
|
8
|
+
puts " #{obj.name.ljust(20)}#{obj.description}"
|
9
|
+
end
|
10
|
+
|
11
|
+
detail_info_proc = lambda do |obj|
|
12
|
+
puts <<INFO
|
13
|
+
Name: #{obj.name}
|
14
|
+
Author: #{obj.author}
|
15
|
+
Description: #{obj.description}
|
16
|
+
Website: #{obj.website}
|
17
|
+
Repository: #{obj.repository}
|
18
|
+
Protocol: #{obj.protocol}
|
19
|
+
|
20
|
+
INFO
|
21
|
+
end
|
22
|
+
|
23
|
+
def list_active_gems(current_gems)
|
24
|
+
puts "List of active GEMs:"
|
25
|
+
current_gems.active.each do |obj|
|
26
|
+
puts " [X] #{obj.name.ljust(20)}#{obj.description}"
|
27
|
+
end
|
28
|
+
puts
|
29
|
+
end
|
30
|
+
|
31
|
+
if ARGV[0] == 'info' or ARGV[0] == 'detail'
|
32
|
+
puts "Detail information of '#{ARGV[1]}':"
|
33
|
+
gems.search(ARGV[1], :name).each {|gem| detail_info_proc.call(gem) }
|
34
|
+
elsif ARGV[0] == 'size'
|
35
|
+
puts "Total # of GEMs: #{gems.size}"
|
36
|
+
elsif ARGV[0] == 'list'
|
37
|
+
if ARGV[1] == 'active'
|
38
|
+
list_active_gems(gems)
|
39
|
+
else
|
40
|
+
puts "List of all GEMs:"
|
41
|
+
gems.each { |gem| info_proc.call(gem) }
|
42
|
+
end
|
43
|
+
elsif ARGV[0] == 'add'
|
44
|
+
gems.activate(ARGV[1])
|
45
|
+
puts
|
46
|
+
list_active_gems(gems)
|
47
|
+
elsif ARGV[0] == 'rm'
|
48
|
+
gems.deactivate(ARGV[1])
|
49
|
+
puts
|
50
|
+
list_active_gems(gems)
|
51
|
+
elsif ARGV[0] == 'search'
|
52
|
+
puts "Search result for '#{ARGV[1]}':"
|
53
|
+
gems.search(ARGV[1]).each {|gem| info_proc.call(gem) }
|
54
|
+
else
|
55
|
+
puts <<INFO
|
56
|
+
mgem is a library manager for mruby
|
57
|
+
|
58
|
+
Usage:
|
59
|
+
mgem size How many GEMs are available?
|
60
|
+
mgem list [active] List GEMs
|
61
|
+
mgem info *pattern* Show detail information about a GEM
|
62
|
+
mgem add *name* Activate a GEM (GEMS.active)
|
63
|
+
mgem rm *name* De-Activate a GEM (GEMS.active)
|
64
|
+
mgem search *pattern* Search for GEMs
|
65
|
+
|
66
|
+
Website:
|
67
|
+
https://github.com/bovi/mgem
|
68
|
+
INFO
|
69
|
+
end
|
data/lib/mgem.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
def load_gems
|
4
|
+
config = {}
|
5
|
+
mgem_root = "#{File.dirname(__FILE__)}/.."
|
6
|
+
|
7
|
+
config[:mgem_root] = "#{File.dirname(__FILE__)}/.."
|
8
|
+
config[:gems_dir] = "#{config[:mgem_root]}/gems"
|
9
|
+
config[:gems_active] = "#{ENV['HOME']}/mrbgems/GEMS.active"
|
10
|
+
config[:gems_build_dir] = "#{ENV['HOME']}/mrbgems/g"
|
11
|
+
|
12
|
+
MrbgemList.new(config)
|
13
|
+
end
|
14
|
+
|
15
|
+
class MrbgemData
|
16
|
+
def initialize(gem_data)
|
17
|
+
@gem_data = gem_data
|
18
|
+
end
|
19
|
+
|
20
|
+
def search(pattern, *fields)
|
21
|
+
fields.flatten!
|
22
|
+
if fields == []
|
23
|
+
fields = [:name, :description, :author, :website]
|
24
|
+
elsif not fields.respond_to? :each
|
25
|
+
fields = [fields]
|
26
|
+
end
|
27
|
+
fields.to_a.each do |field|
|
28
|
+
if self.send(field) =~ /#{pattern}/i
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
|
36
|
+
# list of GEM properties
|
37
|
+
|
38
|
+
def name; @gem_data["name"]; end
|
39
|
+
def description; @gem_data["description"]; end
|
40
|
+
def author; @gem_data["author"]; end
|
41
|
+
def website; @gem_data["website"]; end
|
42
|
+
def protocol; @gem_data["protocol"]; end
|
43
|
+
def repository; @gem_data["repository"]; end
|
44
|
+
|
45
|
+
def method_missing(method_name)
|
46
|
+
err = "Mrbgem Field \"#{method_name}\" doesn't exist!"
|
47
|
+
raise ArgumentError.new err
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class MrbgemList
|
52
|
+
def initialize(config)
|
53
|
+
@config = config
|
54
|
+
@gems = load_gems(@config[:gems_dir])
|
55
|
+
end
|
56
|
+
|
57
|
+
def each(&block)
|
58
|
+
@gems.each {|gem| block.call(gem)}
|
59
|
+
end
|
60
|
+
|
61
|
+
def search(pattern, *fields)
|
62
|
+
@gems.select do |mrbgem|
|
63
|
+
mrbgem.search pattern, fields
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def active
|
68
|
+
f = File.open(@config[:gems_active], 'r+')
|
69
|
+
active_gems = f.each_line.map {|g| File.basename(g.chomp)}
|
70
|
+
@gems.select {|g| active_gems.include? g.name}
|
71
|
+
end
|
72
|
+
|
73
|
+
def size; @gems.size; end
|
74
|
+
|
75
|
+
def activate(gem_name)
|
76
|
+
if check_gem(gem_name)
|
77
|
+
gems = active
|
78
|
+
gems << @gems.select {|g| g.name == gem_name}
|
79
|
+
gems.uniq!
|
80
|
+
save_active_gems(gems)
|
81
|
+
puts "'#{gem_name}' activated!"
|
82
|
+
else
|
83
|
+
puts "'#{gem_name}' NOT activated!"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def deactivate(gem_name)
|
88
|
+
if check_gem(gem_name)
|
89
|
+
gems = active.reject {|g| g.name == gem_name}
|
90
|
+
save_active_gems(gems)
|
91
|
+
puts "'#{gem_name}' deactivated!"
|
92
|
+
else
|
93
|
+
puts "'#{gem_name}' NOT deactivated!"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def check_gem(gem_name)
|
100
|
+
if gem_name == "" or gem_name.nil?
|
101
|
+
puts "Error: Empty GEM name!"
|
102
|
+
false
|
103
|
+
elsif not @gems.find_index {|g| g.name == gem_name}
|
104
|
+
puts "Error: GEM doesn't exist!"
|
105
|
+
false
|
106
|
+
else
|
107
|
+
true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def save_active_gems(active_gem_list)
|
112
|
+
File.open(@config[:gems_active], 'w+') do |f|
|
113
|
+
active_gem_list.flatten.uniq.each do |mrbgem|
|
114
|
+
f.puts "#{@config[:gems_build_dir]}/#{mrbgem.name}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def load_gems(gem_dir)
|
120
|
+
gems = []
|
121
|
+
Dir.foreach(gem_dir) do |filename|
|
122
|
+
next unless filename =~ /\.gem$/
|
123
|
+
|
124
|
+
gems << MrbgemData.new(YAML.load_file("#{gem_dir}/#{filename}"))
|
125
|
+
end
|
126
|
+
gems
|
127
|
+
end
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mgem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Daniel Bovensiepen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: mgem helps you search and find GEMs specifically written for mruby. It also supports by creating a mruby build configuration.
|
15
|
+
email: daniel@bovensiepen.net
|
16
|
+
executables:
|
17
|
+
- mgem
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/mgem
|
22
|
+
- lib/mgem.rb
|
23
|
+
homepage: http://github.com/bovi/mgem
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: !binary |-
|
35
|
+
MA==
|
36
|
+
none: false
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: !binary |-
|
42
|
+
MA==
|
43
|
+
none: false
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.24
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: A program to manage GEMs for mruby.
|
50
|
+
test_files: []
|