nutella_lib 0.2.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6a97fa54cf895d9a462fa41e9359e09956c7187f
4
+ data.tar.gz: 860c5ee47f0dd0204fd8f7d231398c600be38053
5
+ SHA512:
6
+ metadata.gz: ee9c68c86d822abff7772fd226c18cb927291a41dade3a658efb86f226d6f2c6e1fb31600f9c7e00467800430ff194fd2ba071650e0766e2c327a51e88a62b21
7
+ data.tar.gz: 8e4b5f099ccd0f0c17020402880b256785e8ed0ccb5e6e3483136caa5139595275573a15ff66a111f906bd6dc4f1291e9a4e1e57aa260e7006029cc5222d126b
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
4
+ notifications:
5
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'simple_ruby_mqtt_client', '~> 0.2.0', '>= 0.2.0'
4
+
5
+ group :development do
6
+ gem 'shoulda', '~> 3', '>= 3'
7
+ gem 'minitest', '~> 5.4', '>= 5'
8
+ gem "yard", '~> 0.8', '>= 0.8.7'
9
+ gem 'rdoc', '~> 4.0', '>= 4.0'
10
+ gem 'bundler', '~> 1.0', '>= 1.0'
11
+ gem 'jeweler', '~> 2.0.1', '>= 2.0.1'
12
+ gem 'simplecov', '~> 0', '>= 0'
13
+ end
14
+
15
+ group :test do
16
+ gem "rake"
17
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 by The Board of Trustees of the University of Illinois at Chicago
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # nutella_lib.rb [![Build Status](https://travis-ci.org/nutella-framework/nutella_lib.rb.svg)](https://travis-ci.org/nutella-framework/nutella_lib.rb)
2
+ nutella protocol library for ruby
3
+
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "nutella_lib"
18
+ gem.homepage = "https://github.com/nutella-framework/nutella_lib.rb"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{nutella protocol library for ruby}
21
+ gem.description = %Q{Implements the nutella protocol and exposes it natively to ruby developers}
22
+ gem.email = "tebemis@gmail.com"
23
+ gem.authors = ["Alessandro Gnoli"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ desc "Code coverage detail"
36
+ task :simplecov do
37
+ ENV['COVERAGE'] = "true"
38
+ Rake::Task['test'].execute
39
+ end
40
+
41
+ task :default => :test
42
+
43
+ require 'yard'
44
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,26 @@
1
+ require 'nutella_lib/core'
2
+ require 'nutella_lib/net'
3
+ require 'nutella_lib/persist'
4
+
5
+ # Gems used across the whole library
6
+ require 'simple_ruby_mqtt_client'
7
+ require 'json'
8
+ require 'set'
9
+
10
+ # NO_EXT gets defined when you require "nutella_lib/noext", which
11
+ # signals that you don't want any extensions.
12
+ unless defined?(Nutella::NO_EXT)
13
+ require 'nutella_lib/ext/kernel'
14
+ end
15
+
16
+ # Adding a convenience method to the string class
17
+ # to test if it contains properly formatted JSON
18
+ class String
19
+ def is_json?
20
+ begin
21
+ !!JSON.parse(self)
22
+ rescue
23
+ false
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,45 @@
1
+ # This module is the wrapper around the whole nutella library.
2
+ module Nutella
3
+
4
+ # Initializes the nutella library
5
+ def Nutella.init(args)
6
+ if args.length < 2
7
+ STDERR.puts "Couldn't read run_id and broker address from the command line, impossible to initialize library!"
8
+ return
9
+ end
10
+ @run_id = args[0]
11
+ begin
12
+ @actor_name = Nutella.config_actor_name(@run_id)
13
+ rescue
14
+ STDERR.puts "Couldn't find nutella.json file, impossible to initialize library!"
15
+ return
16
+ end
17
+ @mqtt = SimpleMQTTClient.new(args[1], @actor_name)
18
+ end
19
+
20
+
21
+ # Accessors for module instance variables
22
+ def Nutella.run_id; @run_id end
23
+ def Nutella.actor_name; @actor_name end
24
+ def Nutella.mqtt; @mqtt end
25
+
26
+
27
+ # Nutella library modules loading
28
+ def Nutella.net; Nutella::Net end
29
+ def Nutella.persist; Nutella::Persist end
30
+
31
+
32
+ private
33
+
34
+ # Extracts the actor name from nutella.json file and appends it to the run_id
35
+ def Nutella.config_actor_name (run_id)
36
+ h = JSON.parse( IO.read( "nutella.json" ) )
37
+ full_actor_name = run_id + '_' + h["name"]
38
+ full_actor_name[0, 23]
39
+ end
40
+
41
+ end
42
+
43
+
44
+
45
+
@@ -0,0 +1,7 @@
1
+ module Kernel
2
+
3
+ def nutella
4
+ Nutella
5
+ end
6
+
7
+ end
@@ -0,0 +1,194 @@
1
+ module Nutella
2
+
3
+ # This class implements the pub/sub nutella protocol
4
+ # @author Alessandro Gnoli <tebemis@gmail.com>
5
+ module Net
6
+
7
+ # Subscribe to a channel
8
+ # The callback takes one parameter and that is the message that is received.
9
+ # Messages that are not JSON are discarded.
10
+ def Net.subscribe (channel, callback)
11
+ # Pad the channel
12
+ new_channel = Nutella.run_id + '/' + channel
13
+ # Subscribe
14
+ Nutella.mqtt.subscribe(new_channel, lambda do |message|
15
+ # Make sure the message is JSON, if not drop the message
16
+ begin
17
+ message_hash = JSON.parse(message)
18
+ callback.call(message_hash)
19
+ rescue
20
+ return
21
+ end
22
+ end)
23
+ end
24
+
25
+ # Unsubscribe from a channel
26
+ def Net.unsubscribe(channel)
27
+ # Pad the channel
28
+ new_channel = Nutella.run_id + '/' + channel
29
+ # Unsubscribe
30
+ Nutella.mqtt.unsubscribe(new_channel)
31
+ end
32
+
33
+ # Publishes a message to a channel
34
+ # Message can be:
35
+ # empty (equivalent of a GET)
36
+ # string (the string will be wrapped into a JSON string automatically. Format: {"payload":"<message>"})
37
+ # hash (the hash will be converted into a JSON string automatically)
38
+ # json string (the JSON string will be sent as is)
39
+ def Net.publish(channel, message)
40
+ # Pad the channel
41
+ new_channel = Nutella.run_id + '/' + channel
42
+ # Publish
43
+ begin
44
+ m = Net.prepare_message_for_publish(message)
45
+ Nutella.mqtt.publish(new_channel, m)
46
+ rescue
47
+ STDERR.puts $!
48
+ end
49
+ end
50
+
51
+ # Performs a synchronous request
52
+ # Message can be:
53
+ # empty (equivalent of a GET)
54
+ # string (the string will be wrapped into a JSON string automatically. Format: {"payload":"<message>"})
55
+ # hash (the hash will be converted into a JSON string automatically)
56
+ # json string (the JSON string will be sent as is)
57
+ def Net.sync_req (channel, message="")
58
+ # Generate message unique id
59
+ id = message.hash
60
+ # Attach id
61
+ begin
62
+ payload = Net.attach_message_id(message, id)
63
+ rescue
64
+ STDERR.puts $!
65
+ return
66
+ end
67
+ # Initialize response and response counter
68
+ ready_to_go = 2
69
+ response = nil
70
+ # Subscribe to same channel to collect response
71
+ Net.subscribe(channel, lambda do |res|
72
+ if (res["id"]==id)
73
+ ready_to_go -= 1
74
+ if ready_to_go==0
75
+ Net.unsubscribe(channel)
76
+ response = res
77
+ end
78
+ end
79
+ end)
80
+ # Send message the message
81
+ Net.publish(channel, payload)
82
+ # Wait for the response to come back
83
+ sleep(0.5) until ready_to_go==0
84
+ response
85
+ end
86
+
87
+ # Performs an asynchronosus request
88
+ # Message can be:
89
+ # empty (equivalent of a GET)
90
+ # string (the string will be wrapped into a JSON string automatically. Format: {"payload":"<message>"})
91
+ # hash (the hash will be converted into a JSON string automatically)
92
+ # json string (the JSON string will be sent as is)
93
+ def Net.async_req (channel, message="", callback)
94
+ # Generate message unique id
95
+ id = message.hash
96
+ # Attach id
97
+ begin
98
+ payload = Net.attach_message_id(message, id)
99
+ rescue
100
+ STDERR.puts $!
101
+ return
102
+ end
103
+ # Initialize flag that prevents handling of our own messages
104
+ ready_to_go = false
105
+ # Register callback to handle data the request response whenever it comes
106
+ Net.subscribe(channel, lambda do |res|
107
+ # Check that the message we receive is not the one we are sending ourselves.
108
+ if res["id"]==id
109
+ if ready_to_go
110
+ Net.unsubscribe(channel)
111
+ callback.call(res)
112
+ else
113
+ ready_to_go = true
114
+ end
115
+ end
116
+ end)
117
+ # Send message
118
+ Net.publish(channel, payload)
119
+ end
120
+
121
+ # Handles requests on a certain channel
122
+ def Net.handle_requests (channel, &handler)
123
+ Net.subscribe(channel, lambda do |req|
124
+ # Ignore anything that doesn't have an id (i.e. not requests)
125
+ id = req["id"]
126
+ if id.nil?
127
+ return
128
+ end
129
+ # Ignore recently processed requests
130
+ if @last_requests.nil?
131
+ @last_requests = Set.new
132
+ end
133
+ if @last_requests.include?(id)
134
+ @last_requests.delete(id)
135
+ return
136
+ end
137
+ @last_requests.add(id)
138
+ req.delete("id")
139
+ res = handler.call(req)
140
+ begin
141
+ res_and_id = attach_message_id(res, id)
142
+ Net.publish(channel, res_and_id)
143
+ rescue
144
+ STDERR.puts 'When handling a request you need to return JSON'
145
+ end
146
+ end)
147
+ end
148
+
149
+
150
+ def Net.listen
151
+ begin
152
+ sleep
153
+ rescue Interrupt
154
+ # Simply returns
155
+ end
156
+ end
157
+
158
+
159
+ private
160
+
161
+ def Net.attach_message_id (message, id)
162
+ if message.is_a?(Hash)
163
+ message[:id] = id
164
+ payload = message.to_json
165
+ elsif message.is_json?
166
+ p = JSON.parse(message)
167
+ p[:id] = id
168
+ payload = p.to_json
169
+ elsif message.is_a?(String)
170
+ payload = { :payload => message, :id => id }.to_json
171
+ else
172
+ raise 'Your request is not JSON!'
173
+ end
174
+ payload
175
+ end
176
+
177
+ def Net.prepare_message_for_publish (message)
178
+ if message.is_a?(Hash)
179
+ message[:from] = Nutella.actor_name
180
+ payload = message.to_json
181
+ elsif message.is_json?
182
+ p = JSON.parse(message)
183
+ p[:from] = Nutella.actor_name
184
+ payload = p.to_json
185
+ elsif message.is_a?(String)
186
+ payload = { :payload => message, :from => Nutella.actor_name }.to_json
187
+ else
188
+ raise 'You are trying to publish something that is not JSON!'
189
+ end
190
+ payload
191
+ end
192
+
193
+ end
194
+ end
@@ -0,0 +1,6 @@
1
+ class Nutella
2
+ # Signals that we should not load the extensions.
3
+ NO_EXT = true
4
+ end
5
+
6
+ require 'nutella_lib'
@@ -0,0 +1,63 @@
1
+ require 'json'
2
+ require 'pstore'
3
+
4
+ module Nutella
5
+
6
+ module Persist
7
+
8
+ # This module exposes a single method to retrieve a JSONStore
9
+ def Persist.getJsonStore(file_name)
10
+ JSONStore.new(file_name)
11
+ end
12
+
13
+ end
14
+
15
+ # JSONStore provides the same functionality as PStore, except it uses JSON
16
+ # to dump objects instead of Marshal.
17
+ # Example use:
18
+ # store = nutella.persist.getJsonStore("json_store/json_test.json")
19
+ # # Write
20
+ # store.transaction { store["key"]="value" }
21
+ # # Read
22
+ # value = store.transaction { store["key"] }
23
+ # puts value # prints "value"
24
+ # # Dump the whole store
25
+ # hash = store.transaction { store.to_h }
26
+ # p hash # prints {"key" => "value"}
27
+
28
+ class JSONStore < PStore
29
+
30
+ def dump(table)
31
+ table.to_json
32
+ end
33
+
34
+ def load(content)
35
+ JSON.parse(content)
36
+ end
37
+
38
+ # Dumps the whole store to hash
39
+ # example:
40
+ # store = JSONStore.new("my_file.json")
41
+ # hash = store.transaction { store.to_h }
42
+ def to_h
43
+ @table
44
+ end
45
+
46
+ def marshal_dump_supports_canonical_option?
47
+ false
48
+ end
49
+
50
+ EMPTY_MARSHAL_DATA = {}.to_json
51
+ EMPTY_MARSHAL_CHECKSUM = Digest::MD5.digest(EMPTY_MARSHAL_DATA)
52
+ def empty_marshal_data
53
+ EMPTY_MARSHAL_DATA
54
+ end
55
+ def empty_marshal_checksum
56
+ EMPTY_MARSHAL_CHECKSUM
57
+ end
58
+ end
59
+
60
+
61
+ end
62
+
63
+
@@ -0,0 +1,77 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: nutella_lib 0.2.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "nutella_lib"
9
+ s.version = "0.2.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
13
+ s.authors = ["Alessandro Gnoli"]
14
+ s.date = "2014-11-12"
15
+ s.description = "Implements the nutella protocol and exposes it natively to ruby developers"
16
+ s.email = "tebemis@gmail.com"
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.md"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".travis.yml",
24
+ "Gemfile",
25
+ "LICENSE",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "lib/nutella_lib.rb",
30
+ "lib/nutella_lib/core.rb",
31
+ "lib/nutella_lib/ext/kernel.rb",
32
+ "lib/nutella_lib/net.rb",
33
+ "lib/nutella_lib/noext.rb",
34
+ "lib/nutella_lib/persist.rb",
35
+ "nutella_lib.gemspec",
36
+ "test/helper.rb",
37
+ "test/test_nutella_lib.rb"
38
+ ]
39
+ s.homepage = "https://github.com/nutella-framework/nutella_lib.rb"
40
+ s.licenses = ["MIT"]
41
+ s.rubygems_version = "2.2.2"
42
+ s.summary = "nutella protocol library for ruby"
43
+
44
+ if s.respond_to? :specification_version then
45
+ s.specification_version = 4
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<simple_ruby_mqtt_client>, [">= 0.2.0", "~> 0.2.0"])
49
+ s.add_development_dependency(%q<shoulda>, [">= 3", "~> 3"])
50
+ s.add_development_dependency(%q<minitest>, [">= 5", "~> 5.4"])
51
+ s.add_development_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
52
+ s.add_development_dependency(%q<rdoc>, [">= 4.0", "~> 4.0"])
53
+ s.add_development_dependency(%q<bundler>, [">= 1.0", "~> 1.0"])
54
+ s.add_development_dependency(%q<jeweler>, [">= 2.0.1", "~> 2.0.1"])
55
+ s.add_development_dependency(%q<simplecov>, [">= 0", "~> 0"])
56
+ else
57
+ s.add_dependency(%q<simple_ruby_mqtt_client>, [">= 0.2.0", "~> 0.2.0"])
58
+ s.add_dependency(%q<shoulda>, [">= 3", "~> 3"])
59
+ s.add_dependency(%q<minitest>, [">= 5", "~> 5.4"])
60
+ s.add_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
61
+ s.add_dependency(%q<rdoc>, [">= 4.0", "~> 4.0"])
62
+ s.add_dependency(%q<bundler>, [">= 1.0", "~> 1.0"])
63
+ s.add_dependency(%q<jeweler>, [">= 2.0.1", "~> 2.0.1"])
64
+ s.add_dependency(%q<simplecov>, [">= 0", "~> 0"])
65
+ end
66
+ else
67
+ s.add_dependency(%q<simple_ruby_mqtt_client>, [">= 0.2.0", "~> 0.2.0"])
68
+ s.add_dependency(%q<shoulda>, [">= 3", "~> 3"])
69
+ s.add_dependency(%q<minitest>, [">= 5", "~> 5.4"])
70
+ s.add_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
71
+ s.add_dependency(%q<rdoc>, [">= 4.0", "~> 4.0"])
72
+ s.add_dependency(%q<bundler>, [">= 1.0", "~> 1.0"])
73
+ s.add_dependency(%q<jeweler>, [">= 2.0.1", "~> 2.0.1"])
74
+ s.add_dependency(%q<simplecov>, [">= 0", "~> 0"])
75
+ end
76
+ end
77
+
data/test/helper.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'simplecov'
2
+
3
+ module SimpleCov::Configuration
4
+ def clean_filters
5
+ @filters = []
6
+ end
7
+ end
8
+
9
+ SimpleCov.configure do
10
+ clean_filters
11
+ load_profile 'test_frameworks'
12
+ end
13
+
14
+ ENV["COVERAGE"] && SimpleCov.start do
15
+ add_filter "/.rvm/"
16
+ end
17
+ require 'rubygems'
18
+ require 'bundler'
19
+ begin
20
+ Bundler.setup(:default, :development)
21
+ rescue Bundler::BundlerError => e
22
+ $stderr.puts e.message
23
+ $stderr.puts "Run `bundle install` to install missing gems"
24
+ exit e.status_code
25
+ end
26
+ require 'minitest/autorun'
27
+
28
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
29
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
30
+ require 'nutella_lib'
31
+
32
+ class MiniTest::Test
33
+ end
34
+
35
+ MiniTest.autorun
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class TestNutellaLib < MiniTest::Test
4
+
5
+ # def test_that_kernel_extension_works
6
+ # assert_instance_of Nutella::Core, nutella
7
+ # end
8
+
9
+ # def test_core_module_method_call
10
+ # nutella.hello "Ruby"
11
+ # end
12
+
13
+
14
+ # tests for sync/asynch_Req
15
+ # v = nutella.net.sync_req("quakes_schedule", '{"stringa":"json"}')
16
+ # v = nutella.net.sync_req("quakes_schedule", "messaggio")
17
+ # v = nutella.net.sync_req("quakes_schedule", {})
18
+ # v = nutella.net.sync_req("quakes_schedule", {:cane => "dio"})
19
+ # v = nutella.net.sync_req("quakes_schedule")
20
+
21
+
22
+ end
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nutella_lib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Alessandro Gnoli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: simple_ruby_mqtt_client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.2.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.2.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: shoulda
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3'
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '3'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3'
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '3'
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '5'
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '5.4'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '5'
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '5.4'
73
+ - !ruby/object:Gem::Dependency
74
+ name: yard
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.8.7
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.8'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.7
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '0.8'
93
+ - !ruby/object:Gem::Dependency
94
+ name: rdoc
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '4.0'
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '4.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '4.0'
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '4.0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: bundler
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '1.0'
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '1.0'
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1.0'
133
+ - !ruby/object:Gem::Dependency
134
+ name: jeweler
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 2.0.1
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: 2.0.1
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 2.0.1
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 2.0.1
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ description: Implements the nutella protocol and exposes it natively to ruby developers
174
+ email: tebemis@gmail.com
175
+ executables: []
176
+ extensions: []
177
+ extra_rdoc_files:
178
+ - LICENSE
179
+ - README.md
180
+ files:
181
+ - ".document"
182
+ - ".travis.yml"
183
+ - Gemfile
184
+ - LICENSE
185
+ - README.md
186
+ - Rakefile
187
+ - VERSION
188
+ - lib/nutella_lib.rb
189
+ - lib/nutella_lib/core.rb
190
+ - lib/nutella_lib/ext/kernel.rb
191
+ - lib/nutella_lib/net.rb
192
+ - lib/nutella_lib/noext.rb
193
+ - lib/nutella_lib/persist.rb
194
+ - nutella_lib.gemspec
195
+ - test/helper.rb
196
+ - test/test_nutella_lib.rb
197
+ homepage: https://github.com/nutella-framework/nutella_lib.rb
198
+ licenses:
199
+ - MIT
200
+ metadata: {}
201
+ post_install_message:
202
+ rdoc_options: []
203
+ require_paths:
204
+ - lib
205
+ required_ruby_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ required_rubygems_version: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ requirements: []
216
+ rubyforge_project:
217
+ rubygems_version: 2.2.2
218
+ signing_key:
219
+ specification_version: 4
220
+ summary: nutella protocol library for ruby
221
+ test_files: []