yogo-project 0.3.2

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.
Files changed (61) hide show
  1. data/.document +5 -0
  2. data/.gitignore +27 -0
  3. data/Gemfile +34 -0
  4. data/Gemfile.lock +198 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +17 -0
  7. data/Rakefile +56 -0
  8. data/VERSION +1 -0
  9. data/features/step_definitions/yogo_project_steps.rb +0 -0
  10. data/features/support/env.rb +1 -0
  11. data/features/yogo_project.feature +9 -0
  12. data/lib/datamapper/adapters/postgres.rb +9 -0
  13. data/lib/datamapper/adapters/sqlite.rb +9 -0
  14. data/lib/yogo-project.rb +2 -0
  15. data/lib/yogo/collection.rb +12 -0
  16. data/lib/yogo/collection/asset.rb +12 -0
  17. data/lib/yogo/collection/asset/model.rb +11 -0
  18. data/lib/yogo/collection/asset/model_configuration.rb +21 -0
  19. data/lib/yogo/collection/asset/model_properties.rb +47 -0
  20. data/lib/yogo/collection/base.rb +69 -0
  21. data/lib/yogo/collection/base/collection_repository.rb +21 -0
  22. data/lib/yogo/collection/base/model.rb +20 -0
  23. data/lib/yogo/collection/base/model_collection_context.rb +25 -0
  24. data/lib/yogo/collection/base/model_configuration.rb +34 -0
  25. data/lib/yogo/collection/data.rb +61 -0
  26. data/lib/yogo/collection/data/model.rb +72 -0
  27. data/lib/yogo/collection/data/model_configuration.rb +42 -0
  28. data/lib/yogo/collection/data/model_properties.rb +15 -0
  29. data/lib/yogo/collection/field_view.rb +26 -0
  30. data/lib/yogo/collection/form.rb +22 -0
  31. data/lib/yogo/collection/property.rb +127 -0
  32. data/lib/yogo/collection/static.rb +13 -0
  33. data/lib/yogo/collection/static/model_configuration.rb +31 -0
  34. data/lib/yogo/configuration.rb +9 -0
  35. data/lib/yogo/datamapper/model/common/properties.rb +16 -0
  36. data/lib/yogo/datamapper/model/configuration.rb +31 -0
  37. data/lib/yogo/datamapper/model/operations/add.rb +34 -0
  38. data/lib/yogo/datamapper/model/operations/clear.rb +29 -0
  39. data/lib/yogo/datamapper/model/stored/configuration.rb +25 -0
  40. data/lib/yogo/datamapper/repository_manager.rb +30 -0
  41. data/lib/yogo/datamapper/repository_manager/model.rb +40 -0
  42. data/lib/yogo/datamapper/repository_manager/resource.rb +124 -0
  43. data/lib/yogo/example/dynamic/project_full.rb +48 -0
  44. data/lib/yogo/example/dynamic/project_remix.rb +16 -0
  45. data/lib/yogo/example/voeis/managed/data_stream.rb +39 -0
  46. data/lib/yogo/example/voeis/managed/site.rb +51 -0
  47. data/lib/yogo/example/voeis/project.rb +57 -0
  48. data/lib/yogo/operation.rb +49 -0
  49. data/lib/yogo/project.rb +32 -0
  50. data/lib/yogo/property_ext.rb +7 -0
  51. data/spec/resource/.gitdir +0 -0
  52. data/spec/resource/text_file_asset.txt +1 -0
  53. data/spec/spec_helper.rb +49 -0
  54. data/spec/yogo/all_collection_data_models_spec.rb +34 -0
  55. data/spec/yogo/all_collection_managers_spec.rb +18 -0
  56. data/spec/yogo/all_collections_spec.rb +54 -0
  57. data/spec/yogo/all_data_collections_spec.rb +51 -0
  58. data/spec/yogo/asset_collection_spec.rb +28 -0
  59. data/spec/yogo/data_collection_spec.rb +16 -0
  60. data/yogo-project.gemspec +128 -0
  61. metadata +222 -0
@@ -0,0 +1,21 @@
1
+ require 'yogo/collection/asset/model'
2
+ require 'yogo/collection/asset/model_properties'
3
+
4
+ module Yogo
5
+ module Collection
6
+ class Asset < Data
7
+ module ModelConfiguration
8
+ def after_model_generate(model)
9
+ model = super
10
+ model.extend(Asset::Model)
11
+ model
12
+ end
13
+
14
+ def after_model_update(model)
15
+ model.extend(Asset::ModelProperties)
16
+ super
17
+ end
18
+ end # ModelConfiguration
19
+ end # Data
20
+ end # Collection
21
+ end # Yogo
@@ -0,0 +1,47 @@
1
+
2
+ require 'yogo/configuration'
3
+
4
+ module Yogo
5
+ module Collection
6
+ class Asset
7
+
8
+ module ModelProperties
9
+ def self.extended(model)
10
+ uploader = Class.new(CarrierWave::Uploader::Base)
11
+ uploader.storage(:file)
12
+ uploader.class_eval %{
13
+ def store_dir
14
+ File.join('#{Configuration.collection.asset.storage_dir}', '#{model.collection.collection_storage_name}')
15
+ end
16
+
17
+ def filename
18
+ # Digest::MD5.hexdigest(self.read)
19
+ UUIDTools::UUID.timestamp_create
20
+ end
21
+ }, __FILE__, __LINE__+1
22
+
23
+ model.class_eval do
24
+ without_auto_validations do
25
+ property :content_type, String
26
+ property :description, String
27
+ property :asset_file, String
28
+ property :original_filename, String
29
+ end
30
+
31
+ # validates_uniqueness_of :asset_file
32
+
33
+ mount_uploader :file, uploader, :mount_on => :asset_file
34
+ after :file=, :write_file_identifier
35
+ after :file=, :set_original_filename
36
+
37
+ private
38
+
39
+ def set_original_filename
40
+ attribute_set(:original_filename, file.send(:original_filename))
41
+ end
42
+ end
43
+ end
44
+ end # ModelProperties
45
+ end # Base
46
+ end # Collection
47
+ end # Yogo
@@ -0,0 +1,69 @@
1
+
2
+ require 'yogo/collection/base/collection_repository'
3
+ require 'yogo/collection/base/model_collection_context'
4
+ require 'yogo/collection/base/model_configuration'
5
+
6
+ module Yogo
7
+ module Collection
8
+ module Base
9
+
10
+ def self.included(base)
11
+ base.extend(Base::CollectionRepository)
12
+ end
13
+
14
+ include Base::CollectionRepository::InstanceMethods
15
+ include Base::ModelConfiguration
16
+
17
+ def collection_storage_name
18
+ self.id.to_s
19
+ end
20
+
21
+ def as_json(options={})
22
+ self.attributes
23
+ end
24
+
25
+ def items(*args)
26
+ scope do
27
+ data_model.all(*args)
28
+ end
29
+ end
30
+
31
+ def data_model
32
+ @_data_model ||= generate_model
33
+ end
34
+
35
+ def update_model(model=data_model)
36
+ scope do
37
+ before_model_update(model)
38
+ model_update(model)
39
+ if block_given?
40
+ yield
41
+ end
42
+ after_model_update(model)
43
+ end
44
+ end
45
+
46
+ def scope
47
+ context = Yogo::Collection.context
48
+ context << self
49
+
50
+ begin
51
+ yield self
52
+ ensure
53
+ context.pop
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def generate_model
60
+ before_model_generate
61
+ model = model_generate
62
+ after_model_generate(model)
63
+
64
+ update_model(model)
65
+ return model
66
+ end
67
+ end # Base
68
+ end # Collection
69
+ end # Yogo
@@ -0,0 +1,21 @@
1
+ module Yogo
2
+ module Collection
3
+ module Base
4
+ module CollectionRepository
5
+ def default_collection_repository_name
6
+ :collection_data
7
+ end
8
+
9
+ module InstanceMethods
10
+ def collection_repository_name
11
+ self.class.default_collection_repository_name
12
+ end
13
+
14
+ def collection_repository
15
+ ::DataMapper.repository(collection_repository_name)
16
+ end
17
+ end
18
+ end # CollectionRepository
19
+ end # Base
20
+ end # Collection
21
+ end # Yogo
@@ -0,0 +1,20 @@
1
+ module Yogo
2
+ module Collection
3
+ module Base
4
+ module Model
5
+ def to_s
6
+ "CollectionItemModel[]"
7
+ end
8
+
9
+
10
+
11
+ module InstanceMethods
12
+ def as_json(options=nil)
13
+ self.attributes
14
+ end
15
+ end
16
+
17
+ end # Model
18
+ end # Base
19
+ end # Collection
20
+ end # Yogo
@@ -0,0 +1,25 @@
1
+ require 'yogo/collection'
2
+
3
+ module Yogo
4
+ module Collection
5
+ module Base
6
+ module ModelCollectionContext
7
+ def current_collection
8
+ Yogo::Collection.context.last
9
+ end
10
+
11
+ def collection
12
+ current_collection
13
+ end
14
+
15
+ def default_storage_name
16
+ (current_collection && current_collection.collection_storage_name) || super
17
+ end
18
+
19
+ def default_repository_name
20
+ (current_collection && current_collection.collection_repository_name) || super
21
+ end
22
+ end # ModelCollectionContext
23
+ end # Static
24
+ end # Collection
25
+ end # Yogo
@@ -0,0 +1,34 @@
1
+ require 'yogo/collection/base/model'
2
+
3
+ module Yogo
4
+ module Collection
5
+ module Base
6
+ module ModelConfiguration
7
+ def model_generate
8
+ ::DataMapper::Model.new
9
+ end
10
+
11
+ def before_model_generate
12
+ end
13
+
14
+ def after_model_generate(model)
15
+ model.extend(Base::Model)
16
+ model.send(:include, Base::Model::InstanceMethods)
17
+ model.extend(Base::ModelCollectionContext)
18
+ end
19
+
20
+ def model_update(model)
21
+ model
22
+ end
23
+
24
+ def before_model_update(model)
25
+ model
26
+ end
27
+
28
+ def after_model_update(model)
29
+ model
30
+ end
31
+ end # ModelConfiguration
32
+ end # base
33
+ end # Collection
34
+ end # Yogo
@@ -0,0 +1,61 @@
1
+ require 'dm-core'
2
+ require 'dm-validations'
3
+ require 'dm-types/uuid'
4
+ require 'dm-timestamps'
5
+
6
+ require 'yogo/configuration'
7
+ require 'yogo/collection/base'
8
+ require 'yogo/collection/data/model_configuration'
9
+ require 'yogo/collection/property'
10
+
11
+ module Yogo
12
+ module Collection
13
+ class Data
14
+ include ::DataMapper::Resource
15
+
16
+
17
+ property :id, UUID, :key => true, :default => lambda { |p,r| Yogo::Configuration.random_uuid }
18
+ property :name, String, :required => true
19
+ property :description, String
20
+ property :type, Discriminator
21
+
22
+ property :project_id, UUID
23
+ belongs_to :project, :model => 'Yogo::Project'
24
+
25
+ validates_uniqueness_of :name, :scope => :project_id
26
+
27
+ has n, :schema, :model => 'Yogo::Collection::Property', :child_key => [:data_collection_id]
28
+
29
+ include Collection::Base
30
+ include Data::ModelConfiguration
31
+
32
+ chainable do
33
+ def as_json
34
+ {
35
+ :id => self.id.to_s,
36
+ :name => self.name,
37
+ :description => self.description,
38
+ :type => self.type.to_s,
39
+ :project => self.project_id.to_s,
40
+ :schema => self.schema.map{|p| p.id.to_s }
41
+ }
42
+ end
43
+
44
+ def update_attributes(hash)
45
+ attrs = {}
46
+ attrs[:name] = hash[:name] || hash['name'] || self.name
47
+ attrs[:description] = hash[:description] || hash['description'] || self.description
48
+ attrs[:type] = hash[:type] || hash['type'] || self.type || self.class.name
49
+ self.attributes = attrs
50
+ end
51
+ end
52
+
53
+ protected
54
+
55
+ def resolve_property(options)
56
+ schema.first(options)
57
+ end
58
+
59
+ end # Base
60
+ end # Collection
61
+ end # Yogo
@@ -0,0 +1,72 @@
1
+ require 'dm-timestamps'
2
+
3
+ module Yogo
4
+ module Collection
5
+ class Data
6
+ module Model
7
+ def to_s
8
+ "DataItemModel[]"
9
+ end
10
+
11
+ def resolve_property(options)
12
+ collection.send(:resolve_property, options)
13
+ end
14
+
15
+
16
+ module InstanceMethods
17
+ def self.included(base)
18
+ base.class_eval do
19
+ alias_method :[], :named_attribute_get
20
+ alias_method :[]=, :named_attribute_set
21
+ end
22
+ end
23
+
24
+ def as_json(options=nil)
25
+ hash = super
26
+ hash[:id] = self.id.to_s
27
+ hash
28
+ end
29
+
30
+ def named_attribute_get(name)
31
+ name = name.to_s
32
+ property = resolve_property(:name => name)
33
+ property ? attribute_get(property.to_s) : attribute_get(name)
34
+ end
35
+
36
+ def named_attribute_set(name, value)
37
+ name = name.to_s
38
+ property = resolve_property(:name => name)
39
+ property ? attribute_set(property.to_s, value) : attribute_set(name, value)
40
+ end
41
+
42
+ def named_attributes
43
+ attributes.inject({}) do |h,(k,v)|
44
+ if k.to_s =~ /^field_/
45
+ key = k.to_s.gsub(/^field_/,'').gsub('_','-')
46
+ property = resolve_property(:id => key)
47
+ h[property.name] = v
48
+ end
49
+ h
50
+ end
51
+ end
52
+
53
+ def named_attributes=(attrs)
54
+ attrs = attrs.inject({}) do |h,(k,v)|
55
+ property = resolve_property(:name => k.to_s)
56
+ if(property)
57
+ h[property.to_s.intern] = v
58
+ end
59
+ h
60
+ end
61
+ self.attributes = attrs
62
+ end
63
+
64
+ def resolve_property(options)
65
+ self.class.resolve_property(options)
66
+ end
67
+
68
+ end # InstanceMethods
69
+ end # Model
70
+ end # Data
71
+ end # Collection
72
+ end # Yogo
@@ -0,0 +1,42 @@
1
+ require 'yogo/collection/data/model'
2
+ require 'yogo/collection/data/model_properties'
3
+
4
+ module Yogo
5
+ module Collection
6
+ class Data
7
+ module ModelConfiguration
8
+ def after_model_generate(model)
9
+ model = super
10
+ model.extend(Data::Model)
11
+ model.send(:include, Data::Model::InstanceMethods)
12
+ model
13
+ end
14
+
15
+ def before_model_update(model)
16
+ model = super
17
+ model.properties.clear
18
+ model.properties.instance_variable_get(:@properties).clear #clear out the name index
19
+ # Need to remove relationships too
20
+ model.relationships.clear
21
+ model.validators.clear!
22
+ model
23
+ end
24
+
25
+ def model_update(model)
26
+ model = super
27
+ schema.reload
28
+ schema.each do |field|
29
+ field.add_to_model(model)
30
+ end
31
+ model
32
+ end
33
+
34
+ def after_model_update(model)
35
+ model.extend(Data::ModelProperties)
36
+ model.auto_upgrade!
37
+ model
38
+ end
39
+ end # ModelConfiguration
40
+ end # Data
41
+ end # Collection
42
+ end # Yogo
@@ -0,0 +1,15 @@
1
+ module Yogo
2
+ module Collection
3
+ class Data
4
+ module ModelProperties
5
+ def self.extended(model)
6
+ model.class_eval do
7
+ property :id, UUID, :key => true, :default => lambda { |p,r| UUIDTools::UUID.timestamp_create }
8
+ property :created_at, DateTime
9
+ property :updated_at, DateTime
10
+ end
11
+ end
12
+ end # ModelProperties
13
+ end # Base
14
+ end # Collection
15
+ end # Yogo
@@ -0,0 +1,26 @@
1
+ require 'dm-core'
2
+ require 'dm-types/uuid'
3
+ require 'dm-types/yaml'
4
+
5
+ require 'yogo/collection/field'
6
+ require 'yogo/collection/form'
7
+
8
+ module Yogo
9
+ module Collection
10
+ class FieldView
11
+ include ::DataMapper::Resource
12
+
13
+ property :id, UUID, :key => true, :default => lambda { |p,r| UUIDTools::UUID.timestamp_create }
14
+ property :label, String,
15
+ property :type, String, :required => true, :default => 'textfield'
16
+ property :options, Yaml, :default => {}.to_yaml
17
+
18
+ belongs_to :field
19
+ belongs_to :form
20
+
21
+ def label
22
+ ActiveSupport::Inflector.titleize(attribute_get(:label) || field.field_name || '')
23
+ end
24
+ end # FieldView
25
+ end # Collection
26
+ end # Yogo