cistern 0.3.2 → 0.5.4
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/.travis.yml +13 -0
- data/Gemfile +6 -7
- data/Guardfile +1 -1
- data/{LICENSE → LICENSE.txt} +2 -2
- data/README.md +8 -5
- data/cistern.gemspec +1 -0
- data/lib/cistern/attributes.rb +38 -17
- data/lib/cistern/collection.rb +55 -29
- data/lib/cistern/formatter/awesome_print.rb +1 -1
- data/lib/cistern/formatter/formatador.rb +1 -1
- data/lib/cistern/formatter.rb +0 -1
- data/lib/cistern/mock.rb +2 -2
- data/lib/cistern/model.rb +7 -3
- data/lib/cistern/service.rb +1 -1
- data/lib/cistern/version.rb +1 -1
- data/lib/cistern.rb +2 -1
- data/spec/cistern_spec.rb +8 -14
- data/spec/model_spec.rb +24 -7
- metadata +12 -14
- data/lib/cistern/formatter/default.rb +0 -5
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c39b9ac9a702497cd0fd82279e908697d2d8e65
|
4
|
+
data.tar.gz: 7b9aae264e94c4dd5c5d883a697cf038659be657
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8441ed13d9b55f0f1cf988ec91a47914174388bed261811fa9c4a5d65cea727c8252a65fc1af22b75187f5c044fa1a058c109ed9693efb4ef1606fbfa5039ad1
|
7
|
+
data.tar.gz: 258a085c417051866346609af569a7269d173d8652fae7906bb365884c4d60fb493a9d2d5f9feaab336566a5efc7f9dcc8c2749a5644be336381c28b858932b6
|
data/.travis.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "2.1.1"
|
4
|
+
- "1.9.3"
|
5
|
+
- "jruby-19mode"
|
6
|
+
bundler_args: "--without development"
|
7
|
+
before_install:
|
8
|
+
- "gem install bundler -v 1.5.2"
|
9
|
+
script: "bundle exec rake --trace"
|
10
|
+
notifications:
|
11
|
+
email:
|
12
|
+
on_success: never
|
13
|
+
on_failure: change
|
data/Gemfile
CHANGED
@@ -1,18 +1,17 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
-
# Specify your gem
|
3
|
+
# Specify your gem"s dependencies in cistern.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
6
|
group :test do
|
7
|
-
gem "rspec", "~> 2.0"
|
8
7
|
gem "guard-rspec"
|
8
|
+
gem "pry-nav"
|
9
9
|
gem "rake"
|
10
|
-
gem
|
11
|
-
gem 'pry-nav'
|
10
|
+
gem "rspec", "~> 2.0"
|
12
11
|
end
|
13
12
|
|
14
13
|
group :formatters do
|
15
|
-
gem
|
16
|
-
gem
|
14
|
+
gem "formatador"
|
15
|
+
gem "awesome_print"
|
17
16
|
end
|
18
17
|
|
data/Guardfile
CHANGED
data/{LICENSE → LICENSE.txt}
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c)
|
1
|
+
Copyright (c) 2014 Josh Lane
|
2
2
|
|
3
3
|
MIT License
|
4
4
|
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -90,8 +90,11 @@ class Foo::Client::Bar < Cistern::Model
|
|
90
90
|
}
|
91
91
|
|
92
92
|
if new_record?
|
93
|
-
|
94
|
-
|
93
|
+
merge_attributes(connection.create_bar(params).body["bar"])
|
94
|
+
else
|
95
|
+
requires :identity
|
96
|
+
|
97
|
+
merge_attributes(connection.update_bar(params).body["bar"])
|
95
98
|
end
|
96
99
|
end
|
97
100
|
end
|
@@ -111,10 +114,10 @@ class Foo::Client::Bars < Cistern::Collection
|
|
111
114
|
def all(params = {})
|
112
115
|
response = connection.get_bars(params)
|
113
116
|
|
114
|
-
data =
|
117
|
+
data = response.body
|
115
118
|
|
116
|
-
collection
|
117
|
-
|
119
|
+
self.load(data["bars"]) # store bar records in collection
|
120
|
+
self.merge_attributes(data) # store any other attributes of the response on the collection
|
118
121
|
end
|
119
122
|
|
120
123
|
def discover(provisioned_id, options={})
|
data/cistern.gemspec
CHANGED
@@ -6,6 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["me@joshualane.com"]
|
7
7
|
gem.description = %q{API client framework extracted from Fog}
|
8
8
|
gem.summary = %q{API client framework}
|
9
|
+
gem.license = "MIT"
|
9
10
|
gem.homepage = "http://joshualane.com/cistern"
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
data/lib/cistern/attributes.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Cistern::Attributes
|
2
2
|
def self.parsers
|
3
3
|
@parsers ||= {
|
4
|
-
:string => lambda{|v,opts| v.to_s},
|
5
|
-
:time => lambda{|v,opts| v.is_a?(Time) ? v : v && Time.parse(v.to_s)},
|
6
|
-
:integer => lambda{|v,opts| v && v.to_i},
|
7
|
-
:float => lambda{|v,opts| v && v.to_f},
|
8
|
-
:array => lambda{|v,opts| [*v]},
|
9
|
-
:boolean => lambda{|v,opts| ['true', '1'].include?(v.to_s.downcase)}
|
4
|
+
:string => lambda { |v,opts| v.to_s },
|
5
|
+
:time => lambda { |v,opts| v.is_a?(Time) ? v : v && Time.parse(v.to_s) },
|
6
|
+
:integer => lambda { |v,opts| v && v.to_i },
|
7
|
+
:float => lambda { |v,opts| v && v.to_f },
|
8
|
+
:array => lambda { |v,opts| [*v] },
|
9
|
+
:boolean => lambda { |v,opts| ['true', '1'].include?(v.to_s.downcase) }
|
10
10
|
}
|
11
11
|
end
|
12
12
|
|
@@ -14,7 +14,17 @@ module Cistern::Attributes
|
|
14
14
|
@transforms ||= {
|
15
15
|
:squash => Proc.new do |k, v, options|
|
16
16
|
squash = options[:squash]
|
17
|
-
if v.is_a?(::Hash)
|
17
|
+
if v.is_a?(::Hash) && squash.is_a?(Array)
|
18
|
+
travel = lambda do |tree, path|
|
19
|
+
if tree.is_a?(::Hash)
|
20
|
+
subtree = tree[path.shift]
|
21
|
+
travel.call(subtree, path)
|
22
|
+
else tree
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
travel.call(v, squash.dup)
|
27
|
+
elsif v.is_a?(::Hash)
|
18
28
|
if v.key?(squash.to_s.to_sym)
|
19
29
|
v[squash.to_s.to_sym]
|
20
30
|
elsif v.has_key?(squash.to_s)
|
@@ -25,12 +35,12 @@ module Cistern::Attributes
|
|
25
35
|
else v
|
26
36
|
end
|
27
37
|
end,
|
28
|
-
:none => lambda{|k, v, opts| v},
|
38
|
+
:none => lambda { |k, v, opts| v },
|
29
39
|
}
|
30
40
|
end
|
31
41
|
|
32
42
|
def self.default_parser
|
33
|
-
@default_parser ||= lambda{|v, opts| v}
|
43
|
+
@default_parser ||= lambda { |v, opts| v }
|
34
44
|
end
|
35
45
|
|
36
46
|
module ClassMethods
|
@@ -43,10 +53,12 @@ module Cistern::Attributes
|
|
43
53
|
end
|
44
54
|
|
45
55
|
def attributes
|
46
|
-
@attributes ||=
|
56
|
+
@attributes ||= {}
|
47
57
|
end
|
48
58
|
|
49
|
-
def attribute(
|
59
|
+
def attribute(_name, options = {})
|
60
|
+
name = _name.to_s.to_sym
|
61
|
+
|
50
62
|
parser = Cistern::Attributes.parsers[options[:type]] ||
|
51
63
|
options[:parser] ||
|
52
64
|
Cistern::Attributes.default_parser
|
@@ -62,8 +74,11 @@ module Cistern::Attributes
|
|
62
74
|
attributes[name.to_s.to_sym]= parser.call(transformed, options)
|
63
75
|
end
|
64
76
|
|
65
|
-
|
66
|
-
|
77
|
+
if self.attributes[name]
|
78
|
+
raise(ArgumentError, "#{self.name} attribute[#{_name}] specified more than once")
|
79
|
+
else
|
80
|
+
self.attributes[name] = options
|
81
|
+
end
|
67
82
|
|
68
83
|
Array(options[:aliases]).each do |new_alias|
|
69
84
|
aliases[new_alias] ||= []
|
@@ -113,16 +128,22 @@ module Cistern::Attributes
|
|
113
128
|
end
|
114
129
|
|
115
130
|
def merge_attributes(new_attributes = {})
|
116
|
-
|
131
|
+
new_attributes.each do |key, value|
|
132
|
+
# find nested paths
|
133
|
+
value.is_a?(::Hash) && self.class.attributes.each do |name, options|
|
134
|
+
if (options[:squash] || []).first == key
|
135
|
+
send("#{name}=", {key => value})
|
136
|
+
end
|
137
|
+
end
|
117
138
|
unless self.class.ignored_attributes.include?(key)
|
118
139
|
if self.class.aliases.has_key?(key)
|
119
140
|
self.class.aliases[key].each do |aliased_key|
|
120
141
|
send("#{aliased_key}=", value)
|
121
142
|
end
|
122
|
-
|
143
|
+
end
|
144
|
+
|
145
|
+
if self.respond_to?("#{key}=", true)
|
123
146
|
send("#{key}=", value)
|
124
|
-
else
|
125
|
-
# ignore data: unknown attribute : attributes[key] = value
|
126
147
|
end
|
127
148
|
end
|
128
149
|
end
|
data/lib/cistern/collection.rb
CHANGED
@@ -1,21 +1,14 @@
|
|
1
|
-
class Cistern::Collection
|
1
|
+
class Cistern::Collection
|
2
2
|
extend Cistern::Attributes::ClassMethods
|
3
3
|
include Cistern::Attributes::InstanceMethods
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
end
|
5
|
+
BLACKLISTED_ARRAY_METHODS = [
|
6
|
+
:compact!, :flatten!, :reject!, :reverse!, :rotate!, :map!,
|
7
|
+
:shuffle!, :slice!, :sort!, :sort_by!, :delete_if,
|
8
|
+
:keep_if, :pop, :shift, :delete_at, :compact
|
9
|
+
].to_set # :nodoc:
|
12
10
|
|
13
|
-
|
14
|
-
define_method(method) do
|
15
|
-
lazy_load unless @loaded
|
16
|
-
super()
|
17
|
-
end
|
18
|
-
end
|
11
|
+
attr_accessor :records, :loaded, :connection
|
19
12
|
|
20
13
|
def self.model(new_model=nil)
|
21
14
|
if new_model == nil
|
@@ -25,18 +18,14 @@ class Cistern::Collection < Array
|
|
25
18
|
end
|
26
19
|
end
|
27
20
|
|
28
|
-
attr_accessor :connection
|
29
|
-
|
30
21
|
alias build initialize
|
31
22
|
|
32
23
|
def initialize(attributes = {})
|
33
|
-
@loaded = false
|
34
24
|
merge_attributes(attributes)
|
35
25
|
end
|
36
26
|
|
37
|
-
def
|
38
|
-
|
39
|
-
super
|
27
|
+
def all(identity)
|
28
|
+
raise NotImplementedError
|
40
29
|
end
|
41
30
|
|
42
31
|
def create(attributes={})
|
@@ -47,21 +36,29 @@ class Cistern::Collection < Array
|
|
47
36
|
raise NotImplementedError
|
48
37
|
end
|
49
38
|
|
39
|
+
def clear
|
40
|
+
self.loaded = false
|
41
|
+
records && records.clear
|
42
|
+
end
|
43
|
+
|
50
44
|
def inspect
|
51
|
-
|
52
|
-
|
45
|
+
if Cistern.formatter
|
46
|
+
Cistern.formatter.call(self)
|
47
|
+
else super
|
48
|
+
end
|
53
49
|
end
|
54
50
|
|
55
51
|
# @api private
|
56
|
-
def
|
57
|
-
self.all
|
52
|
+
def load_records
|
53
|
+
self.all unless self.loaded
|
58
54
|
end
|
59
55
|
|
56
|
+
# Should be called within #all to load records into the collection
|
57
|
+
# @param [Array<Hash>] objects list of record attributes to be loaded
|
58
|
+
# @return self
|
60
59
|
def load(objects)
|
61
|
-
|
62
|
-
|
63
|
-
self << new(object)
|
64
|
-
end
|
60
|
+
self.records = (objects || []).map { |object| new(object) }
|
61
|
+
self.loaded = true
|
65
62
|
self
|
66
63
|
end
|
67
64
|
|
@@ -83,7 +80,36 @@ class Cistern::Collection < Array
|
|
83
80
|
|
84
81
|
def reload
|
85
82
|
clear
|
86
|
-
|
83
|
+
load_records
|
87
84
|
self
|
88
85
|
end
|
86
|
+
|
87
|
+
def to_a
|
88
|
+
load_records
|
89
|
+
self.records || []
|
90
|
+
end
|
91
|
+
|
92
|
+
def respond_to?(method, include_private = false)
|
93
|
+
super || array_delegable?(method)
|
94
|
+
end
|
95
|
+
|
96
|
+
def ==(comparison_object)
|
97
|
+
comparison_object.equal?(self) ||
|
98
|
+
(comparison_object.is_a?(self.class) &&
|
99
|
+
comparison_object.to_a == self.to_a)
|
100
|
+
end
|
101
|
+
|
102
|
+
protected
|
103
|
+
|
104
|
+
def array_delegable?(method)
|
105
|
+
Array.method_defined?(method) && !BLACKLISTED_ARRAY_METHODS.include?(method)
|
106
|
+
end
|
107
|
+
|
108
|
+
def method_missing(method, *args, &block)
|
109
|
+
if array_delegable?(method)
|
110
|
+
to_a.public_send(method, *args, &block)
|
111
|
+
else
|
112
|
+
super
|
113
|
+
end
|
114
|
+
end
|
89
115
|
end
|
@@ -32,7 +32,7 @@ module AwesomePrint::Cistern
|
|
32
32
|
# Format Cistern::Model
|
33
33
|
#------------------------------------------------------------------------------
|
34
34
|
def awesome_cistern_collection(object)
|
35
|
-
"#{object.class.name} " <<
|
35
|
+
"#{object.class.name} " << awesome_hash(attributes: object.attributes, records: object.records)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -15,7 +15,7 @@ module Cistern::Formatter::Formatador
|
|
15
15
|
Thread.current[:formatador].indent do
|
16
16
|
unless model.class.attributes.empty?
|
17
17
|
data << "\n#{Thread.current[:formatador].indentation}"
|
18
|
-
data << model.class.attributes.map {|attribute| "#{attribute}=#{model.send(attribute).inspect}"}.join(",\n#{Thread.current[:formatador].indentation}")
|
18
|
+
data << model.class.attributes.map { |attribute, _| "#{attribute}=#{model.send(attribute).inspect}" }.join(",\n#{Thread.current[:formatador].indentation}")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
data << "\n#{Thread.current[:formatador].indentation}>"
|
data/lib/cistern/formatter.rb
CHANGED
data/lib/cistern/mock.rb
CHANGED
data/lib/cistern/model.rb
CHANGED
@@ -5,7 +5,11 @@ class Cistern::Model
|
|
5
5
|
attr_accessor :collection, :connection
|
6
6
|
|
7
7
|
def inspect
|
8
|
-
Cistern.formatter
|
8
|
+
if Cistern.formatter
|
9
|
+
Cistern.formatter.call(self)
|
10
|
+
else
|
11
|
+
"#<#{self.class} #{self.identity}"
|
12
|
+
end
|
9
13
|
end
|
10
14
|
|
11
15
|
def initialize(attributes={})
|
@@ -28,8 +32,8 @@ class Cistern::Model
|
|
28
32
|
|
29
33
|
def ==(comparison_object)
|
30
34
|
comparison_object.equal?(self) ||
|
31
|
-
(comparison_object.is_a?(self.class) &&
|
32
|
-
comparison_object.identity == self.identity &&
|
35
|
+
(comparison_object.is_a?(self.class) &&
|
36
|
+
comparison_object.identity == self.identity &&
|
33
37
|
!comparison_object.new_record?)
|
34
38
|
end
|
35
39
|
|
data/lib/cistern/service.rb
CHANGED
data/lib/cistern/version.rb
CHANGED
data/lib/cistern.rb
CHANGED
data/spec/cistern_spec.rb
CHANGED
@@ -5,25 +5,18 @@ describe "#inspect" do
|
|
5
5
|
identity :id
|
6
6
|
attribute :name
|
7
7
|
end
|
8
|
+
|
8
9
|
class Inspectors < Cistern::Collection
|
10
|
+
|
9
11
|
model Inspector
|
10
12
|
|
11
|
-
def all
|
13
|
+
def all(options={})
|
14
|
+
merge_attributes(options)
|
12
15
|
self.load([{id: 1, name: "2"},{id: 3, name: "4"}])
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
16
|
-
before(:all) do
|
17
|
-
Cistern.formatter = Cistern::Formatter::Default
|
18
|
-
end
|
19
|
-
|
20
19
|
describe "Cistern::Model" do
|
21
|
-
it "should use default" do
|
22
|
-
Cistern.formatter = Cistern::Formatter::Default
|
23
|
-
|
24
|
-
Inspector.new(id: 1, name: "name").inspect.should match /#<Inspector:0x[0-9a-f]+ attributes={id:1,name:\"name\"}/
|
25
|
-
end
|
26
|
-
|
27
20
|
it "should use awesome_print" do
|
28
21
|
Cistern.formatter = Cistern::Formatter::AwesomePrint
|
29
22
|
|
@@ -41,7 +34,8 @@ describe "#inspect" do
|
|
41
34
|
end
|
42
35
|
|
43
36
|
describe "Cistern::Collection" do
|
44
|
-
it "should use
|
37
|
+
it "should use formatador" do
|
38
|
+
Cistern.formatter = Cistern::Formatter::Formatador
|
45
39
|
Inspectors.new.all.inspect.should == %q{ <Inspectors
|
46
40
|
[
|
47
41
|
<Inspector
|
@@ -55,10 +49,10 @@ describe "#inspect" do
|
|
55
49
|
]
|
56
50
|
>}
|
57
51
|
end
|
52
|
+
|
58
53
|
it "should use awesome_print" do
|
59
54
|
Cistern.formatter = Cistern::Formatter::AwesomePrint
|
60
|
-
Inspectors.new.all.inspect.should match(/Inspectors\s
|
55
|
+
Inspectors.new.all.inspect.should match(/Inspectors\s+{.*}$/m) # close enough
|
61
56
|
end
|
62
|
-
it "should use formatador"
|
63
57
|
end
|
64
58
|
end
|
data/spec/model_spec.rb
CHANGED
@@ -28,15 +28,18 @@ describe "Cistern::Model" do
|
|
28
28
|
attribute :list, type: :array
|
29
29
|
attribute :number, type: :integer
|
30
30
|
attribute :floater, type: :float
|
31
|
-
attribute :
|
32
|
-
attribute :
|
31
|
+
attribute :butternut_id, squash: ["squash", "id"], type: :integer
|
32
|
+
attribute :butternut_type, squash: ["squash", "type"]
|
33
|
+
attribute :squash
|
34
|
+
attribute :vegetable, aliases: "squash"
|
35
|
+
attribute :custom, parser: lambda { |v, _| "X!#{v}" }
|
33
36
|
|
34
37
|
attribute :same_alias_1, aliases: "nested"
|
35
38
|
attribute :same_alias_2, aliases: "nested"
|
36
39
|
|
37
|
-
attribute :same_alias_squashed_1,
|
38
|
-
attribute :same_alias_squashed_2,
|
39
|
-
attribute :same_alias_squashed_3,
|
40
|
+
attribute :same_alias_squashed_1, squash: ["nested", "attr_1"]
|
41
|
+
attribute :same_alias_squashed_2, squash: ["nested", "attr_2"]
|
42
|
+
attribute :same_alias_squashed_3, squash: ["nested", "attr_2"]
|
40
43
|
|
41
44
|
def save
|
42
45
|
requires :flag
|
@@ -79,8 +82,22 @@ describe "Cistern::Model" do
|
|
79
82
|
TypeSpec.new(custom: "15").custom.should == "X!15"
|
80
83
|
end
|
81
84
|
|
82
|
-
it "should squash and
|
83
|
-
|
85
|
+
it "should squash, cast, alias an attribute and keep a vanilla reference" do
|
86
|
+
# vanilla squash
|
87
|
+
TypeSpec.new({"squash" => {"id" => "12", "type" => "fred"}}).butternut_type.should == "fred"
|
88
|
+
TypeSpec.new({"squash" => {"id" => "12", "type" => nil}}).butternut_type.should be_nil
|
89
|
+
TypeSpec.new({"squash" => nil}).butternut_type.should be_nil
|
90
|
+
|
91
|
+
# composite processors: squash and cast
|
92
|
+
TypeSpec.new({"squash" => {"id" => "12", "type" => "fred"}}).butternut_id.should == 12
|
93
|
+
TypeSpec.new({"squash" => {"id" => nil, "type" => "fred"}}).butternut_id.should be_nil
|
94
|
+
TypeSpec.new({"squash" => {"type" => "fred"}}).butternut_id.should be_nil
|
95
|
+
|
96
|
+
# override intermediate processing
|
97
|
+
TypeSpec.new({"squash" => {"id" => "12", "type" => "fred"}}).squash.should == {"id" => "12", "type" => "fred"}
|
98
|
+
|
99
|
+
# alias of override
|
100
|
+
TypeSpec.new({"squash" => {"id" => "12", "type" => "fred"}}).vegetable.should == {"id" => "12", "type" => "fred"}
|
84
101
|
end
|
85
102
|
|
86
103
|
context "allowing the same alias for multiple attributes" do
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cistern
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Josh Lane
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: API client framework extracted from Fog
|
15
14
|
email:
|
@@ -18,10 +17,11 @@ executables: []
|
|
18
17
|
extensions: []
|
19
18
|
extra_rdoc_files: []
|
20
19
|
files:
|
21
|
-
- .gitignore
|
20
|
+
- ".gitignore"
|
21
|
+
- ".travis.yml"
|
22
22
|
- Gemfile
|
23
23
|
- Guardfile
|
24
|
-
- LICENSE
|
24
|
+
- LICENSE.txt
|
25
25
|
- README.md
|
26
26
|
- Rakefile
|
27
27
|
- TODO.md
|
@@ -31,7 +31,6 @@ files:
|
|
31
31
|
- lib/cistern/collection.rb
|
32
32
|
- lib/cistern/formatter.rb
|
33
33
|
- lib/cistern/formatter/awesome_print.rb
|
34
|
-
- lib/cistern/formatter/default.rb
|
35
34
|
- lib/cistern/formatter/formatador.rb
|
36
35
|
- lib/cistern/hash.rb
|
37
36
|
- lib/cistern/mock.rb
|
@@ -46,28 +45,28 @@ files:
|
|
46
45
|
- spec/spec_helper.rb
|
47
46
|
- spec/wait_for_spec.rb
|
48
47
|
homepage: http://joshualane.com/cistern
|
49
|
-
licenses:
|
48
|
+
licenses:
|
49
|
+
- MIT
|
50
|
+
metadata: {}
|
50
51
|
post_install_message:
|
51
52
|
rdoc_options: []
|
52
53
|
require_paths:
|
53
54
|
- lib
|
54
55
|
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
56
|
requirements:
|
57
|
-
- -
|
57
|
+
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '0'
|
60
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
61
|
requirements:
|
63
|
-
- -
|
62
|
+
- - ">="
|
64
63
|
- !ruby/object:Gem::Version
|
65
64
|
version: '0'
|
66
65
|
requirements: []
|
67
66
|
rubyforge_project:
|
68
|
-
rubygems_version:
|
67
|
+
rubygems_version: 2.2.2
|
69
68
|
signing_key:
|
70
|
-
specification_version:
|
69
|
+
specification_version: 4
|
71
70
|
summary: API client framework
|
72
71
|
test_files:
|
73
72
|
- spec/cistern_spec.rb
|
@@ -75,4 +74,3 @@ test_files:
|
|
75
74
|
- spec/model_spec.rb
|
76
75
|
- spec/spec_helper.rb
|
77
76
|
- spec/wait_for_spec.rb
|
78
|
-
has_rdoc:
|