argumenta 0.0.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +5 -0
- data/Rakefile +10 -0
- data/argumenta.gemspec +24 -0
- data/lib/argumenta.rb +19 -0
- data/lib/argumenta/objects.rb +7 -0
- data/lib/argumenta/objects/argument.rb +50 -0
- data/lib/argumenta/objects/proposition.rb +85 -0
- data/lib/argumenta/storage/dht.rb +28 -0
- data/lib/argumenta/version.rb +3 -0
- data/test/objects/test_argument.rb +46 -0
- data/test/objects/test_proposition.rb +52 -0
- data/test/storage/test_dht.rb +40 -0
- data/test/test_argumenta.rb +20 -0
- data/test/test_helper.rb +5 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 70964aabded06f2363085ef1ce7620d8940a7215
|
4
|
+
data.tar.gz: 3af9f7935288a1eb391426e521baadbb23dd40af
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94bd56c3c0a2159fd0fbc215f975e6a3401f7604d0fbb679152b4d82afecfe6d9469e614b196ced5745291b8d7d91679df521332eee7fcd5455b428f00d7a22f
|
7
|
+
data.tar.gz: fd6c2ad24514da4d4eccbb48853e808844a8cd0ffca248e02b43feae39f48c80609cb78e52c9cd71f7f4682472cefe17f1b94116505da3a6143137c0479836c1
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/argumenta.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require './lib/argumenta/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "argumenta"
|
5
|
+
s.version = Argumenta::VERSION
|
6
|
+
s.summary = "Social argument collaboration ~ A Ruby implementation of Argumenta's core library."
|
7
|
+
s.description = ""
|
8
|
+
s.authors = ["Tyler Florez"]
|
9
|
+
s.email = ["qualiabyte@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/argumenta/argumenta"
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split($/)
|
14
|
+
s.executables = `git ls-files -- bin/*`.split($/).map { |f| File.basename(f) }
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split($/)
|
16
|
+
|
17
|
+
s.add_runtime_dependency "celluloid", "= 0.14.1"
|
18
|
+
s.add_runtime_dependency "celluloid-zmq", "= 0.14.0"
|
19
|
+
s.add_runtime_dependency "dcell", "= 0.14.0"
|
20
|
+
s.add_runtime_dependency "http", "= 0.4.0"
|
21
|
+
s.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
s.add_development_dependency "minitest", "~> 4.7.5"
|
23
|
+
s.add_development_dependency "rake"
|
24
|
+
end
|
data/lib/argumenta.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'argumenta/objects'
|
2
|
+
require 'argumenta/storage/dht'
|
3
|
+
require 'argumenta/version'
|
4
|
+
|
5
|
+
module Argumenta
|
6
|
+
include Argumenta::Objects
|
7
|
+
|
8
|
+
# Raised on failure to retrieve stored objects
|
9
|
+
class RetrievalError < Exception; end
|
10
|
+
|
11
|
+
# Raised for invalid objects during validation
|
12
|
+
class ValidationError < Exception; end
|
13
|
+
|
14
|
+
class App
|
15
|
+
def initialize
|
16
|
+
puts "Argumenta " + Argumenta::VERSION
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Argumenta
|
4
|
+
module Objects
|
5
|
+
# An argument includes a title, premises, and conclusion. It has an
|
6
|
+
# associated object record and SHA-1 hash. The object record is
|
7
|
+
# similar to Git's tree. The SHA-1 identifies the argument.
|
8
|
+
class Argument
|
9
|
+
attr_accessor :title, :premises, :conclusion
|
10
|
+
|
11
|
+
# Initializes a new argument.
|
12
|
+
#
|
13
|
+
# title = "My Argument ^_^"
|
14
|
+
# premises = [
|
15
|
+
# "The first premise!",
|
16
|
+
# "The second premise!"
|
17
|
+
# ]
|
18
|
+
# conclusion = "The conclusion."
|
19
|
+
# argument = Argument.new title, premises, conclusion
|
20
|
+
#
|
21
|
+
def initialize(title, premises, conclusion)
|
22
|
+
@title = title
|
23
|
+
@premises = premises.map { |p| Proposition.new p }
|
24
|
+
@conclusion = Proposition.new conclusion
|
25
|
+
end
|
26
|
+
|
27
|
+
# Gets the argument's object record.
|
28
|
+
#
|
29
|
+
# record = argument.record
|
30
|
+
#
|
31
|
+
def record
|
32
|
+
head = "argument\n\n"
|
33
|
+
body = "title #{@title}\n"
|
34
|
+
@premises.each do |p|
|
35
|
+
body += "premise #{p.sha1}\n"
|
36
|
+
end
|
37
|
+
body += "conclusion #{@conclusion.sha1}\n"
|
38
|
+
record = head + body
|
39
|
+
end
|
40
|
+
|
41
|
+
# Gets the argument's SHA-1.
|
42
|
+
#
|
43
|
+
# sha1 = argument.sha1
|
44
|
+
#
|
45
|
+
def sha1
|
46
|
+
Digest::SHA1.hexdigest self.record
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Argumenta
|
4
|
+
module Objects
|
5
|
+
# A proposition models an assertion as a string of text. It has an
|
6
|
+
# associated object record and SHA-1 hash. The object record is
|
7
|
+
# similar to Git's blob. The SHA-1 identifies the proposition.
|
8
|
+
class Proposition
|
9
|
+
attr_accessor :text, :error
|
10
|
+
|
11
|
+
# Initializes a new proposition.
|
12
|
+
#
|
13
|
+
# text = "My proposition!"
|
14
|
+
# proposition = Proposition.new text
|
15
|
+
#
|
16
|
+
def initialize(text)
|
17
|
+
@text = text
|
18
|
+
end
|
19
|
+
|
20
|
+
# Gets the proposition's object record.
|
21
|
+
#
|
22
|
+
# record = proposition.record
|
23
|
+
#
|
24
|
+
def record
|
25
|
+
"proposition " + @text
|
26
|
+
end
|
27
|
+
|
28
|
+
# Gets the proposition's SHA-1.
|
29
|
+
#
|
30
|
+
# sha1 = proposition.sha1
|
31
|
+
#
|
32
|
+
def sha1
|
33
|
+
Digest::SHA1.hexdigest self.record
|
34
|
+
end
|
35
|
+
|
36
|
+
# Validates an object as a proposition.
|
37
|
+
#
|
38
|
+
# valid = Proposition.validate object
|
39
|
+
#
|
40
|
+
# @raise [ValidationError] On failure.
|
41
|
+
def self.validate(object)
|
42
|
+
unless object.is_a? self
|
43
|
+
raise ValidationError "Object must be a proposition."
|
44
|
+
end
|
45
|
+
object.validate
|
46
|
+
end
|
47
|
+
|
48
|
+
# Validates the proposition.
|
49
|
+
#
|
50
|
+
# begin
|
51
|
+
# proposition.validate
|
52
|
+
# rescue Argumenta::ValidationError => err
|
53
|
+
# puts "Validation failed: ", err.message
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# @raise [ValidationError] On validation failure.
|
57
|
+
def validate
|
58
|
+
unless @text.is_a? String
|
59
|
+
raise ValidationError, "Proposition text must be a string."
|
60
|
+
end
|
61
|
+
unless @text.length > 0 and text.match /\S+/
|
62
|
+
raise ValidationError, "Proposition text must not be empty."
|
63
|
+
end
|
64
|
+
unless @text.length <= 240
|
65
|
+
raise ValidationError, "Proposition text must be 240 characters or less."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Checks whether proposition is valid.
|
70
|
+
#
|
71
|
+
# valid = proposition.valid?
|
72
|
+
#
|
73
|
+
# @return [Boolean] The validation status.
|
74
|
+
def valid?
|
75
|
+
begin
|
76
|
+
self.validate
|
77
|
+
return true
|
78
|
+
rescue ValidationError => err
|
79
|
+
@error = err
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'dht/hash'
|
2
|
+
|
3
|
+
module Argumenta
|
4
|
+
module Storage
|
5
|
+
# A DHT data store for Argumenta objects.
|
6
|
+
class DHT
|
7
|
+
attr_accessor :hash
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@hash = ::DHT::Hash.new options
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_proposition(proposition)
|
14
|
+
Argumenta::Proposition.validate proposition
|
15
|
+
sha1 = proposition.sha1()
|
16
|
+
@hash[sha1] = proposition.text
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_proposition(sha1)
|
20
|
+
text = @hash[sha1]
|
21
|
+
unless text
|
22
|
+
raise RetrievalError, "No proposition found for '#{sha1}'."
|
23
|
+
end
|
24
|
+
proposition = Argumenta::Proposition.new text
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'argumenta'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe Argumenta::Argument do
|
5
|
+
before do
|
6
|
+
@title = "My Argument ^_^"
|
7
|
+
@premises = [
|
8
|
+
"The first premise!",
|
9
|
+
"The second premise!"
|
10
|
+
]
|
11
|
+
@conclusion = "The conclusion."
|
12
|
+
@argument = Argumenta::Argument.new @title, @premises, @conclusion
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "initialize" do
|
16
|
+
it "should create a new argument instance" do
|
17
|
+
@argument.must_be_instance_of Argumenta::Argument
|
18
|
+
@argument.title.must_equal "My Argument ^_^"
|
19
|
+
@argument.premises.length.must_equal 2
|
20
|
+
@argument.premises[0].text.must_equal "The first premise!"
|
21
|
+
@argument.premises[1].text.must_equal "The second premise!"
|
22
|
+
@argument.conclusion.text.must_equal "The conclusion."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "record" do
|
27
|
+
it "should get the argument's object record" do
|
28
|
+
record = @argument.record
|
29
|
+
record.must_equal <<-END.gsub(/^ +/, '')
|
30
|
+
argument
|
31
|
+
|
32
|
+
title My Argument ^_^
|
33
|
+
premise 37ca8beaaac1d1b8412c9fb1fd73e524c9862ebe
|
34
|
+
premise 29da59119a5c3cec4f7b339433e8931ea99771cf
|
35
|
+
conclusion 3940b2a6a3d5778297f0e37a06109f9d3dcffe6d
|
36
|
+
END
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "sha1" do
|
41
|
+
it "should get the argument's SHA-1" do
|
42
|
+
sha1 = @argument.sha1
|
43
|
+
sha1.must_equal "50250211801dabf9cbf0e574af270ba2c3fe83cb"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'argumenta'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe Argumenta::Proposition do
|
5
|
+
before do
|
6
|
+
@text = "My proposition!"
|
7
|
+
@proposition = Argumenta::Proposition.new @text
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "initialize" do
|
11
|
+
it "should create a new proposition instance" do
|
12
|
+
@proposition.must_be_instance_of Argumenta::Proposition
|
13
|
+
@proposition.text.must_equal "My proposition!"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "record" do
|
18
|
+
it "should get the proposition's object record" do
|
19
|
+
record = @proposition.record
|
20
|
+
record.must_equal "proposition My proposition!"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "sha1" do
|
25
|
+
it "should get the proposition's SHA-1" do
|
26
|
+
sha1 = @proposition.sha1
|
27
|
+
sha1.must_equal "fe1d2c8da97cd63ff28f9a1a3598fe29def216dd"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "valid?" do
|
32
|
+
it "should return true when valid" do
|
33
|
+
@proposition.valid?.must_equal true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return false when not a string" do
|
37
|
+
proposition = Argumenta::Proposition.new 1
|
38
|
+
proposition.valid?.must_equal false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return false when empty" do
|
42
|
+
proposition = Argumenta::Proposition.new ""
|
43
|
+
proposition.valid?.must_equal false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return false when over max length" do
|
47
|
+
text = "a" * 241
|
48
|
+
proposition = Argumenta::Proposition.new text
|
49
|
+
proposition.valid?.must_equal false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'argumenta'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe Argumenta::Storage::DHT do
|
5
|
+
options = {
|
6
|
+
host: "127.0.0.1",
|
7
|
+
port: 3033,
|
8
|
+
name: "test"
|
9
|
+
}
|
10
|
+
store = Argumenta::Storage::DHT.new options
|
11
|
+
|
12
|
+
before do
|
13
|
+
@store = store
|
14
|
+
@text = "My proposition!"
|
15
|
+
@proposition = Argumenta::Proposition.new @text
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "initialize" do
|
19
|
+
it "should create a new dht storage instance" do
|
20
|
+
@store.must_be_instance_of Argumenta::Storage::DHT
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "add_proposition" do
|
25
|
+
it "should add a proposition to the store" do
|
26
|
+
@store.add_proposition @proposition
|
27
|
+
retrieved = @store.get_proposition @proposition.sha1
|
28
|
+
retrieved.text.must_equal @proposition.text
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "get_proposition" do
|
33
|
+
it "should get a proposition from the store by sha1" do
|
34
|
+
@store.add_proposition @proposition
|
35
|
+
sha1 = @proposition.sha1
|
36
|
+
retrieved = @store.get_proposition sha1
|
37
|
+
retrieved.text.must_equal @proposition.text
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'argumenta'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe Argumenta do
|
5
|
+
it "should have a version string" do
|
6
|
+
Argumenta::VERSION.must_match /^\d+.\d+.\d+$/
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Argumenta::App do
|
11
|
+
before do
|
12
|
+
@app = Argumenta::App.new
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "initialize" do
|
16
|
+
it "should create a new argumenta instance" do
|
17
|
+
@app.must_be_instance_of Argumenta::App
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: argumenta
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tyler Florez
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: celluloid
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.14.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.14.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: celluloid-zmq
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.14.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.14.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dcell
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.14.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.14.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: http
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.4.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.4.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.5'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.7.5
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 4.7.5
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: ''
|
112
|
+
email:
|
113
|
+
- qualiabyte@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- Gemfile
|
120
|
+
- Rakefile
|
121
|
+
- argumenta.gemspec
|
122
|
+
- lib/argumenta.rb
|
123
|
+
- lib/argumenta/objects.rb
|
124
|
+
- lib/argumenta/objects/argument.rb
|
125
|
+
- lib/argumenta/objects/proposition.rb
|
126
|
+
- lib/argumenta/storage/dht.rb
|
127
|
+
- lib/argumenta/version.rb
|
128
|
+
- test/objects/test_argument.rb
|
129
|
+
- test/objects/test_proposition.rb
|
130
|
+
- test/storage/test_dht.rb
|
131
|
+
- test/test_argumenta.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
homepage: https://github.com/argumenta/argumenta
|
134
|
+
licenses:
|
135
|
+
- MIT
|
136
|
+
metadata: {}
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
requirements: []
|
152
|
+
rubyforge_project:
|
153
|
+
rubygems_version: 2.0.3
|
154
|
+
signing_key:
|
155
|
+
specification_version: 4
|
156
|
+
summary: Social argument collaboration ~ A Ruby implementation of Argumenta's core
|
157
|
+
library.
|
158
|
+
test_files: []
|