glue 0.0.1 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +19 -0
- data/INSTALL +56 -0
- data/README +3 -0
- data/Rakefile +73 -10
- data/doc/AUTHORS +16 -0
- data/doc/LICENSE +33 -0
- data/doc/RELEASES +5 -0
- data/install.rb +47 -0
- data/lib/glue.rb +57 -59
- data/lib/glue/array.rb +61 -0
- data/lib/glue/attribute.rb +83 -0
- data/lib/glue/cache.rb +138 -0
- data/lib/glue/flexob.rb +12 -0
- data/lib/glue/hash.rb +122 -0
- data/lib/glue/inflector.rb +91 -0
- data/lib/glue/logger.rb +147 -0
- data/lib/glue/misc.rb +14 -0
- data/lib/glue/mixins.rb +36 -0
- data/lib/glue/number.rb +24 -0
- data/lib/glue/object.rb +32 -0
- data/lib/glue/pool.rb +60 -0
- data/lib/glue/property.rb +408 -0
- data/lib/glue/string.rb +162 -0
- data/lib/glue/time.rb +85 -0
- data/lib/glue/validation.rb +461 -0
- data/test/glue/tc_attribute.rb +22 -0
- data/test/glue/tc_cache.rb +45 -0
- data/test/glue/tc_hash.rb +38 -0
- data/test/glue/tc_logger.rb +39 -0
- data/test/glue/tc_numbers.rb +20 -0
- data/test/glue/tc_property.rb +91 -0
- data/test/glue/tc_property_mixins.rb +93 -0
- data/test/glue/tc_property_type_checking.rb +35 -0
- data/test/glue/tc_strings.rb +103 -0
- data/test/glue/tc_validation.rb +214 -0
- metadata +95 -89
- data/History.txt +0 -6
- data/Manifest.txt +0 -7
- data/README.txt +0 -127
- data/bin/glue +0 -1
- data/test/test_glue.rb +0 -218
@@ -0,0 +1,214 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'glue'
|
6
|
+
require 'glue/property'
|
7
|
+
require 'glue/validation'
|
8
|
+
|
9
|
+
N::Property.type_checking = false
|
10
|
+
|
11
|
+
class TC_Validation < Test::Unit::TestCase # :nodoc: all
|
12
|
+
|
13
|
+
# Override the default error message
|
14
|
+
N::Validation::Errors.invalid_format = 'INVALID'
|
15
|
+
|
16
|
+
module Mixin
|
17
|
+
prop_accessor :value, String
|
18
|
+
validate_format :value, :format => /123/, :msg => 'mixin error'
|
19
|
+
end
|
20
|
+
|
21
|
+
class User
|
22
|
+
include Mixin
|
23
|
+
|
24
|
+
prop_accessor :name, String
|
25
|
+
validate_format :name, :format => /L.o/, :msg => 'per class override'
|
26
|
+
end
|
27
|
+
|
28
|
+
class Article
|
29
|
+
prop_accessor :name, String
|
30
|
+
validate_format :name, :format => /news/
|
31
|
+
end
|
32
|
+
|
33
|
+
class Dummy1
|
34
|
+
prop_accessor :test, Fixnum
|
35
|
+
prop_accessor :str, String
|
36
|
+
validate_value :test, :str
|
37
|
+
end
|
38
|
+
|
39
|
+
class Dummy2
|
40
|
+
prop_accessor :password, String
|
41
|
+
validate_confirmation :password
|
42
|
+
end
|
43
|
+
|
44
|
+
class Dummy3
|
45
|
+
prop_accessor :vmin, String
|
46
|
+
validate_length :vmin, :min => 2
|
47
|
+
|
48
|
+
prop_accessor :vmax, String
|
49
|
+
validate_length :vmax, :max => 3, :msg => 'LOOONG'
|
50
|
+
|
51
|
+
prop_accessor :vran, String
|
52
|
+
validate_length :vran, :range => 2..4, :msg_long => 'argh'
|
53
|
+
|
54
|
+
prop_accessor :vlen, String
|
55
|
+
validate_length :vlen, :length => 3, :msg => 'argh'
|
56
|
+
end
|
57
|
+
|
58
|
+
class Dummy4
|
59
|
+
prop_accessor :sex, String
|
60
|
+
validate_inclusion :sex, :in => %w{ Male Female }, :msg => 'huh?'
|
61
|
+
|
62
|
+
prop_accessor :age, Fixnum
|
63
|
+
validate_inclusion :age, :in => 5..99
|
64
|
+
end
|
65
|
+
|
66
|
+
class Dummy5
|
67
|
+
property :age, Fixnum
|
68
|
+
validate_numeric :age, :integer => true
|
69
|
+
|
70
|
+
property :rate, Float
|
71
|
+
validate_numeric :rate
|
72
|
+
end
|
73
|
+
|
74
|
+
# bug
|
75
|
+
|
76
|
+
class NoProp
|
77
|
+
include Mixin
|
78
|
+
validate_length :value, :min => 3
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_validate_value
|
82
|
+
d = Dummy1.new
|
83
|
+
|
84
|
+
assert !d.valid?
|
85
|
+
assert_equal 2, d.errors.count
|
86
|
+
d.test = 1
|
87
|
+
assert !d.valid?
|
88
|
+
assert_equal 1, d.errors.count
|
89
|
+
d.str = 'yeah'
|
90
|
+
assert d.valid?
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_validate_confirmation
|
94
|
+
d = Dummy2.new
|
95
|
+
|
96
|
+
assert_respond_to d, :password_confirmation
|
97
|
+
|
98
|
+
d.password = 'hello'
|
99
|
+
assert !d.valid?
|
100
|
+
d.password_confirmation = 'hel'
|
101
|
+
assert !d.valid?
|
102
|
+
d.password_confirmation = 'hello'
|
103
|
+
assert d.valid?
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_validate_format
|
107
|
+
u = User.new
|
108
|
+
|
109
|
+
u.value = '1234'
|
110
|
+
|
111
|
+
u.name = 'George'
|
112
|
+
assert !u.valid?
|
113
|
+
|
114
|
+
assert_equal 'per class override', u.errors[:name].first
|
115
|
+
|
116
|
+
u.name = 'Leonard'
|
117
|
+
assert u.valid?
|
118
|
+
|
119
|
+
a = Article.new
|
120
|
+
|
121
|
+
a.name = 'In the news'
|
122
|
+
assert a.valid?
|
123
|
+
|
124
|
+
a.name = 'Sports'
|
125
|
+
assert !a.valid?
|
126
|
+
|
127
|
+
assert_equal 1, a.errors.count
|
128
|
+
assert_equal 1, a.errors.on(:name).size
|
129
|
+
assert_kind_of Array, a.errors[:name]
|
130
|
+
|
131
|
+
assert_equal 'INVALID', a.errors[:name].first
|
132
|
+
|
133
|
+
# test mixin
|
134
|
+
|
135
|
+
u.value = '543'
|
136
|
+
assert !u.valid?
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_validate_length
|
140
|
+
d = Dummy3.new
|
141
|
+
|
142
|
+
d.vmin = 'q'
|
143
|
+
d.vmax = '2'
|
144
|
+
d.vlen = '123'
|
145
|
+
d.vran = '123'
|
146
|
+
|
147
|
+
assert !d.valid?
|
148
|
+
assert_equal 'Too short, must be more than 2 characters long', d.errors.on(:vmin).first
|
149
|
+
d.vmin = 'longer'
|
150
|
+
assert d.valid?
|
151
|
+
|
152
|
+
d.vmax = 'loooooooooooong'
|
153
|
+
assert !d.valid?
|
154
|
+
assert_equal 'LOOONG', d.errors.on(:vmax).first
|
155
|
+
|
156
|
+
d.vmax = nil
|
157
|
+
assert !d.valid?
|
158
|
+
assert_equal 'No value provided', d.errors.on(:vmax).first
|
159
|
+
|
160
|
+
d.vlen = '12'
|
161
|
+
assert !d.valid?
|
162
|
+
assert_equal 'argh', d.errors.on(:vlen).first
|
163
|
+
|
164
|
+
d.vlen = '1234565'
|
165
|
+
assert !d.valid?
|
166
|
+
|
167
|
+
d.vran = '1'
|
168
|
+
assert !d.valid?
|
169
|
+
assert_equal 'Too short, must be more than 2 characters long', d.errors.on(:vran).first
|
170
|
+
|
171
|
+
d.vran = '11111111'
|
172
|
+
assert !d.valid?
|
173
|
+
assert_equal 'argh', d.errors.on(:vran).first
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_validate_inclusion
|
177
|
+
d = Dummy4.new
|
178
|
+
|
179
|
+
d.sex = 'Alien'
|
180
|
+
d.age = 1
|
181
|
+
|
182
|
+
assert !d.valid?
|
183
|
+
assert_equal 2, d.errors.count
|
184
|
+
|
185
|
+
d.sex = 'Male'
|
186
|
+
assert !d.valid?
|
187
|
+
assert_equal 1, d.errors.count
|
188
|
+
|
189
|
+
d.age = 110
|
190
|
+
assert !d.valid?
|
191
|
+
assert_equal 1, d.errors.count
|
192
|
+
|
193
|
+
d.age = 90
|
194
|
+
assert d.valid?
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_validate_numeric
|
198
|
+
d = Dummy5.new
|
199
|
+
|
200
|
+
d.rate = 'Alien'
|
201
|
+
d.age = 'World'
|
202
|
+
|
203
|
+
assert !d.valid?
|
204
|
+
assert_equal 2, d.errors.count
|
205
|
+
|
206
|
+
d.rate = 3
|
207
|
+
assert !d.valid?
|
208
|
+
assert_equal 1, d.errors.count
|
209
|
+
|
210
|
+
d.rate = 1.2
|
211
|
+
d.age = 123
|
212
|
+
assert d.valid?
|
213
|
+
end
|
214
|
+
end
|
metadata
CHANGED
@@ -1,97 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.8
|
3
|
+
specification_version: 1
|
2
4
|
name: glue
|
3
5
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
version: 0.13.0
|
7
|
+
date: 2005-03-17
|
8
|
+
summary: Glue utilities
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: gm@navel.gr
|
12
|
+
homepage: http://nitro.rubyforge.org
|
13
|
+
rubyforge_project: nitro
|
14
|
+
description: A collection of utilities and useful classes
|
15
|
+
autorequire: glue
|
13
16
|
default_executable:
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: httparty
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: mocha
|
27
|
-
type: :development
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: "0"
|
34
|
-
version:
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: hoe
|
37
|
-
type: :development
|
38
|
-
version_requirement:
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 1.12.2
|
44
|
-
version:
|
45
|
-
description: |-
|
46
|
-
The Glue gem enables posting to GlueNow.com API service using an account subdomain, username, password. In this version you can add a post by providing a title, body, optional author name and optional private settings. You can also access some basic info about a users account and check if their account info is valid.
|
47
|
-
|
48
|
-
You can also request public posts from an account using the same RSS that powers the many Glue feeds.
|
49
|
-
email:
|
50
|
-
- jordan.dobson@madebysquad.com
|
51
|
-
executables:
|
52
|
-
- glue
|
53
|
-
extensions: []
|
54
|
-
|
55
|
-
extra_rdoc_files:
|
56
|
-
- History.txt
|
57
|
-
- Manifest.txt
|
58
|
-
- README.txt
|
59
|
-
files:
|
60
|
-
- History.txt
|
61
|
-
- Manifest.txt
|
62
|
-
- README.txt
|
63
|
-
- Rakefile
|
64
|
-
- bin/glue
|
65
|
-
- lib/glue.rb
|
66
|
-
- test/test_glue.rb
|
17
|
+
bindir: bin
|
67
18
|
has_rdoc: true
|
68
|
-
|
69
|
-
licenses: []
|
70
|
-
|
71
|
-
post_install_message:
|
72
|
-
rdoc_options:
|
73
|
-
- --main
|
74
|
-
- README.txt
|
75
|
-
require_paths:
|
76
|
-
- lib
|
77
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: "0"
|
82
|
-
version:
|
83
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
84
20
|
requirements:
|
85
|
-
|
86
|
-
|
87
|
-
|
21
|
+
-
|
22
|
+
- ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.8.1
|
88
25
|
version:
|
26
|
+
platform: ruby
|
27
|
+
authors:
|
28
|
+
- George Moschovitis
|
29
|
+
files:
|
30
|
+
- Rakefile
|
31
|
+
- INSTALL
|
32
|
+
- CHANGELOG
|
33
|
+
- README
|
34
|
+
- install.rb
|
35
|
+
- doc/LICENSE
|
36
|
+
- doc/AUTHORS
|
37
|
+
- doc/RELEASES
|
38
|
+
- lib/glue.rb
|
39
|
+
- lib/glue
|
40
|
+
- lib/glue/mixins.rb
|
41
|
+
- lib/glue/logger.rb
|
42
|
+
- lib/glue/pool.rb
|
43
|
+
- lib/glue/inflector.rb
|
44
|
+
- lib/glue/hash.rb
|
45
|
+
- lib/glue/number.rb
|
46
|
+
- lib/glue/time.rb
|
47
|
+
- lib/glue/property.rb
|
48
|
+
- lib/glue/misc.rb
|
49
|
+
- lib/glue/flexob.rb
|
50
|
+
- lib/glue/cache.rb
|
51
|
+
- lib/glue/string.rb
|
52
|
+
- lib/glue/object.rb
|
53
|
+
- lib/glue/array.rb
|
54
|
+
- lib/glue/validation.rb
|
55
|
+
- lib/glue/attribute.rb
|
56
|
+
- test/glue
|
57
|
+
- test/glue/tc_strings.rb
|
58
|
+
- test/glue/tc_property_type_checking.rb
|
59
|
+
- test/glue/tc_logger.rb
|
60
|
+
- test/glue/tc_validation.rb
|
61
|
+
- test/glue/tc_property.rb
|
62
|
+
- test/glue/tc_hash.rb
|
63
|
+
- test/glue/tc_attribute.rb
|
64
|
+
- test/glue/tc_property_mixins.rb
|
65
|
+
- test/glue/tc_cache.rb
|
66
|
+
- test/glue/tc_numbers.rb
|
67
|
+
test_files: []
|
68
|
+
rdoc_options:
|
69
|
+
- "--main"
|
70
|
+
- README
|
71
|
+
- "--title"
|
72
|
+
- Glue Documentation
|
73
|
+
- "--all"
|
74
|
+
- "--inline-source"
|
75
|
+
extra_rdoc_files:
|
76
|
+
- Rakefile
|
77
|
+
- INSTALL
|
78
|
+
- CHANGELOG
|
79
|
+
- README
|
80
|
+
executables: []
|
81
|
+
extensions: []
|
89
82
|
requirements: []
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
-
|
83
|
+
dependencies:
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: extensions
|
86
|
+
version_requirement:
|
87
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
88
|
+
requirements:
|
89
|
+
-
|
90
|
+
- ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: "0.5"
|
93
|
+
version:
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: flexmock
|
96
|
+
version_requirement:
|
97
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
98
|
+
requirements:
|
99
|
+
-
|
100
|
+
- ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.0.3
|
103
|
+
version:
|
data/History.txt
DELETED
data/Manifest.txt
DELETED
data/README.txt
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
= glue
|
2
|
-
|
3
|
-
http://Glue.RubyForge.org
|
4
|
-
|
5
|
-
http://GlueNow.com
|
6
|
-
|
7
|
-
== DESCRIPTION:
|
8
|
-
|
9
|
-
The Glue gem enables posting to GlueNow.com API service using an account subdomain, username, password. In this version you can add a post by providing a title, body, optional author name and optional private settings. You can also access some basic info about a users account and check if their account info is valid.
|
10
|
-
|
11
|
-
You can also request public posts from an account using the same RSS that powers the many Glue feeds.
|
12
|
-
|
13
|
-
== FEATURES/PROBLEMS:
|
14
|
-
|
15
|
-
* To Add a new post Title & Body text must be included
|
16
|
-
* Access info about an account with successful login:
|
17
|
-
* Email Address
|
18
|
-
* If they are an admin
|
19
|
-
* Thier Author Name
|
20
|
-
* Can check if a subdomain is valid and belongs to an account
|
21
|
-
* Read all public posts
|
22
|
-
* This Gem is throughly tested
|
23
|
-
* Adding & Reading posts Only at this time
|
24
|
-
* You can't editor delete a posts yet
|
25
|
-
* No way to verify if a post has accepted the author name yet
|
26
|
-
|
27
|
-
|
28
|
-
== SYNOPSIS:
|
29
|
-
|
30
|
-
1. Instantiate your account
|
31
|
-
|
32
|
-
* Provide the subdomain, username and password for http://Your-Account.GlueNow.com
|
33
|
-
|
34
|
-
account = Glue::API.new( "your-account", "j-username", "j-password" )
|
35
|
-
|
36
|
-
2. Check if the account subdomain is valid
|
37
|
-
|
38
|
-
account.valid_site?
|
39
|
-
|
40
|
-
3. Get more info about the user's account
|
41
|
-
|
42
|
-
response = account.user_info
|
43
|
-
|
44
|
-
response #=> {"rsp"=>{"user"=>{"author"=>"Jordan Dobson","admin"=>"true","email"=>"jordandobson@gmail.com"},"stat"=>"ok"}}
|
45
|
-
|
46
|
-
4. Post your Content
|
47
|
-
|
48
|
-
* Both Title and Body are required - Set to a variable to check the response
|
49
|
-
|
50
|
-
response = account.post("My Title", "My Body")
|
51
|
-
|
52
|
-
* You can also choose to set the post as private and/or use the optional Author Name
|
53
|
-
* In this example we set false for not private and true to use the author name
|
54
|
-
|
55
|
-
response = account.post("My Title", "My Body", false, true)
|
56
|
-
|
57
|
-
|
58
|
-
5. Get a success or error hash back
|
59
|
-
|
60
|
-
* A Successful response would look like this
|
61
|
-
|
62
|
-
response #=> {"rsp"=>{"post"=>{"title"=>"My Title","url"=>"http://bit.ly/sakIM","id"=>"14415","longurl"=>"http://jordandobson.com"},"stat"=>"ok"}}
|
63
|
-
|
64
|
-
* A Error response would be empty like this
|
65
|
-
|
66
|
-
response #=> {}
|
67
|
-
|
68
|
-
----
|
69
|
-
|
70
|
-
1. Instantiate your Reader with your account info
|
71
|
-
|
72
|
-
* Provide the subdomain for http://Your-Account.GlueNow.com
|
73
|
-
|
74
|
-
account = Glue::RSS.new( "your-account" )
|
75
|
-
|
76
|
-
2. Request posts from the RSS feed
|
77
|
-
|
78
|
-
* If you want all of them don't include any limiting or range. Defaults to up to 999 posts on one page
|
79
|
-
|
80
|
-
response = account.feed
|
81
|
-
|
82
|
-
* If you want to limit the results include a limit (1-999) and which page (used for paging)
|
83
|
-
|
84
|
-
response = account.feed(10, 3)
|
85
|
-
|
86
|
-
3. Get an RSS feed back or HTML page - These Examples are simplified to include most important nodes
|
87
|
-
|
88
|
-
* A successful RSS response would look like
|
89
|
-
|
90
|
-
response #=> {"rss"=>{"channel"=>{"item"=>{"pubDate"=>"Fri, 12 Sep 2008 00:00:00 +0000","title"=>"My Title","guid"=>"http://jordandobson.com#14415","dc:creator"=>"Jordan","description"=>"<p>My Body</p>","link"=>"http://jordandobson.com","source"=>"Glue"}}}}
|
91
|
-
|
92
|
-
* A failed HTML responsed would look like
|
93
|
-
|
94
|
-
response #=> {"html"=>{"head"=>{"title"=>"GLUE | Web + Mobile Content Publishing"},"body"=>"<p>Webpage Body</p>"}}
|
95
|
-
|
96
|
-
== REQUIREMENTS:
|
97
|
-
|
98
|
-
* Mechanize & HTTParty
|
99
|
-
|
100
|
-
== INSTALL:
|
101
|
-
|
102
|
-
* sudo gem install glue -include-dependencies
|
103
|
-
|
104
|
-
== LICENSE:
|
105
|
-
|
106
|
-
(The MIT License)
|
107
|
-
|
108
|
-
Copyright (c) 2009 Squad, Inc.
|
109
|
-
|
110
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
111
|
-
a copy of this software and associated documentation files (the
|
112
|
-
'Software'), to deal in the Software without restriction, including
|
113
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
114
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
115
|
-
permit persons to whom the Software is furnished to do so, subject to
|
116
|
-
the following conditions:
|
117
|
-
|
118
|
-
The above copyright notice and this permission notice shall be
|
119
|
-
included in all copies or substantial portions of the Software.
|
120
|
-
|
121
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
122
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
123
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
124
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
125
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
126
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
127
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|