contentful_model 0.1.7.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2d355e60fd1a5df73ff632025fd2a2fecfbc4ce
4
- data.tar.gz: 44795c690dd5d6142240f7944b178ed76f9bc087
3
+ metadata.gz: cb158dcb23427ac8201185b1201a237ba7dfa0a5
4
+ data.tar.gz: 7f4e3ac0d68637daf9bb60662c85476ea6e8916a
5
5
  SHA512:
6
- metadata.gz: 24758869403fb3fccda9b0e97ba2c6186e2a33780d8afdc8cae11b726a251912bc2d59b4c60576a07db52504929410786a09e8ae00c487a14a744ccdd48e3e71
7
- data.tar.gz: d39706301c823988bf8fa76da208fd65fcd1c5aefc85a8704aa37262cbff1d162d9500df9e4b9bad72a276d44c2b1d810ba8d1b407e00c6e2eb8fb6853eab97e
6
+ metadata.gz: 6a69c4da7a8cb02d67af7e4685bcff46f363d4fe63137d30a6a554f7d6c464314ae5980ea3bd2955d61145ee1120b5235675059e5e25c11b2ea986648b983017
7
+ data.tar.gz: a6b37e8649735c82a5ee6f7439291ceb45b21597e3fc8c0dfe0edf8b483b963af10c07f38a5f2272c876bf9cd4ec2ef1e8419c544379964ccaa2f847077a9ed4
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2014 Error Creative Studio
1
+ Copyright 2014 Error Creative Studio, Contentful GmbH
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,4 +1,5 @@
1
1
  require 'require_all'
2
+ require 'contentful/management'
2
3
  require 'contentful'
3
4
  require_rel '.'
4
5
 
@@ -23,7 +24,9 @@ module ContentfulModel
23
24
  attr_accessor :access_token,
24
25
  :preview_access_token,
25
26
  :space,
26
- :entry_mapping
27
+ :entry_mapping,
28
+ :management_token,
29
+ :default_locale
27
30
 
28
31
  def initialize
29
32
  @entry_mapping ||= {}
@@ -1,19 +1,41 @@
1
1
  module ContentfulModel
2
- class Base < Contentful::Entry
2
+ class Base < Contentful::DynamicEntry
3
3
  include ContentfulModel::ChainableQueries
4
4
  include ContentfulModel::Associations
5
5
  include ContentfulModel::Validations
6
+ include ContentfulModel::Manageable
6
7
 
7
8
  def initialize(*args)
8
9
  super
10
+ define_getters
9
11
  self.class.coercions ||= {}
10
12
  end
11
13
 
14
+ private
15
+
16
+ def define_getters
17
+ fields.each do |k, v|
18
+ if Contentful::Constants::KNOWN_LOCALES.include?(k.to_s)
19
+ v.keys.each do |name|
20
+ define_getter(name)
21
+ end
22
+ else
23
+ define_getter(k)
24
+ end
25
+ end
26
+ end
27
+
28
+ def define_getter(name)
29
+ define_singleton_method "#{name.to_s.underscore}" do
30
+ fields(default_locale)[name]
31
+ end
32
+ end
33
+
12
34
  #use method_missing to call fields on the model
13
35
  def method_missing(method, *args, &block)
14
36
  result = fields[:"#{method.to_s.camelize(:lower)}"]
15
37
  # we need to pull out any Contentful::Link references, and also things which don't have any fields at all
16
- # because they're newly created (we think exposing these in the Contentful API is a bug, actually)
38
+ # because they're newly created
17
39
  if result.is_a?(Array)
18
40
  result.reject! {|r| r.is_a?(Contentful::Link) || (r.respond_to?(:invalid) && r.invalid?)}
19
41
  elsif result.is_a?(Contentful::Link)
@@ -24,8 +46,6 @@ module ContentfulModel
24
46
  result = nil
25
47
  end
26
48
 
27
-
28
-
29
49
  if result.nil?
30
50
  # if self.class.rescue_from_no_attribute_fields.member?()
31
51
  # end
@@ -66,15 +86,8 @@ module ContentfulModel
66
86
  end
67
87
 
68
88
  "#{self.class.to_s.underscore}/#{self.id}-#{self.updated_at.utc.to_s(:number)}"
69
-
70
- end
71
-
72
- def save
73
- raise NotImplementedError, "Saving models isn't implemented; we need to use the Contentful Management API for that. Pull requests welcome!"
74
89
  end
75
90
 
76
- alias_method :create, :save
77
-
78
91
  class << self
79
92
  attr_accessor :content_type_id, :coercions, :return_nil_for_empty_attribute_fields
80
93
 
@@ -84,7 +97,7 @@ module ContentfulModel
84
97
 
85
98
  def add_entry_mapping
86
99
  unless ContentfulModel.configuration.entry_mapping.has_key?(@content_type_id)
87
- ContentfulModel.configuration.entry_mapping[@content_type_id] = Object.const_get(self.to_s.to_sym)
100
+ ContentfulModel.configuration.entry_mapping[@content_type_id] = self.to_s.constantize
88
101
  end
89
102
  end
90
103
 
@@ -96,7 +109,6 @@ module ContentfulModel
96
109
  else
97
110
  @client ||= ContentfulModel::Client.new(ContentfulModel.configuration.to_hash)
98
111
  end
99
-
100
112
  end
101
113
 
102
114
  def content_type
@@ -115,7 +127,7 @@ module ContentfulModel
115
127
  @return_nil_for_empty_attribute_fields ||= []
116
128
 
117
129
  fields.each do |field|
118
- define_method field do
130
+ define_method field do
119
131
  begin
120
132
  super()
121
133
  rescue ContentfulModel::AttributeNotFoundError
@@ -126,13 +138,6 @@ module ContentfulModel
126
138
  @return_nil_for_empty_attribute_fields.push(field)
127
139
  end
128
140
  end
129
-
130
141
  end
131
-
132
-
133
-
134
-
135
-
136
-
137
142
  end
138
143
  end
@@ -8,7 +8,12 @@ module ContentfulModel
8
8
  module ClassMethods
9
9
 
10
10
  def all
11
- raise ArgumentError, "You need to set self.content_type in your model class" if @content_type_id.nil?
11
+ raise ArgumentError, 'You need to set self.content_type in your model class' if @content_type_id.nil?
12
+ self
13
+ end
14
+
15
+ def params(options)
16
+ @query << options
12
17
  self
13
18
  end
14
19
 
@@ -27,6 +32,16 @@ module ContentfulModel
27
32
  self
28
33
  end
29
34
 
35
+ def locale(locale_code)
36
+ @query << {'locale' => locale_code}
37
+ self
38
+ end
39
+
40
+ def load_children(n)
41
+ @query << {'include' => n}
42
+ self
43
+ end
44
+
30
45
  def order(args)
31
46
  prefix = ''
32
47
  if args.is_a?(Hash)
@@ -35,6 +50,8 @@ module ContentfulModel
35
50
  elsif args.is_a?(Symbol)
36
51
  column = args.to_s
37
52
  prefix = ''
53
+ else
54
+ column = args.to_s
38
55
  end
39
56
  @query << {'order' => "#{prefix}fields.#{column.camelize(:lower)}"}
40
57
  self
@@ -47,7 +64,7 @@ module ContentfulModel
47
64
  #query is a hash
48
65
  if query.values.first.is_a?(Array) #we need to do an 'in' query
49
66
  @query << {"fields.#{query.keys.first.to_s.camelize(:lower)}[in]" => query.values.first.join(",")}
50
- elsif query.values.first.is_a?(String) || [TrueClass,FalseClass].member?(query.values.first.class)
67
+ elsif query.values.first.is_a?(String) || query.values.first.is_a?(Numeric) || [TrueClass,FalseClass].member?(query.values.first.class)
51
68
  @query << {"fields.#{query.keys.first.to_s.camelize(:lower)}" => query.values.first}
52
69
  elsif query.values.first.is_a?(Hash)
53
70
  # if the search is a hash, use the key to specify the search field operator
@@ -65,7 +82,15 @@ module ContentfulModel
65
82
  def search(parameters)
66
83
  if parameters.is_a?(Hash)
67
84
  parameters.each do |field, search|
68
- @query << {"fields.#{field.to_s.camelize(:lower)}[match]" => search}
85
+ # if the search is a hash, use the key to specify the search field operator
86
+ # For example
87
+ # Model.search(start_date: {gte: DateTime.now}) => "fields.start_date[gte]" => DateTime.now
88
+ if search.is_a?(Hash)
89
+ search_key, search_value = *search.flatten
90
+ @query << {"fields.#{field.to_s.camelize(:lower)}[#{search_key}]" => search_value}
91
+ else
92
+ @query << {"fields.#{field.to_s.camelize(:lower)}[match]" => search}
93
+ end
69
94
  end
70
95
  elsif parameters.is_a?(String)
71
96
  @query << {"query" => parameters}
@@ -8,7 +8,7 @@ module ContentfulModel
8
8
  configuration[:api_url] = PREVIEW_API_URL
9
9
  configuration[:access_token] = configuration[:preview_access_token]
10
10
  end
11
- super(configuration)
11
+ super({ raise_errors: true, dynamic_entries: :auto }.merge(configuration))
12
12
  end
13
13
  end
14
- end
14
+ end
@@ -1,4 +1,5 @@
1
1
  module ContentfulModel
2
2
  class AssociationError < StandardError; end
3
- class AttributeNotFoundError < StandardError; end
4
- end
3
+ class VersionMismatchError < StandardError; end
4
+ class AttributeNotFoundError < NoMethodError; end
5
+ end
@@ -0,0 +1,135 @@
1
+ module ContentfulModel
2
+ module Manageable
3
+ attr_reader :dirty
4
+
5
+ def initialize(*args)
6
+ super
7
+ @dirty = false
8
+ @changed_fields = []
9
+ define_setters
10
+ end
11
+
12
+ def to_management(entry_to_update = management_entry)
13
+ published_entry = self.class.client.entry(id)
14
+ fields.each do |field, value|
15
+ entry_to_update.send(
16
+ "#{field.to_s.underscore}=",
17
+ management_field_value(
18
+ @changed_fields.include?(field) ? value : published_entry.send(field.to_s.underscore)
19
+ )
20
+ )
21
+ end
22
+
23
+ entry_to_update
24
+ end
25
+
26
+ def refetch_management_entry
27
+ @management_entry = fetch_management_entry
28
+ end
29
+
30
+ def save
31
+ begin
32
+ to_management.save
33
+ rescue Contentful::Management::Conflict
34
+ # Retries with re-fetched entry
35
+ to_management(refetch_management_entry).save
36
+ end
37
+
38
+ @dirty = false
39
+ @changed_fields = []
40
+
41
+ self
42
+ rescue Contentful::Management::Conflict
43
+ fail ContentfulModel::VersionMismatchError, "Version Mismatch persisting after refetch attempt, use :refetch_management_entry and try again later."
44
+ end
45
+
46
+ def publish
47
+ begin
48
+ to_management.publish
49
+ rescue Contentful::Management::Conflict
50
+ to_management(refetch_management_entry).save
51
+ end
52
+
53
+ self
54
+ rescue Contentful::Management::Conflict
55
+ fail ContentfulModel::VersionMismatchError, "Version Mismatch persisting after refetch attempt, use :refetch_management_entry and try again later."
56
+ end
57
+
58
+ private
59
+
60
+ def management_space
61
+ @management_space ||= self.class.management(default_locale: locale).spaces.find(space.id)
62
+ end
63
+
64
+ def fetch_management_entry
65
+ management_space.entries.find(id)
66
+ end
67
+
68
+ def management_entry
69
+ # Fetches always in case of Version changes to avoid Validation errors
70
+ @management_entry ||= fetch_management_entry
71
+ end
72
+
73
+ def define_setters
74
+ fields.each do |k, v|
75
+ if Contentful::Constants::KNOWN_LOCALES.include?(k.to_s)
76
+ v.keys.each do |name|
77
+ define_setter(name)
78
+ end
79
+ else
80
+ define_setter(k)
81
+ end
82
+ end
83
+ end
84
+
85
+ def define_setter(name)
86
+ define_singleton_method "#{name.to_s.underscore}=" do |value|
87
+ @dirty = true
88
+ @changed_fields << name
89
+ fields(default_locale)[name] = value
90
+ end
91
+ end
92
+
93
+ def management_field_value(entry_value)
94
+ case entry_value
95
+ when Contentful::Entry
96
+ Contentful::Management::Entry.hash_with_link_object('Entry', entry_value)
97
+ when Contentful::Asset
98
+ Contentful::Management::Entry.hash_with_link_object('Asset', entry_value)
99
+ when Contentful::Link
100
+ Contentful::Management::Entry.hash_with_link_object(entry_value.sys[:contentType], entry_value)
101
+ else
102
+ entry_value
103
+ end
104
+ end
105
+
106
+ module ClassMethods
107
+ def management(options = {})
108
+ @management ||= ContentfulModel::Management.new(
109
+ options.merge(default_locale: ContentfulModel.configuration.default_locale)
110
+ )
111
+ end
112
+
113
+ def create(values = {}, publish = false)
114
+ entry = management.entries.create(
115
+ management.content_types.find(
116
+ ContentfulModel.configuration.space,
117
+ content_type_id
118
+ ),
119
+ values
120
+ )
121
+
122
+ if publish
123
+ entry.publish
124
+ entry = self.find(entry.id)
125
+ end
126
+
127
+ entry
128
+ end
129
+ end
130
+
131
+ def self.included(base)
132
+ base.extend(ClassMethods)
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,7 @@
1
+ module ContentfulModel
2
+ class Management < Contentful::Management::Client
3
+ def initialize(options = {})
4
+ super(ContentfulModel.configuration.management_token, options)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,127 @@
1
+ module ContentfulModel
2
+ module Migrations
3
+ class ContentType
4
+ def initialize(name = nil, management_content_type = nil)
5
+ @name = name
6
+ @management_content_type = management_content_type
7
+ end
8
+
9
+ def save
10
+ if new?
11
+ @management_content_type = management.content_types.create(
12
+ ContentfulModel.configuration.space,
13
+ name: @name,
14
+ fields: fields
15
+ )
16
+ else
17
+ @management_content_type.fields = @fields
18
+ @management_content_type.save
19
+ end
20
+
21
+ self
22
+ end
23
+
24
+ def publish
25
+ return self if new?
26
+
27
+ @management_content_type.publish
28
+
29
+ self
30
+ end
31
+
32
+ def field(name, type)
33
+ name = name.to_s
34
+ type = type.to_s
35
+
36
+ new_field = Contentful::Management::Field.new
37
+ new_field.id = name.split(' ').map(&:capitalize).join('').underscore
38
+ new_field.name = name
39
+ new_field.type = management_type(type)
40
+ new_field.link_type = management_link_type(type) if link?(type)
41
+ new_field.items = management_items(type) if array?(type)
42
+
43
+ fields << new_field
44
+
45
+ new_field
46
+ end
47
+
48
+ def remove_field(field_id)
49
+ @management_content_type.fields.destroy(field_id)
50
+ end
51
+
52
+ def new?
53
+ @management_content_type.nil? || @management_content_type.id.nil?
54
+ end
55
+
56
+ def fields
57
+ if new?
58
+ return @fields ||= []
59
+ else
60
+ return @fields ||= fields_from_management_type
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def fields_from_management_type
67
+ @management_content_type.fields
68
+ end
69
+
70
+ def management_type(type)
71
+ if [
72
+ :text, :symbol,
73
+ :integer, :number,
74
+ :date, :boolean,
75
+ :location, :object
76
+ ].include?(type.to_sym)
77
+ return type.capitalize
78
+ elsif type == 'string'
79
+ return 'Symbol'
80
+ elsif link?(type)
81
+ return 'Link'
82
+ elsif array?(type)
83
+ return 'Array'
84
+ else
85
+ raise_field_type_error(type)
86
+ end
87
+ end
88
+
89
+ def management_link_type(type)
90
+ if [:entry_link, :asset_link].include?(type.to_sym)
91
+ return type.split('_').first.capitalize
92
+ else
93
+ raise_field_type_error(type)
94
+ end
95
+ end
96
+
97
+ def management_items(type)
98
+ if [:entry_array, :asset_array].include?(type.to_sym)
99
+ items = Contentful::Management::Field.new
100
+ items.type = 'Link'
101
+ items.link_type = type.split('_').first.capitalize
102
+
103
+ return items
104
+ else
105
+ raise_field_type_error(type)
106
+ end
107
+ end
108
+
109
+ def link?(type)
110
+ type.end_with?('_link')
111
+ end
112
+
113
+ def array?(type)
114
+ type.end_with?('_array')
115
+ end
116
+
117
+ def management
118
+ @management ||= ContentfulModel::Management.new
119
+ end
120
+
121
+ def raise_field_type_error(type)
122
+ fail ContentfulModel::Migrations::InvalidFieldTypeError, "`:#{type}' is not a valid Field Type"
123
+ end
124
+ end
125
+ end
126
+ end
127
+
@@ -0,0 +1,27 @@
1
+ module ContentfulModel
2
+ module Migrations
3
+ module ContentTypeFactory
4
+ def self.create(name, fields = {}, &block)
5
+ content_type = ContentfulModel::Migrations::ContentType.new(name)
6
+
7
+ yield(content_type) if block_given?
8
+
9
+ fields.each do |name, type|
10
+ content_type.field(name, type)
11
+ end
12
+
13
+ content_type.save
14
+ end
15
+
16
+ def self.find(content_type_id)
17
+ ContentfulModel::Migrations::ContentType.new(
18
+ nil,
19
+ ContentfulModel::Management.new.content_types.find(
20
+ ContentfulModel.configuration.space,
21
+ content_type_id
22
+ )
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ module ContentfulModel
2
+ module Migrations
3
+ class InvalidFieldTypeError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ module ContentfulModel
2
+ module Migrations
3
+ module Migration
4
+ def create_content_type(name, fields = {}, &block)
5
+ ContentfulModel::Migrations::ContentTypeFactory.create(name, fields, &block)
6
+ end
7
+
8
+ def add_content_type_field(content_type_id, name, type)
9
+ content_type = ContentfulModel::Migrations::ContentTypeFactory.find(content_type_id)
10
+
11
+ content_type.field(name, type)
12
+
13
+ content_type.save
14
+ end
15
+
16
+ def remove_content_type_field(content_type_id, field_id)
17
+ content_type = ContentfulModel::Migrations::ContentTypeFactory.find(content_type_id)
18
+
19
+ content_type.remove_field(field_id)
20
+
21
+ content_type.save
22
+ end
23
+ end
24
+ end
25
+ end
@@ -5,13 +5,12 @@ module ContentfulModel
5
5
  end
6
6
 
7
7
  module ClassMethods
8
-
9
8
  def inherited(subclass)
10
9
  instantiate_query(subclass)
11
10
  end
12
11
 
13
12
  def instantiate_query(klass)
14
- klass.instance_variable_set(:"@query",ContentfulModel::Query.new(klass))
13
+ klass.instance_variable_set(:"@query", ContentfulModel::Query.new(klass))
15
14
  end
16
15
 
17
16
  def load
@@ -24,7 +23,6 @@ module ContentfulModel
24
23
  @query << {'sys.id' => id}
25
24
  load.first
26
25
  end
27
-
28
26
  end
29
27
  end
30
28
  end
@@ -15,7 +15,7 @@ module ContentfulModel
15
15
  end
16
16
 
17
17
  def execute
18
- query = @parameters.merge!(default_parameters)
18
+ query = @parameters.merge(default_parameters)
19
19
  result = client.send(:entries,query)
20
20
  return result.to_a.reject {|entity| entity.is_a?(Contentful::Link) || entity.invalid?}
21
21
  end
@@ -28,4 +28,4 @@ module ContentfulModel
28
28
  @parameters = default_parameters
29
29
  end
30
30
  end
31
- end
31
+ end
@@ -7,12 +7,28 @@ module Contentful
7
7
 
8
8
  module ClassMethods
9
9
  def validates_presence_of(*args)
10
- @validations ||= {}
11
- @validations[:presence] ||= []
12
- @validations[:presence].push(args)
13
- @validations[:presence].flatten!
10
+ @validations ||= []
11
+ @validations << PresenceValidation.new(args)
14
12
  end
15
13
  end
16
14
  end
15
+
16
+ class PresenceValidation
17
+ attr_reader :fields
18
+
19
+ def initialize(fields)
20
+ @fields = fields
21
+ end
22
+
23
+ def validate(entry)
24
+ errors = []
25
+
26
+ fields.each do |field|
27
+ errors << "#{field} is required" unless entry.respond_to?(field)
28
+ end
29
+
30
+ errors
31
+ end
32
+ end
17
33
  end
18
- end
34
+ end
@@ -17,7 +17,7 @@ module ContentfulModel
17
17
  end
18
18
 
19
19
  def validate
20
- @errors ||= []
20
+ @errors = []
21
21
  unless self.respond_to?(:fields)
22
22
  @errors.push("Entity doesn't respond to the fields() method")
23
23
  return false
@@ -25,26 +25,12 @@ module ContentfulModel
25
25
 
26
26
  validations = self.class.send(:validations)
27
27
  unless validations.nil?
28
- validations.each do |type, fields|
29
- case type
30
- # validates_presence_of
31
- when :presence
32
- fields.each do |field|
33
- unless self.respond_to?(field)
34
- @errors << "#{field} is required"
35
- end
36
- end
37
- end
28
+ validations.each do |validation|
29
+ @errors += validation.validate(self)
38
30
  end
39
31
  end
40
32
 
41
-
42
- if @errors.empty?
43
- return true
44
- else
45
- return false
46
- end
47
-
33
+ @errors.empty?
48
34
  end
49
35
 
50
36
  module ClassMethods
@@ -53,4 +39,4 @@ module ContentfulModel
53
39
  end
54
40
  end
55
41
  end
56
- end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module ContentfulModel
2
- VERSION = "0.1.7.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contentful_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Error Creative Studio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-24 00:00:00.000000000 Z
11
+ date: 2016-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contentful
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: contentful-management
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: redcarpet
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,90 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: vcr
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
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
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard-rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
69
167
  description: A wrapper around the Contentful gem to give you a base class to inherit
70
168
  your models from
71
169
  email:
@@ -87,6 +185,12 @@ files:
87
185
  - lib/contentful_model/chainable_queries.rb
88
186
  - lib/contentful_model/client.rb
89
187
  - lib/contentful_model/errors.rb
188
+ - lib/contentful_model/manageable.rb
189
+ - lib/contentful_model/management.rb
190
+ - lib/contentful_model/migrations/content_type.rb
191
+ - lib/contentful_model/migrations/content_type_factory.rb
192
+ - lib/contentful_model/migrations/errors.rb
193
+ - lib/contentful_model/migrations/migration.rb
90
194
  - lib/contentful_model/queries.rb
91
195
  - lib/contentful_model/query.rb
92
196
  - lib/contentful_model/validations/validates_presence_of.rb
@@ -113,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
217
  version: '0'
114
218
  requirements: []
115
219
  rubyforge_project:
116
- rubygems_version: 2.2.2
220
+ rubygems_version: 2.5.1
117
221
  signing_key:
118
222
  specification_version: 4
119
223
  summary: A thin wrapper for Contentful gem