buzzcore 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,203 @@
1
+ require 'net/http'
2
+ require 'rexml/document'
3
+ require 'rexml/xpath'
4
+ require 'buzzcore/misc_utils'
5
+
6
+ module XmlUtils
7
+
8
+ BASIC_HEADER = '<?xml version="1.0"?>'
9
+
10
+ def self.get_url_root(url)
11
+ xml = Net::HTTP.get(URI(url))
12
+ return nil if !xml
13
+ xdoc = REXML::Document.new(xml)
14
+ return nil if !xdoc
15
+ root = xdoc.root
16
+ end
17
+
18
+ def self.get_xml_root(xml)
19
+ xdoc = REXML::Document.new(xml)
20
+ return nil if !xdoc
21
+ root = xdoc.root
22
+ end
23
+
24
+ def self.get_file_root(aFilename)
25
+ return nil unless File.exists?(aFilename)
26
+ get_xml_root(MiscUtils.string_from_file(aFilename))
27
+ end
28
+
29
+ def self.single_node(node,xpath,default=nil)
30
+ return default if node.nil? || xpath.nil? || xpath==''
31
+ val = REXML::XPath.first(node,xpath)
32
+ return val.nil? ? default : val
33
+ end
34
+
35
+ def self.peek_node(node,xpath,default=nil)
36
+ return default if node.nil? || xpath.nil? || xpath==''
37
+ val = REXML::XPath.first(node,xpath)
38
+ return val.nil? ? default : val.to_s
39
+ end
40
+
41
+ def self.peek_node_value(aNode,aXPath,aDefault=nil)
42
+ node = single_node(aNode,aXPath)
43
+ return node.to_s if node.is_a?(REXML::Attribute)
44
+ return node.nil? ? aDefault : node.text()
45
+ end
46
+
47
+ # convert <root><a>one</a><b>two</b></root> to {'a' => 'one', 'b' => 'two'}
48
+ def self.hash_from_elements(aXMLRoot)
49
+ result = {}
50
+ aXMLRoot.elements.each{|e| result[e.name] = e.text}
51
+ return result
52
+ end
53
+
54
+ # given '<tag a="1" b="2">textblah</tag>' returns {:name=>"tag", :text=>"textblah", "a"=>"1", "b"=>"2"}
55
+ def self.hash_from_tag(aTagString)
56
+ result = {}
57
+ tag = get_xml_root(aTagString)
58
+ return nil if !tag
59
+ tag.attributes.each_attribute {|attr| result[attr.expanded_name] = attr.value }
60
+ result[:name] = tag.name
61
+ result[:text] = tag.text if tag.text
62
+ return result
63
+ end
64
+
65
+ # given {:name=>"tag", :text=>"textblah", "a"=>"1", "b"=>"2"} returns '<tag a="1" b="2">textblah</tag>'
66
+ def self.tag_from_hash(aHash,aName=nil,aText=nil)
67
+ aName ||= aHash[:name]
68
+ aText ||= aHash[:text]
69
+ result = "<#{aName}"
70
+ aHash.each {|k,v| result += " #{k}=\"#{encode(v.to_s)}\"" if k.is_a? String}
71
+ result += aText ? " >#{aText}</#{aName}>" : " />"
72
+ end
73
+
74
+ # returns first node added
75
+ def self.add_xml_from_string(aString,aNode)
76
+ return nil unless xdoc = REXML::Document.new('<?xml version="1.0" encoding="UTF-8"?><root>'+aString+'</root>')
77
+ result = nil
78
+ r = xdoc.root
79
+ while r.has_elements? do
80
+ e = r.delete_element(1)
81
+ result = e unless result
82
+ e.parent = nil
83
+ aNode.add_element(e)
84
+ end
85
+ return result
86
+ end
87
+
88
+ def self.hash_to_xml(aHash,aRootName,aDocHeader=true)
89
+ xdoc = REXML::Document.new(BASIC_HEADER)
90
+ root = xdoc.add_element(aRootName)
91
+ aHash.each do |n,v|
92
+ root.add_element(n).add_text(v)
93
+ end
94
+ return xdoc
95
+ end
96
+
97
+ def self.read_simple_items(aRoot,aParentXPath=nil)
98
+ result = {}
99
+ xp = aParentXPath ? File.join(aParentXPath,'Item') : 'Item'
100
+ REXML::XPath.each(aRoot, xp) do |item|
101
+ result[item.attribute('Name').to_s] = item.text
102
+ end
103
+ return result
104
+ end
105
+
106
+ def self.quick_write_simple_items(aHash,aParent)
107
+ return "<#{aParent} />\n" if !aHash || aHash.empty?
108
+ result = "<#{aParent}>\n"
109
+ aHash.each {|key,value| result += "\t<Item Name=\"#{key.to_s}\">#{value.to_s}</Item>\n" }
110
+ result += "<#{aParent}/>\n"
111
+ return result
112
+ end
113
+
114
+ # reads the simple items format given either a filename or xml node
115
+ def self.read_config_values(aXmlConfig)
116
+ xmlRoot = aXmlConfig.is_a?(REXML::Element) ? aXmlConfig : get_file_root(aXmlConfig)
117
+ return read_simple_items(xmlRoot,'SimpleItems')
118
+ end
119
+
120
+ # Takes a node or xml string and writes it out formatted nicely.
121
+ # aOutput may be given eg. a stream or nil can be given to get a returned string
122
+ def self.format_nicely(aXml,aOutput=nil)
123
+ aXml = REXML::Document.new(aXml) unless aXml.is_a?(REXML::Element)
124
+ f = REXML::Formatters::Pretty.new(2,true)
125
+ f.compact = true
126
+ f.width = 120
127
+ aOutput ||= ''
128
+ f.write(aXml,aOutput)
129
+ return aOutput
130
+ end
131
+
132
+ def self.encode(aString)
133
+ result = aString.clone;
134
+ result.gsub!('&','&amp;')
135
+ result.gsub!('<','&lt;')
136
+ result.gsub!('>','&gt;')
137
+ result.gsub!('"','&quot;')
138
+ result.gsub!("'",'&apos;')
139
+ result.gsub!(/[\x80-\xFF]/) {|c| "&#x#{'%X' % c[0]};"}
140
+ return result
141
+ end
142
+
143
+ def self.hash_to_deflist(aHash,aBuilder=nil)
144
+ aBuilder ||= Builder::XmlMarkup.new(:indent => 2)
145
+ aBuilder.dl do
146
+ aHash.each do |k,v|
147
+ aBuilder.dt(k.to_s)
148
+ aBuilder.dd(v.to_s)
149
+ end
150
+ end
151
+ end
152
+
153
+ def self.data_to_table(aRowHashes,aCaption=nil,aColNames=nil,aBuilder=nil)
154
+ aBuilder ||= Builder::XmlMarkup.new(:indent => 2)
155
+ aBuilder.table do
156
+ if aCaption.is_a? String
157
+ aBuilder.caption(aCaption)
158
+ elsif aCaption.is_a? Hash
159
+ aBuilder.caption do
160
+ XmlUtils.hash_to_deflist(aCaption,aBuilder)
161
+ end
162
+ end
163
+ aColNames ||= aRowHashes.first.keys
164
+ aBuilder.thead do
165
+ aBuilder.tr do
166
+ aColNames.each do |name|
167
+ aBuilder.td(name.to_s)
168
+ end
169
+ end
170
+ end
171
+ aBuilder.tbody do
172
+ aRowHashes.each do |row|
173
+ aBuilder.tr do
174
+ aColNames.each do |name|
175
+ aBuilder.td(row[name].to_s)
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ # given a tag string, extracts the contents of an attribute using only a regex
184
+ def self.quick_att_from_tag(aTagStr,aAtt)
185
+ aTagStr.scan(/#{aAtt}=['"](.*?)['"]/).flatten.pop
186
+ end
187
+
188
+ def self.quick_remove_att(aTagStr,aAtt)
189
+ aTagStr.sub(/#{aAtt}=['"](.*?)['"]/,'')
190
+ end
191
+
192
+ def self.quick_append_att(aTagStr,aAtt,aValue)
193
+ # replace first > or /> with att + ending
194
+ aTagStr.sub(/(>|\/>)/," #{aAtt}=\"#{aValue}\""+' \1')
195
+ end
196
+
197
+ def self.quick_set_att(aTagStr,aAtt,aValue)
198
+ result = quick_remove_att(aTagStr,aAtt)
199
+ quick_append_att(result,aAtt,aValue)
200
+ end
201
+
202
+ end
203
+
data/lib/buzzcore.rb ADDED
@@ -0,0 +1,2 @@
1
+ Dir.chdir(File.dirname(__FILE__)) { Dir['buzzcore/*'] }.each {|f| require f }
2
+
@@ -0,0 +1,6 @@
1
+ # when you want to load the live version of buzzcore, not the gem :
2
+ # require File.join(File.dirname(__FILE__),'../../../../../buzzcore/lib/buzzcore_dev.rb');
3
+ require File.join(File.dirname(__FILE__),'buzzcore/require_paths') # load require_paths early for next line
4
+ require_paths_first '.'
5
+ require 'buzzcore'
6
+
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class BuzzcoreTest < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
@@ -0,0 +1,201 @@
1
+ require 'rubygems'
2
+ require 'buzzcore/misc_utils'
3
+ require 'buzzcore/config'
4
+ require 'buzzcore/shell_extras'
5
+ require 'test/unit'
6
+ gem 'Shoulda'; require 'shoulda'
7
+ require 'fileutils'
8
+
9
+ class ConfigTest < Test::Unit::TestCase
10
+
11
+ #def setup
12
+ # @temp_dir = MiscUtils.make_temp_dir('CredentialsTest')
13
+ # @user_dir = File.join(@temp_dir,'home/fred')
14
+ # FileUtils.mkdir_p(@user_dir)
15
+ # @project_dir = File.join(@temp_dir,'projects/moon')
16
+ # @current_dir = File.join(@project_dir,'source')
17
+ # FileUtils.mkdir_p(@current_dir)
18
+ # ::Credentials.const_set('HOME_PATH',@user_dir)
19
+ #end
20
+
21
+ def config_xml
22
+ return XmlUtils.get_xml_root('<?xml version="1.0" encoding="UTF-8"?><Config></Config>')
23
+ end
24
+
25
+ should "read values of same type as default value classes" do
26
+ xml = config_xml
27
+ # values given of native type
28
+ defaults = {
29
+ :a => String,
30
+ :b => Fixnum,
31
+ :c => Float,
32
+ :d => TrueClass,
33
+ :e => FalseClass,
34
+ }
35
+ values = {
36
+ :a => '1',
37
+ :b => 3,
38
+ :c => 2.3,
39
+ :d => true,
40
+ :e => false,
41
+ }
42
+ config = ConfigClass.new(defaults)
43
+ config.read(values)
44
+ puts config.inspect
45
+ assert_equal config[:a],'1'
46
+ assert_equal config[:b],3
47
+ assert_equal config[:c],2.3
48
+ assert_equal config[:d],true
49
+ assert_equal config[:e],false
50
+ end
51
+
52
+ should "read values of different type as default value classes" do
53
+ xml = config_xml
54
+ # values given of native type
55
+ defaults = {
56
+ :a => String,
57
+ :b => Fixnum,
58
+ :c => Float,
59
+ :d => TrueClass,
60
+ :e => FalseClass,
61
+ }
62
+ values = {
63
+ :a => 1,
64
+ :b => 3.2,
65
+ :c => 2,
66
+ :d => 'false',
67
+ :e => 0,
68
+ }
69
+ config = ConfigClass.new(defaults)
70
+ config.read(values)
71
+ assert_equal config[:a],'1'
72
+ assert_equal config[:b],3
73
+ assert_equal config[:c],2.0
74
+ assert_equal config[:d],false
75
+ assert_equal config[:e],false
76
+ end
77
+
78
+ should "read values when defaults are actual values, and values of correct type" do
79
+ xml = config_xml
80
+ # values given of native type
81
+ defaults = {
82
+ :a => 'X',
83
+ :b => 6,
84
+ :c => 7.8,
85
+ :d => true,
86
+ :e => false,
87
+ }
88
+ values = {
89
+ :a => 'why',
90
+ :b => 3,
91
+ :c => 2.9,
92
+ :d => false,
93
+ :e => true,
94
+ }
95
+ config = ConfigClass.new(defaults)
96
+ config.read(values)
97
+ assert_equal config[:a],'why'
98
+ assert_equal config[:b],3
99
+ assert_equal config[:c],2.9
100
+ assert_equal config[:d],false
101
+ assert_equal config[:e],true
102
+ end
103
+
104
+ should "read values when defaults are actual values, and values of other type" do
105
+ xml = config_xml
106
+ # values given of native type
107
+ defaults = {
108
+ :a => 'X',
109
+ :b => 6,
110
+ :c => 7.8,
111
+ :d => true,
112
+ :e => false,
113
+ }
114
+ values = {
115
+ :a => 123.4,
116
+ :b => '7',
117
+ :c => '9',
118
+ :d => 0,
119
+ :e => 'yes',
120
+ }
121
+ config = ConfigClass.new(defaults)
122
+ config.read(values)
123
+ assert_equal config[:a],'123.4'
124
+ assert_equal config[:b],7
125
+ assert_equal config[:c],9.0
126
+ assert_equal config[:d],false
127
+ assert_equal config[:e],true
128
+ end
129
+
130
+ should "let value defaults through, exclude values not in defaults" do
131
+ xml = config_xml
132
+ # values given of native type
133
+ defaults = {
134
+ :a => 'X',
135
+ :b => 6,
136
+ :c => 7.8,
137
+ :d => true,
138
+ :e => false,
139
+ }
140
+ values = {
141
+ :x => 89
142
+ }
143
+ config = ConfigClass.new(defaults)
144
+ config.read(values)
145
+ assert_equal config[:a],'X'
146
+ assert_equal config[:b],6
147
+ assert_equal config[:c],7.8
148
+ assert_equal config[:d],true
149
+ assert_equal config[:e],false
150
+ assert_equal config[:x],nil
151
+ end
152
+
153
+ should "let value defaults through, exclude values not in defaults" do
154
+ xml = config_xml
155
+ # values given of native type
156
+ defaults = {
157
+ :a => 'X',
158
+ :b => 6,
159
+ :c => 7.8,
160
+ :d => true,
161
+ :e => false,
162
+ }
163
+ values = {
164
+ :x => 89
165
+ }
166
+ config = ConfigClass.new(defaults)
167
+ config.read(values)
168
+ assert_equal config[:a],'X'
169
+ assert_equal config[:b],6
170
+ assert_equal config[:c],7.8
171
+ assert_equal config[:d],true
172
+ assert_equal config[:e],false
173
+ assert_equal config[:x],nil
174
+ end
175
+
176
+ should "let Class defaults through, exclude values not in defaults" do
177
+ xml = config_xml
178
+ # values given of native type
179
+ defaults = {
180
+ :a => String,
181
+ :b => Fixnum,
182
+ :c => Float,
183
+ :d => TrueClass,
184
+ :e => FalseClass,
185
+ }
186
+ values = {
187
+ 'x' => 89,
188
+ :a => 89
189
+ }
190
+ config = ConfigClass.new(defaults)
191
+ config.read(values)
192
+ assert_equal config[:a],'89'
193
+ assert_equal config[:b],nil
194
+ assert_equal config[:c],nil
195
+ assert_equal config[:d],nil
196
+ assert_equal config[:e],nil
197
+ assert_equal config[:x],nil
198
+ end
199
+
200
+
201
+ end
@@ -0,0 +1,71 @@
1
+ require 'rubygems'
2
+ require 'buzzcore/misc_utils'
3
+ require 'buzzcore/config'
4
+ require 'buzzcore/shell_extras'
5
+ require 'test/unit'
6
+ gem 'Shoulda'; require 'shoulda'
7
+ require 'fileutils'
8
+
9
+ class CredentialsTest < Test::Unit::TestCase
10
+
11
+ def setup
12
+ @temp_dir = MiscUtils.make_temp_dir('CredentialsTest')
13
+ @user_dir = File.join(@temp_dir,'home/fred')
14
+ FileUtils.mkdir_p(@user_dir)
15
+ @project_dir = File.join(@temp_dir,'projects/moon')
16
+ @current_dir = File.join(@project_dir,'source')
17
+ FileUtils.mkdir_p(@current_dir)
18
+ ::Credentials.const_set('HOME_PATH',@user_dir)
19
+ end
20
+
21
+ def cred_xml
22
+ return XmlUtils.get_xml_root('<?xml version="1.0" encoding="UTF-8"?><Credentials></Credentials>')
23
+ end
24
+
25
+ def add_namespace_xml(aCredentialsXml,aNamespace,aItems=nil)
26
+ result = XmlUtils.add_xml_from_string("<SimpleItems Namespace=\"#{aNamespace.to_s}\"></SimpleItems>",aCredentialsXml)
27
+ return result unless aItems
28
+ aItems.each do |n,v|
29
+ XmlUtils.add_xml_from_string("<Item Name=\"#{n.to_s}\">#{v.to_s}</Item>",result)
30
+ end
31
+ return result
32
+ end
33
+
34
+ should "read SimpleItems" do
35
+ xml = XmlUtils.get_xml_root('<?xml version="1.0"?><Credentials><SimpleItems Namespace="global"><Item Name="a">5</Item><Item Name="b">hello</Item></SimpleItems></Credentials>')
36
+ si = REXML::XPath.first(xml,'/Credentials/SimpleItems')
37
+ values = XmlUtils.read_simple_items(si)
38
+ assert_equal values['a'],'5'
39
+ assert_equal values['b'],'hello'
40
+ end
41
+
42
+ should "load local credentials file" do
43
+ xml = cred_xml()
44
+ add_namespace_xml(xml.root,:global,{:a=>5,'b'=>'hello'})
45
+ MiscUtils.string_to_file(xml.document.to_s,File.join(@project_dir,Credentials::CRED_FILENAME))
46
+ cred = Credentials.new(:moon,@current_dir)
47
+ assert_equal cred[:a],'5'
48
+ assert_equal cred[:b],'hello'
49
+ end
50
+
51
+ should "load user credentials file" do
52
+ xml = cred_xml()
53
+ add_namespace_xml(xml,:global,{:a=>7,'b'=>'apples'})
54
+ MiscUtils.string_to_file(xml.document.to_s,File.join(@user_dir,Credentials::CRED_FILENAME))
55
+ cred = Credentials.new(:moon,@current_dir)
56
+ assert_equal cred[:a],'7'
57
+ assert_equal cred[:b],'apples'
58
+ end
59
+
60
+ should "specified namespace values should override global, and other namespace doesn't interfere" do
61
+ xml = cred_xml()
62
+ add_namespace_xml(xml,:global,{:a=>1,'b'=>'green'})
63
+ add_namespace_xml(xml,:moon,{'b'=>'red'})
64
+ add_namespace_xml(xml,:blah,{'a'=>'yellow','b'=>20})
65
+ MiscUtils.string_to_file(xml.document.to_s,File.join(@user_dir,Credentials::CRED_FILENAME))
66
+ cred = Credentials.new(:moon,@current_dir)
67
+ assert_equal cred[:a],'1'
68
+ assert_equal cred[:b],'red'
69
+ end
70
+
71
+ end
@@ -0,0 +1,54 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
+
6
+ require 'rubygems'
7
+
8
+ require 'test/unit'
9
+ gem 'Shoulda'; require 'shoulda'
10
+
11
+ require 'buzzcore/shell_extras'
12
+ require 'yore/yore_core'
13
+
14
+ class ShellTest < Test::Unit::TestCase
15
+ should "raise exception on timeout"
16
+
17
+ should "not raise exception on non-zero return code, fixed in block. Check result contents"
18
+
19
+ should "return values from succesfult system call" do
20
+ result = POpen4::shell('ls .')
21
+ assert_instance_of Hash, result
22
+ assert_instance_of String, result[:stdout]
23
+ assert_instance_of String, result[:stderr]
24
+ assert result[:stdout].length > 0
25
+ assert_equal(0, result[:exitcode])
26
+ end
27
+
28
+ context "fail correctly" do
29
+
30
+ should "raise exception on invalid ls" do
31
+ begin
32
+ result = POpen4::shell('ls asdsadasdasdasdasd')
33
+ rescue ::StandardError => e
34
+ assert_instance_of(POpen4::ExecuteError, e)
35
+ assert_equal 1, e.result[:exitcode]
36
+ assert_instance_of String,e.result[:stdout]
37
+ assert_instance_of String,e.result[:stderr]
38
+ return
39
+ end
40
+ flunk 'should have raised an exception'
41
+ end
42
+
43
+ should "not raise exception when fixed in block" do
44
+ result = POpen4::shell('ls asdsadasdasdasdasd') do |r|
45
+ r[:exitcode] = 0
46
+ end
47
+ assert_instance_of Hash, result
48
+ assert_instance_of String, result[:stdout]
49
+ assert_instance_of String, result[:stderr]
50
+ assert_equal(0, result[:exitcode])
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'buzzcore'
8
+
9
+ class Test::Unit::TestCase
10
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buzzcore
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.5
5
+ platform: ruby
6
+ authors:
7
+ - buzzware
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-06 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thoughtbot-shoulda
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: buzzcore is the ruby core library developed and used by Buzzware Solutions.
26
+ email: contact@buzzware.com.au
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - LICENSE
33
+ - README.rdoc
34
+ files:
35
+ - .document
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - VERSION
41
+ - buzzcore.gemspec
42
+ - buzzcore.vpj
43
+ - buzzcore.vpw
44
+ - lib/buzzcore.rb
45
+ - lib/buzzcore/config.rb
46
+ - lib/buzzcore/database_utils.rb
47
+ - lib/buzzcore/enum.rb
48
+ - lib/buzzcore/extend_base_classes.rb
49
+ - lib/buzzcore/html_utils.rb
50
+ - lib/buzzcore/logging.rb
51
+ - lib/buzzcore/misc_utils.rb
52
+ - lib/buzzcore/require_paths.rb
53
+ - lib/buzzcore/shell_extras.rb
54
+ - lib/buzzcore/string_utils.rb
55
+ - lib/buzzcore/text_doc.rb
56
+ - lib/buzzcore/thread_utils.rb
57
+ - lib/buzzcore/xml_utils.rb
58
+ - lib/buzzcore_dev.rb
59
+ - test/buzzcore_test.rb
60
+ - test/config_test.rb
61
+ - test/credentials_test.rb
62
+ - test/shell_test.rb
63
+ - test/test_helper.rb
64
+ has_rdoc: true
65
+ homepage: http://github.com/buzzware/buzzcore
66
+ post_install_message:
67
+ rdoc_options:
68
+ - --charset=UTF-8
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.3.1
87
+ signing_key:
88
+ specification_version: 2
89
+ summary: buzzcore is the ruby core library developed and used by Buzzware Solutions.
90
+ test_files:
91
+ - test/buzzcore_test.rb
92
+ - test/config_test.rb
93
+ - test/credentials_test.rb
94
+ - test/shell_test.rb
95
+ - test/test_helper.rb