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.
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: []