architect4r 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +53 -0
  4. data/Guardfile +10 -0
  5. data/License +20 -0
  6. data/README.md +62 -0
  7. data/Rakefile +40 -0
  8. data/ReleaseNotes.md +33 -0
  9. data/Roadmap.md +31 -0
  10. data/Specs.md +21 -0
  11. data/architect4r.gemspec +31 -0
  12. data/lib/architect4r.rb +66 -0
  13. data/lib/architect4r/adapters/carrier_wave.rb +64 -0
  14. data/lib/architect4r/core/configuration.rb +148 -0
  15. data/lib/architect4r/core/cypher_methods.rb +47 -0
  16. data/lib/architect4r/core/management_methods.rb +129 -0
  17. data/lib/architect4r/core/node_methods.rb +73 -0
  18. data/lib/architect4r/core/relationship_methods.rb +82 -0
  19. data/lib/architect4r/generic_node.rb +7 -0
  20. data/lib/architect4r/has_node.rb +80 -0
  21. data/lib/architect4r/instance_manager.rb +47 -0
  22. data/lib/architect4r/model/callbacks.rb +19 -0
  23. data/lib/architect4r/model/connection.rb +29 -0
  24. data/lib/architect4r/model/links_query_interface.rb +23 -0
  25. data/lib/architect4r/model/node.rb +117 -0
  26. data/lib/architect4r/model/persistency.rb +95 -0
  27. data/lib/architect4r/model/properties.rb +166 -0
  28. data/lib/architect4r/model/queries.rb +38 -0
  29. data/lib/architect4r/model/relationship.rb +105 -0
  30. data/lib/architect4r/model/relationships.rb +16 -0
  31. data/lib/architect4r/model/validations.rb +11 -0
  32. data/lib/architect4r/server.rb +96 -0
  33. data/lib/architect4r/version.rb +3 -0
  34. data/spec/architect4r_spec.rb +9 -0
  35. data/spec/core/configuration_spec.rb +54 -0
  36. data/spec/core/cypher_methods_spec.rb +29 -0
  37. data/spec/core/node_methods_spec.rb +47 -0
  38. data/spec/core/relationship_methods_spec.rb +92 -0
  39. data/spec/fixtures/architect4r.yml +21 -0
  40. data/spec/fixtures/graph.db.default/active_tx_log +1 -0
  41. data/spec/fixtures/graph.db.default/index/lucene-store.db +0 -0
  42. data/spec/fixtures/graph.db.default/index/lucene.log.1 +0 -0
  43. data/spec/fixtures/graph.db.default/index/lucene.log.active +0 -0
  44. data/spec/fixtures/graph.db.default/index/lucene.log.v0 +0 -0
  45. data/spec/fixtures/graph.db.default/index/lucene.log.v1 +0 -0
  46. data/spec/fixtures/graph.db.default/index/lucene.log.v2 +0 -0
  47. data/spec/fixtures/graph.db.default/lock +0 -0
  48. data/spec/fixtures/graph.db.default/messages.log +183 -0
  49. data/spec/fixtures/graph.db.default/neostore +0 -0
  50. data/spec/fixtures/graph.db.default/neostore.id +0 -0
  51. data/spec/fixtures/graph.db.default/neostore.nodestore.db +0 -0
  52. data/spec/fixtures/graph.db.default/neostore.nodestore.db.id +0 -0
  53. data/spec/fixtures/graph.db.default/neostore.propertystore.db +0 -0
  54. data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays +0 -0
  55. data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays.id +0 -0
  56. data/spec/fixtures/graph.db.default/neostore.propertystore.db.id +0 -0
  57. data/spec/fixtures/graph.db.default/neostore.propertystore.db.index +0 -0
  58. data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.id +0 -0
  59. data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys +0 -0
  60. data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys.id +0 -0
  61. data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings +0 -0
  62. data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings.id +0 -0
  63. data/spec/fixtures/graph.db.default/neostore.relationshipstore.db +0 -0
  64. data/spec/fixtures/graph.db.default/neostore.relationshipstore.db.id +0 -0
  65. data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db +0 -0
  66. data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.id +0 -0
  67. data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names +0 -0
  68. data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names.id +0 -0
  69. data/spec/fixtures/graph.db.default/nioneo_logical.log.1 +0 -0
  70. data/spec/fixtures/graph.db.default/nioneo_logical.log.active +0 -0
  71. data/spec/fixtures/graph.db.default/tm_tx_log.1 +0 -0
  72. data/spec/fixtures/graph.db.default/upgrade_backup/active_tx_log +1 -0
  73. data/spec/fixtures/graph.db.default/upgrade_backup/messages.log +142 -0
  74. data/spec/fixtures/graph.db.default/upgrade_backup/neostore +0 -0
  75. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.id +0 -0
  76. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db +0 -0
  77. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db.id +0 -0
  78. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db +0 -0
  79. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays +0 -0
  80. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays.id +0 -0
  81. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.id +0 -0
  82. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index +0 -0
  83. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.id +0 -0
  84. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys +0 -0
  85. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys.id +0 -0
  86. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings +0 -0
  87. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings.id +0 -0
  88. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db +0 -0
  89. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db.id +0 -0
  90. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db +0 -0
  91. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.id +0 -0
  92. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names +0 -0
  93. data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names.id +0 -0
  94. data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.active +0 -0
  95. data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v0 +0 -0
  96. data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v1 +0 -0
  97. data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v2 +0 -0
  98. data/spec/fixtures/graph.db.default/upgrade_backup/tm_tx_log.1 +0 -0
  99. data/spec/has_node_spec.rb +87 -0
  100. data/spec/model/links_query_interface_spec.rb +22 -0
  101. data/spec/model/links_spec.rb +26 -0
  102. data/spec/model/node_spec.rb +48 -0
  103. data/spec/model/persistency_spec.rb +98 -0
  104. data/spec/model/properties_spec.rb +165 -0
  105. data/spec/model/queries_spec.rb +50 -0
  106. data/spec/model/relationship_spec.rb +63 -0
  107. data/spec/model/validations_spec.rb +31 -0
  108. data/spec/server_spec.rb +33 -0
  109. data/spec/spec_helper.rb +115 -0
  110. metadata +377 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ .DS_Store
2
+ .rvmrc
3
+ architect4r-*.gem
4
+ neo4j_server
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in architect4r.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ architect4r (0.3.2)
5
+ activemodel (~> 3.0)
6
+ json (~> 1.5)
7
+ typhoeus (~> 0.2)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activemodel (3.1.1)
13
+ activesupport (= 3.1.1)
14
+ builder (~> 3.0.0)
15
+ i18n (~> 0.6)
16
+ activesupport (3.1.1)
17
+ multi_json (~> 1.0)
18
+ builder (3.0.0)
19
+ diff-lcs (1.1.3)
20
+ growl (1.0.3)
21
+ guard (0.8.7)
22
+ thor (~> 0.14.6)
23
+ guard-rspec (0.5.0)
24
+ guard (>= 0.8.4)
25
+ i18n (0.6.0)
26
+ json (1.6.1)
27
+ mime-types (1.17.1)
28
+ multi_json (1.0.3)
29
+ rake (0.9.2)
30
+ rb-fsevent (0.4.3.1)
31
+ rspec (2.7.0)
32
+ rspec-core (~> 2.7.0)
33
+ rspec-expectations (~> 2.7.0)
34
+ rspec-mocks (~> 2.7.0)
35
+ rspec-core (2.7.1)
36
+ rspec-expectations (2.7.0)
37
+ diff-lcs (~> 1.1.2)
38
+ rspec-mocks (2.7.0)
39
+ thor (0.14.6)
40
+ typhoeus (0.3.2)
41
+ mime-types
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ architect4r!
48
+ growl
49
+ guard
50
+ guard-rspec
51
+ rake
52
+ rb-fsevent
53
+ rspec
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ guard 'rspec' do
2
+ # Check for changes in classes
3
+ watch(%r{^lib/architect4r/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+
5
+ # Check for changes in specs
6
+ watch(%r{^spec/.+_spec\.rb$})
7
+
8
+ # Check for changes in the spec helper
9
+ watch('spec/spec_helper.rb') { "spec" }
10
+ end
data/License ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Maximilian Schulz
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # Architect4r
2
+
3
+ Architect4r is intended as an easy ruby wrapper for the neo4j graph db
4
+ REST API. There are other solutions such as neo4j.rb if you are working
5
+ in a java environment or neography which provides another working wrapper
6
+ for the REST API.
7
+
8
+ Requirements
9
+ ------------
10
+
11
+ You need a running neo4j installation.
12
+
13
+ Installation
14
+ ------------
15
+
16
+ In oder to work with architect4r you have to install the gem by using
17
+ `gem install architect4r` or in case that you are using bundler, you can
18
+ add the following line to your _Gemfile_: `gem "architect4r"`.
19
+
20
+ Quick Start
21
+ -----------
22
+
23
+ # Class definition
24
+ class Instrument < Architect4r::Model::Node
25
+ # Properties
26
+ property :name, :cast_to => String, :localize => true
27
+ property :name, :cast_to => String, :localize => :de
28
+
29
+ # Validations
30
+ validates :name, :presence => true
31
+ end
32
+
33
+ # Interfacing with the I18n class
34
+ I18n.locale = :en
35
+
36
+ # Working with a record
37
+ instrument = Instrument.new
38
+ instrument.name = "Piano"
39
+ instrument.name(:de) = "Klavier"
40
+ instrument.valid?
41
+ instrument.save
42
+
43
+ # Updating attributes
44
+ instrument.update_attributes(params[:instrument])
45
+
46
+ # Finding records
47
+ Instrument.find_by_id(123)
48
+
49
+ class Fanship < Architect4r::Model::Relationship
50
+ # Properties
51
+ property :created_at, :cast_to => DateTime
52
+ property :reason, :cast_to => String
53
+ end
54
+
55
+ # Init a class based relationship
56
+ Fanship.new(@user, @instrument, { :reason => 'Because I like you' })
57
+
58
+ License
59
+ -------
60
+
61
+ Architect4r is copyright (c) 2011 Maximilian Schulz. It is free software,
62
+ and may be redistributed under the terms of the MIT License.
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ # Add rspec tasks for testing
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new('spec')
6
+
7
+ # Load instance manager
8
+ require 'lib/architect4r/instance_manager'
9
+
10
+ # Setting up default tasks
11
+ desc "Run specs"
12
+ task :default => :spec
13
+
14
+ namespace :server do
15
+
16
+ current_path = File.dirname(__FILE__)
17
+ server_path = File.join(current_path, 'neo4j_server')
18
+ neo_manager = Architect4r::InstanceManager.new(server_path)
19
+
20
+ desc "Install test server"
21
+ task :install do
22
+ puts '--- not implemented'
23
+ end
24
+
25
+ desc "Stop the neo4j server"
26
+ task :start do
27
+ neo_manager.start
28
+ end
29
+
30
+ desc "Stop the neo4j server"
31
+ task :stop do
32
+ neo_manager.stop
33
+ end
34
+
35
+ desc "Reset the test server"
36
+ task :reset do
37
+ neo_manager.reset_to_sample_data("#{current_path}/spec/fixtures/graph.db.default/")
38
+ end
39
+
40
+ end
data/ReleaseNotes.md ADDED
@@ -0,0 +1,33 @@
1
+ # Release Notes
2
+
3
+ ## v0.3.2
4
+
5
+ * Support for carrierwave file upload mechanism
6
+
7
+ ## v0.3.1
8
+
9
+ * Sync with ActiveModel records
10
+
11
+ In order to use neo4j in combination with other databases, we provide a
12
+ small extension which allows you to keep a node in sync with another's
13
+ datastore record.
14
+
15
+ ## v0.3
16
+
17
+ This release marks the first public release. So I wont get into length
18
+ with its changes and new features. Let's just say it allows you to create
19
+ nodes and relationships between nodes. That's it!
20
+
21
+ * Nodes (create, update, destroy)
22
+ * Relationships (create, update, destroy)
23
+ * Querying neo4j by using cypher query language
24
+ * Callbacks and validations for nodes and relationships
25
+
26
+ ## v0.2
27
+
28
+ Another internal release which was not ready for development or production.
29
+ _Please do not use it or try working with it!_ ;)
30
+
31
+ ## v0.1
32
+
33
+ Some initial internal release which was very buggy and limited on the features.
data/Roadmap.md ADDED
@@ -0,0 +1,31 @@
1
+ # Roadmap
2
+
3
+ _Check the release notes for info on previous versions_
4
+
5
+
6
+ There is no real roadmap for architect4r, as this project is only used in
7
+ a single project so far. If there is anything you miss, either fork the
8
+ project, implement the feature and send a pull request, or submit an issue.
9
+
10
+ The following items are kinda planned to be integrated in the future:
11
+
12
+ * Give the cypher plugin some more love
13
+ * Add more default queries
14
+ * Add tracking of dirty attributes
15
+ * Make it compatible to file uploaders such as paperclip and carrierwave
16
+ * Make it compatible to search engines such as sunspot, elastic search, sphinx, …
17
+ * Rake tasks for installing neo4j
18
+ * Rake tasks for test setup
19
+ * Versioning of nodes (update node but create a linked node with the old properties)
20
+ * Improve documentation
21
+ * Improve test cases
22
+
23
+ And there are a few features which might be integrated, but are not yet really planned:
24
+
25
+ * Accessible relationships as you know it from active record
26
+ * Support for indexes (nodes and relations)
27
+ * Add more finders by using indexes
28
+ * Add auto indexing of node properties / nodes (not neo4j auto indexing)
29
+ * Add basic authentication
30
+ * Add digest authentication
31
+ * Facilitate hydra's concurrency model
data/Specs.md ADDED
@@ -0,0 +1,21 @@
1
+ # Specs
2
+
3
+ Some code which might define the future interface of the gem.
4
+
5
+ # Finding records
6
+ Instrument.all
7
+ Instrument.find_by_name("Piano")
8
+ Instrument.find_by_name("Klavier", :de)
9
+ Instrument.find_by_cypher("start cat=(123) match (cat)--(x) return x limit 2")
10
+
11
+ # Filter associations by relationship type (:incoming, :outgoing, :all)
12
+ instrument.links(:outgoing)
13
+
14
+ # Query by model or type
15
+ @user.links(:all, Fanship, 'studies')
16
+
17
+ # Create a custom relationship
18
+ relationship = Architect4r::Model::Relationship.create(start_node, end_note, 'CustomType', { :active => true })
19
+ # or
20
+ instrument.links(:incoming).create(:category, @other_node, { :created_at => DateTime.new, :active => true })
21
+ instrument.links(:incoming).create(CategoryRelation, @other_node, { :created_at => DateTime.new, :active => true })
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "architect4r/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "architect4r"
7
+ s.version = Architect4r::VERSION
8
+ s.authors = ["Maximilian Schulz"]
9
+ s.email = ["m.schulz@kulturfluss.de"]
10
+ s.homepage = "http://www.kulturfluss.de/"
11
+ s.summary = %q{A gem for working with the neo4j REST interface.}
12
+ s.description = %q{This gem is intended for making a neo4j graph db accessible by providing a ruby wrapper for the REST API.}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ # Production dependencies
20
+ s.add_runtime_dependency %q<activemodel>, "~> 3.0"
21
+ s.add_runtime_dependency %q<json>, "~> 1.5"
22
+ s.add_runtime_dependency %q<typhoeus>, "~> 0.2"
23
+
24
+ # Development dependencies
25
+ s.add_development_dependency "rake"
26
+ s.add_development_dependency "rspec"
27
+ s.add_development_dependency "guard"
28
+ s.add_development_dependency "guard-rspec"
29
+ s.add_development_dependency "rb-fsevent"
30
+ s.add_development_dependency "growl"
31
+ end
@@ -0,0 +1,66 @@
1
+ #
2
+ # Gem management
3
+ #
4
+ require 'architect4r/version'
5
+
6
+ #
7
+ # Extensions
8
+ #
9
+ require 'active_model'
10
+ require 'active_support'
11
+ require 'active_support/core_ext'
12
+ #require 'architect4r/extensions/object'
13
+
14
+ #
15
+ # Core modules
16
+ #
17
+ require 'architect4r/core/configuration'
18
+ require 'architect4r/core/cypher_methods'
19
+ require 'architect4r/core/node_methods'
20
+ require 'architect4r/core/relationship_methods'
21
+
22
+ #
23
+ # Basic server interaction
24
+ #
25
+ require 'architect4r/server'
26
+
27
+ #
28
+ # Model features
29
+ #
30
+ require 'architect4r/model/connection'
31
+ require 'architect4r/model/properties'
32
+ require 'architect4r/model/persistency'
33
+ require 'architect4r/model/queries'
34
+ require 'architect4r/model/validations'
35
+ require 'architect4r/model/callbacks'
36
+ require 'architect4r/model/links_query_interface'
37
+ require 'architect4r/model/relationships'
38
+ require 'architect4r/model/node'
39
+ require 'architect4r/model/relationship'
40
+
41
+ #
42
+ # Generic items
43
+ #
44
+ require 'architect4r/generic_node'
45
+
46
+ #
47
+ # Support for multi database environments
48
+ #
49
+ require 'architect4r/has_node'
50
+ # Auto load the extension when active record is used
51
+ if defined?(ActiveRecord::Base)
52
+ ActiveRecord::Base.send(:include, Architect4r::HasNode)
53
+ end
54
+
55
+ #
56
+ # The namespace
57
+ #
58
+ module Architect4r
59
+
60
+ def self.version
61
+ "Architect4r version #{Architect4r::VERSION}"
62
+ end
63
+
64
+ class InvalidCypherQuery < SyntaxError; end
65
+
66
+ end
@@ -0,0 +1,64 @@
1
+ require "architect4r"
2
+ require "carrierwave"
3
+ require "carrierwave/validations/active_model"
4
+
5
+ # In order to use this class include this file in your project
6
+ # require 'architect4r/adapters/carrier_wave'
7
+ #
8
+ module Architect4r
9
+ module Adapters
10
+ module CarrierWave
11
+ # Import default implementation
12
+ include ::CarrierWave::Mount
13
+
14
+ def mount_uploader(column, uploader = nil, options = {}, &block)
15
+ property "#{column}_data", :cast_to => String
16
+
17
+ # Init by calling default initializer
18
+ super
19
+
20
+ # Enable validations
21
+ include ::CarrierWave::Validations::ActiveModel
22
+ validates_integrity_of column if uploader_option(column.to_sym, :validate_integrity)
23
+ validates_processing_of column if uploader_option(column.to_sym, :validate_processing)
24
+
25
+ # Add hooks
26
+ after_save :"store_#{column}!"
27
+ before_save :"write_#{column}_identifier"
28
+ after_destroy :"remove_#{column}!"
29
+
30
+ # These hooks cannot be used until dirty tracking is implemented
31
+ #before_update :"store_previous_model_for_#{column}"
32
+ #after_save :"remove_previously_stored_#{column}"
33
+
34
+ class_eval <<-RUBY, __FILE__, __LINE__+1
35
+
36
+ public
37
+
38
+ def read_uploader(column)
39
+ self.send("#{column}_data")
40
+ end
41
+
42
+ def write_uploader(column, identifier)
43
+ self.send("#{column}_data=", identifier)
44
+ end
45
+
46
+ RUBY
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+
53
+ # Add this to all nodes and relationships (funky isn't it?)
54
+ module Architect4r
55
+ module Model
56
+ class Node
57
+ extend Architect4r::Adapters::CarrierWave
58
+ end
59
+
60
+ class Relationship
61
+ extend Architect4r::Adapters::CarrierWave
62
+ end
63
+ end
64
+ end