mgem 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/mgem +69 -0
  2. data/lib/mgem.rb +128 -0
  3. 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: []