infopark_reactor 1.10.0.beta → 1.11.0.beta2

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/rails_connector/abstract_model.rb +7 -0
  3. data/app/models/rails_connector/abstract_obj.rb +31 -0
  4. data/app/models/rails_connector/attribute.rb +94 -0
  5. data/app/models/rails_connector/blob_mapping.rb +12 -0
  6. data/app/models/rails_connector/channel.rb +41 -0
  7. data/app/models/rails_connector/content.rb +12 -0
  8. data/app/models/rails_connector/meta/eager_loader.rb +41 -0
  9. data/app/models/rails_connector/obj_class.rb +143 -0
  10. data/app/models/rails_connector/object_with_meta_data.rb +18 -0
  11. data/infopark_reactor.gemspec +4 -4
  12. data/lib/generators/cm/migration/USAGE +8 -0
  13. data/lib/generators/cm/migration/migration_generator.rb +16 -0
  14. data/lib/generators/cm/migration/templates/template.rb +8 -0
  15. data/lib/infopark_reactor.rb +35 -1
  16. data/lib/reactor/attributes.rb +2 -4
  17. data/lib/reactor/cm/attribute.rb +91 -0
  18. data/lib/reactor/cm/bridge.rb +50 -0
  19. data/lib/reactor/cm/channel.rb +18 -0
  20. data/lib/reactor/cm/editorial_group.rb +23 -0
  21. data/lib/reactor/cm/group.rb +241 -0
  22. data/lib/reactor/cm/language.rb +57 -0
  23. data/lib/reactor/cm/link.rb +136 -0
  24. data/lib/reactor/cm/live_group.rb +23 -0
  25. data/lib/reactor/cm/log_entry.rb +64 -0
  26. data/lib/reactor/cm/missing_credentials.rb +8 -0
  27. data/lib/reactor/cm/multi_xml_request.rb +102 -0
  28. data/lib/reactor/cm/obj.rb +544 -0
  29. data/lib/reactor/cm/obj_class.rb +187 -0
  30. data/lib/reactor/cm/object_base.rb +165 -0
  31. data/lib/reactor/cm/permissions.rb +44 -0
  32. data/lib/reactor/cm/user.rb +139 -0
  33. data/lib/reactor/cm/workflow.rb +41 -0
  34. data/lib/reactor/cm/xml_attribute.rb +36 -0
  35. data/lib/reactor/cm/xml_markup.rb +86 -0
  36. data/lib/reactor/cm/xml_multi_request_error.rb +10 -0
  37. data/lib/reactor/cm/xml_request.rb +83 -0
  38. data/lib/reactor/cm/xml_request_error.rb +11 -0
  39. data/lib/reactor/cm/xml_response.rb +43 -0
  40. data/lib/reactor/cm/xml_single_request_error.rb +21 -0
  41. data/lib/reactor/configuration.rb +8 -0
  42. data/lib/{engine.rb → reactor/engine.rb} +16 -1
  43. data/lib/reactor/legacy.rb +3 -3
  44. data/lib/reactor/link/temporary_link.rb +8 -4
  45. data/lib/reactor/migration.rb +87 -0
  46. data/lib/reactor/permission.rb +2 -2
  47. data/lib/reactor/persistence.rb +14 -12
  48. data/lib/reactor/plans/common_attribute.rb +33 -0
  49. data/lib/reactor/plans/common_channel.rb +32 -0
  50. data/lib/reactor/plans/common_group.rb +45 -0
  51. data/lib/reactor/plans/common_obj_class.rb +70 -0
  52. data/lib/reactor/plans/create_attribute.rb +33 -0
  53. data/lib/reactor/plans/create_channel.rb +24 -0
  54. data/lib/reactor/plans/create_group.rb +35 -0
  55. data/lib/reactor/plans/create_obj.rb +49 -0
  56. data/lib/reactor/plans/create_obj_class.rb +29 -0
  57. data/lib/reactor/plans/delete_attribute.rb +24 -0
  58. data/lib/reactor/plans/delete_channel.rb +22 -0
  59. data/lib/reactor/plans/delete_group.rb +29 -0
  60. data/lib/reactor/plans/delete_obj.rb +23 -0
  61. data/lib/reactor/plans/delete_obj_class.rb +23 -0
  62. data/lib/reactor/plans/prepared.rb +16 -0
  63. data/lib/reactor/plans/rename_group.rb +33 -0
  64. data/lib/reactor/plans/rename_obj_class.rb +25 -0
  65. data/lib/reactor/plans/update_attribute.rb +24 -0
  66. data/lib/reactor/plans/update_group.rb +31 -0
  67. data/lib/reactor/plans/update_obj.rb +31 -0
  68. data/lib/reactor/plans/update_obj_class.rb +27 -0
  69. data/lib/reactor/rails_connector_meta.rb +144 -0
  70. data/lib/reactor/tools/migrator.rb +136 -0
  71. data/lib/reactor/tools/response_handler/base.rb +23 -0
  72. data/lib/reactor/tools/response_handler/string.rb +20 -0
  73. data/lib/reactor/tools/response_handler/xml_attribute.rb +53 -0
  74. data/lib/reactor/tools/smart_xml_logger.rb +70 -0
  75. data/lib/reactor/tools/sower.rb +90 -0
  76. data/lib/reactor/tools/uploader.rb +134 -0
  77. data/lib/reactor/tools/versioner.rb +121 -0
  78. data/lib/reactor/tools/workflow_generator.rb +1 -1
  79. data/lib/reactor/tools/xml_attributes.rb +71 -0
  80. data/lib/reactor/version.rb +1 -1
  81. data/lib/tasks/cm_migrate.rake +8 -0
  82. data/lib/tasks/cm_seeds.rake +41 -0
  83. metadata +82 -13
  84. data/README.md +0 -186
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 58b80269428f681b9bd1375c20c6640c7aa0160e
4
- data.tar.gz: e26a90fb05c668147402917ba45fb94bc769f00b
3
+ metadata.gz: 2649a34240ebf7ba0254b206e929f8d80be1f4ad
4
+ data.tar.gz: 31b0f374168394beb5f1de509a0e201ce8b64f33
5
5
  SHA512:
6
- metadata.gz: 5c4ce7c7f0a82236966a5e0b3649aa5de302e3f5bd57dec6a90143b1d3380bb70e9cd63bd1682e484572f9ef24a20a994c9ebbbd76f02fb67dab2a38cf023bb5
7
- data.tar.gz: 345721a55faaaf7f0cc400f4d31e9db040d648645fe18ec22114c2615e8cbb21af3f02fcd633e2f92d866664af85928b053f95a2b422124a0865eed0de4e471e
6
+ metadata.gz: 1c119f9285fa51ff038cb37d40628bdc606d57022d0d4d91c6b0e4d3195ca1342b31ea6f89014b8f9710a7fc25cb03ccf04fd7fa9581ba1e80b24be448120801
7
+ data.tar.gz: 13d83fbc668a9b4d211b5f339a7bafe9ef658e7fcb06a892c0f17a3f96c5e0443cc00b7d15bfd1ec23959f45dd40560df9c39c06a8cb2cd430835a7e2b5deb30
@@ -0,0 +1,7 @@
1
+ module RailsConnector
2
+ AbstractModel = begin
3
+ ::RailsConnector::InfoparkBase
4
+ rescue NameError
5
+ ::RailsConnector::CmsBaseModel
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ module RailsConnector
2
+ # This trick is a workaround to provide compatiblity with both
3
+ # ObjExtensions-enabled versions (older versions) and ObjExtensions-deprecated
4
+ # versions (newest versions) of RailsConnector
5
+ #
6
+ # It first tries to use user-defined Obj class in the newest RailsConnector,
7
+ # which is also an alias for RailsConnector::Obj in the older RailsConnector.
8
+ # If that fails it falls back to ::RailsConnector::BasicObj (new)
9
+ # or ::RailsConnector::Obj (old).
10
+ # The last case shouldn't really ever happen.
11
+ root_class = begin
12
+ ::RailsConnector::BasicObj
13
+ rescue NameError
14
+ ::RailsConnector::Obj
15
+ end
16
+ AbstractObj = begin
17
+ if ::Obj < root_class
18
+ ::Obj
19
+ else
20
+ root_class
21
+ end
22
+ rescue NameError
23
+ root_class
24
+ end
25
+
26
+ class AbstractObj
27
+ def self.compute_type(type_name)
28
+ try_type { type_name.constantize } || self
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,94 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+
4
+ # The methods date?, enum?, html?, linklist?, markdown?, multienum?, string? and
5
+ # text? are created by meta programming have no documentation of their own.
6
+ # Warning: Dependent on the setup of your DB replication, most tables
7
+ # with meta information will not be available on your live system!
8
+ class Attribute < RailsConnector::AbstractModel
9
+
10
+ # The possible types of an attribute.
11
+ TYPES = %w{date enum html linklist markdown multienum string text}
12
+
13
+ self.primary_key = :attribute_id
14
+
15
+ has_and_belongs_to_many :obj_class_definitions, :class_name => '::RailsConnector::ObjClass',
16
+ :join_table => "#{table_name_prefix}obj_class_attrs"
17
+
18
+ alias_method :obj_class_defs, :obj_class_definitions
19
+ alias_attribute :name, :attribute_name
20
+
21
+ # The (human readable) title.
22
+ def title(language = :de)
23
+ load_blob_data
24
+ @blob_data['titles'].presence && @blob_data['titles'][language.to_s]
25
+ end
26
+
27
+ # The description of the attribute.
28
+ def help_text(language = :de)
29
+ load_blob_data
30
+ @blob_data['helpTexts'].presence && @blob_data['helpTexts'][language.to_s]
31
+ end
32
+
33
+ # Searchable in Content Manager.
34
+ def searchable_in_cm?
35
+ load_blob_data
36
+ @blob_data['isSearchableInCM'].to_i != 0
37
+ end
38
+
39
+ # Returns the possible values if attribute is of type `enum' or `multienum'.
40
+ def values
41
+ load_blob_data
42
+ @blob_data['values']
43
+ end
44
+
45
+ def max_size
46
+ load_blob_data
47
+ @blob_data["maxSize"]
48
+ end
49
+
50
+ def min_size
51
+ load_blob_data
52
+ @blob_data["minSize"]
53
+ end
54
+
55
+ TYPES.each do |type|
56
+ self.class_eval <<EOM, __FILE__, __LINE__ + 1
57
+ def #{type}?
58
+ self.attribute_type == "#{type}"
59
+ end
60
+ EOM
61
+ end
62
+
63
+ # Convenience method for find_by_attribute_name
64
+ def self.find_by_name(*args)
65
+ self.find_by_attribute_name(*args)
66
+ end
67
+
68
+ # Returns the blob as a JSON object.
69
+ def self.read_blob_data(name) #:nodoc:
70
+ blob = RailsConnector::Meta.hello_im_rails_and_im_retarted_so_please_be_patient do # these queries really pollute our logs!
71
+ blob_name = if RailsConnector::BlobMapping.exists?
72
+ RailsConnector::BlobMapping.get_fingerprint("#{name}.jsonAttributeDict")
73
+ else
74
+ "#{name}.jsonAttributeDict"
75
+ end
76
+
77
+ RailsConnector::Blob.find_without_excluded_blob_data(blob_name)
78
+ end
79
+
80
+ return {} unless blob && blob.blob_data?
81
+
82
+ JSON.parse(blob.blob_data)
83
+ end
84
+
85
+ private
86
+
87
+ # load attribute details from blob
88
+ def load_blob_data #:nodoc:
89
+ @blob_data ||= self.class.read_blob_data(self.attribute_name)
90
+ end
91
+
92
+ end
93
+
94
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+ class BlobMapping < RailsConnector::AbstractModel
4
+ def self.exists?
5
+ self.table_exists?
6
+ end
7
+
8
+ def self.get_fingerprint(name)
9
+ find_by_blob_name(name).fingerprint
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ # -*- encoding : utf-8 -*-
2
+ # @author Anton Mezin
3
+ module RailsConnector
4
+ class Channel < AbstractModel
5
+ self.primary_key = "channel_name"
6
+
7
+ def self.table_name
8
+ "#{table_name_prefix}" "channels"
9
+ end
10
+
11
+ has_many :news, :class_name => 'News', :foreign_key => 'channel_name'
12
+
13
+ if ::Rails::VERSION::MAJOR == 4
14
+
15
+ has_many :active_news,
16
+ lambda { where(['valid_from <= :now AND valid_until >= :now', {:now => Time.now.to_s(:number)}]) },
17
+ :class_name => 'News', :foreign_key => 'channel_name'
18
+
19
+ if ::Rails::VERSION::MINOR >= 1
20
+
21
+ def self.scoped
22
+ self.where(nil)
23
+ end
24
+
25
+ end
26
+
27
+ elsif ::Rails::VERSION::MAJOR == 3
28
+
29
+ has_many :active_news, :class_name => 'News', :foreign_key => 'channel_name',
30
+ :conditions => ['valid_from <= :now AND valid_until >= :now', {:now => Time.now.to_s(:number)}]
31
+
32
+ end
33
+
34
+ has_many :objects, :through => :news
35
+
36
+ def self.with_prefix(prefix)
37
+ scoped.where(["channel_name LIKE ?", "#{prefix}%"])
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+
4
+ # This class allows us to read out the editor of an Obj,
5
+ # if it has edited content
6
+ class Content < RailsConnector::AbstractModel
7
+
8
+ self.primary_key = :content_id
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,41 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'singleton'
3
+
4
+ module RailsConnector
5
+ module Meta
6
+ class EagerLoader
7
+ include Singleton
8
+ def initialize
9
+ # Rails.logger.debug "EagerLoader: I am eager to start working"
10
+ @obj_classes = {}
11
+ # Rails 3.1 contains a bug that screws attribute loading
12
+ # attributes are set to assigned classes
13
+ if ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MINOR == 1
14
+ RailsConnector::ObjClass.all.each do |obj_class|
15
+ obj_class.custom_attributes
16
+ @obj_classes[obj_class.name] = obj_class
17
+ end
18
+ else
19
+ RailsConnector::ObjClass.includes(:custom_attributes_raw).all.each do |obj_class|
20
+ @obj_classes[obj_class.name] = obj_class
21
+ end
22
+ end
23
+ end
24
+
25
+ def obj_class(name)
26
+ name = name.to_s
27
+ if !@obj_classes.fetch(name, nil).nil?
28
+ # puts "EagerLoader: I've already loaded it: #{name}"
29
+ @obj_classes[name]
30
+ else
31
+ # puts "EagerLoader: NO HAVE: #{name}"
32
+ @obj_classes[name] ||= RailsConnector::ObjClass.find_by_obj_class_name(name)
33
+ end
34
+ end
35
+
36
+ def forget_obj_class(name)
37
+ @obj_classes.delete(name.to_s)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,143 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+
4
+ # This class is used to read out the custom attributes,
5
+ # mandatory attributes and titles of an Obj.
6
+ # Warning: Dependent on the setup of your DB replication, most tables
7
+ # with meta information will not be available on your live system!
8
+ class ObjClass < RailsConnector::AbstractModel
9
+
10
+ self.primary_key = :obj_class_id
11
+
12
+ has_and_belongs_to_many :custom_attributes_raw, :class_name => '::RailsConnector::Attribute',
13
+ :join_table => "#{table_name_prefix}obj_class_attrs"
14
+
15
+ alias_attribute :name, :obj_class_name
16
+
17
+ # Returns the title of the file format or nil, if it was not set.
18
+ def title(language)
19
+ self.titles[language.to_s].presence
20
+ end
21
+
22
+ # Returns all titles as a Hash.
23
+ def titles
24
+ load_blob_data
25
+ @blob_data['titles'] || {}
26
+ end
27
+
28
+ # returns channel feature is_activate?
29
+ def can_create_news_items?
30
+ load_blob_data
31
+ @blob_data['canCreateNewsItems'].to_i != 0
32
+ end
33
+
34
+ def enabled?
35
+ is_enabled == 1
36
+ end
37
+
38
+ # Returns the custom Ruby class or RailsConnector::AbstractObj.
39
+ def ruby_class
40
+ # this must be the same algorithm that the rest of the RailsConnector uses!
41
+ RailsConnector::AbstractObj.compute_type(self.name)
42
+ end
43
+
44
+ # Returns true, if a custom Ruby class exists.
45
+ def has_custom_ruby_class?
46
+ self.ruby_class.present? && self.ruby_class != RailsConnector::AbstractObj &&
47
+ self.ruby_class.ancestors.include?(RailsConnector::AbstractObj)
48
+ end
49
+
50
+ # Returns the custom attributes in the form of a Hash.
51
+ def custom_attributes
52
+ # return the cached data
53
+ return @custom_attributes if @custom_attributes
54
+
55
+ # create a Hash (with indifferent access) out of an Array of ActiveRecord objects
56
+ @custom_attributes = self.custom_attributes_raw.map do |attr|
57
+ {attr.attribute_name => attr}
58
+ end.reduce(HashWithIndifferentAccess.new, &:merge)
59
+ end
60
+
61
+ # Returns true, if the Obj Class has an attribute of the given name.
62
+ def custom_attribute?(attr)
63
+ self.custom_attributes.key?(attr)
64
+ end
65
+
66
+ # Returns an Array of String of all mandatory attributes found for this ObjClass,
67
+ # no matter if it is a custom or built-in attribute. Built-in attributes
68
+ # are underscored (valid_from, not validFrom).
69
+ # Possible +options+ are:
70
+ # <tt>:only_custom_attributes</tt>:: Return only custom attributes, omit
71
+ # built-in attributes like content_type or valid_from.
72
+ def mandatory_attribute_names(options = {})
73
+ only_custom_attributes ||= options[:only_custom_attributes] || false
74
+ build_mandatory_attribute_arrays
75
+ return @mandatory_custom_attributes if only_custom_attributes
76
+ @mandatory_attributes
77
+ end
78
+
79
+ # Returns true, if the file format has an mandatory attribute of the given name.
80
+ def mandatory_attribute?(attr)
81
+ self.mandatory_attribute_names.include?(attr.to_s)
82
+ end
83
+
84
+ # Convenience method for find_by_obj_class_name
85
+ def self.find_by_name(*args)
86
+ self.find_by_obj_class_name(*args)
87
+ end
88
+
89
+ # Reads a whole bunch of data, where only some of it is useful
90
+ # in a Rails application:
91
+ # attributeGroups, availableBlobEditors, bodyTemplateName,
92
+ # canCreateNewsItems, completionCheck, mandatoryAttributes,
93
+ # presetAttributes, recordSetCallback, titles, validSubObjClassCheck,
94
+ # workflowModification
95
+ def self.read_blob_data(name) #:nodoc:
96
+ blob = RailsConnector::Meta.hello_im_rails_and_im_retarted_so_please_be_patient do # these queries really pollute our logs!
97
+ blob_name = if RailsConnector::BlobMapping.exists?
98
+ RailsConnector::BlobMapping.get_fingerprint("#{name}.jsonObjClassDict")
99
+ else
100
+ "#{name}.jsonObjClassDict"
101
+ end
102
+
103
+ RailsConnector::Blob.find_without_excluded_blob_data(blob_name)
104
+ end
105
+
106
+ return {} unless blob && blob.blob_data?
107
+
108
+ JSON.parse(blob.blob_data)
109
+ end
110
+
111
+ private
112
+
113
+ def load_blob_data #:nodoc:
114
+ return if @blob_data
115
+
116
+ @blob_data = self.class.read_blob_data(self.name)
117
+
118
+ # reset depending instance variables
119
+ @mandatory_custom_attributes = @mandatory_attributes = nil
120
+ end
121
+
122
+ def build_mandatory_attribute_arrays #:nodoc:
123
+ return if @mandatory_attributes
124
+
125
+ load_blob_data
126
+
127
+ @mandatory_custom_attributes = []
128
+ @mandatory_attributes = []
129
+ (@blob_data['mandatoryAttributes'] || []).each do |attr|
130
+ attr_name = attr.to_s
131
+ if self.custom_attribute?(attr_name)
132
+ @mandatory_custom_attributes << attr_name
133
+ else
134
+ # only modify built-in attributes; i.e. `validFrom` will become `valid_from`
135
+ attr_name = attr_name.underscore
136
+ end
137
+ @mandatory_attributes << attr_name
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ end
@@ -0,0 +1,18 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RailsConnector
3
+
4
+ # This class allows us to read out the version and
5
+ # the reminder information of an Obj
6
+ class ObjectWithMetaData < RailsConnector::AbstractModel #:nodoc:
7
+
8
+ # If we name the class Object, conflicts with the plain Ruby
9
+ # objects inside the RailsConnector will occur.
10
+ def self.table_name
11
+ "#{table_name_prefix}" "objects"
12
+ end
13
+
14
+ self.primary_key = :object_id
15
+
16
+ end
17
+
18
+ end
@@ -18,12 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.files = `git ls-files`.split("\n")
19
19
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
- s.require_paths = ["lib", "lib/tools"]
21
+ s.require_paths = ["lib"]
22
22
 
23
- s.add_dependency 'rails', '>= 3.0.10', '<= 4.1.0'
24
- s.add_dependency 'infopark_reactor_migrations', '>= 1.7.2'
23
+ s.add_dependency 'rails', '>= 3.0.10', '<= 4.2.0'
25
24
  #s.add_dependency 'infopark_rails_connector'
26
- s.add_dependency 'infopark_rails_connector_meta', '>= 1.7.2'
25
+ s.add_dependency 'nokogiri'
26
+ s.add_dependency 'term-ansicolor'
27
27
 
28
28
  s.add_development_dependency 'rspec'
29
29
  s.add_development_dependency 'yard'
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Creates CM Migration with given name. Name should be CamelCased.
3
+
4
+ Example:
5
+ rails g cm:migration MigrationName
6
+
7
+ This will create:
8
+ cm/migration/[timestamp]_migration_name.rb
@@ -0,0 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Cm
3
+ module Generators
4
+ class MigrationGenerator < Rails::Generators::NamedBase
5
+ include Rails::Generators::Migration
6
+ def self.next_migration_number(dirname)
7
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
8
+ end
9
+
10
+ source_root File.expand_path('../templates', __FILE__)
11
+ def create_migration_file
12
+ migration_template "template.rb", "cm/migrate/#{file_name}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class <%= class_name %> < Reactor::Migration
3
+ def self.up
4
+ end
5
+
6
+ def self.down
7
+ end
8
+ end
@@ -17,10 +17,43 @@ module Reactor
17
17
  ::Rails::VERSION::MAJOR == 4 && ::Rails::VERSION::MINOR == 0
18
18
  end
19
19
 
20
+ def self.rails4_1?
21
+ ::Rails::VERSION::MAJOR == 4 && ::Rails::VERSION::MINOR == 1
22
+ end
23
+
20
24
  def self.rails4_0_ge6?
21
25
  ::Rails::VERSION::MAJOR == 4 && ::Rails::VERSION::MINOR == 0 && ::Rails::VERSION::TINY >= 6
22
26
  end
23
27
  end
28
+ # require config
29
+ require 'reactor/configuration'
30
+
31
+
32
+ # require components
33
+ require 'reactor/cm/bridge'
34
+ require 'reactor/cm/language'
35
+ require 'reactor/cm/object_base'
36
+ require 'reactor/cm/user'
37
+ require 'reactor/cm/attribute'
38
+ require 'reactor/cm/obj'
39
+ require 'reactor/cm/obj_class'
40
+ require 'reactor/cm/link'
41
+ require 'reactor/cm/group'
42
+ require 'reactor/cm/editorial_group'
43
+ require 'reactor/cm/live_group'
44
+ require 'reactor/cm/workflow'
45
+ require 'reactor/cm/log_entry'
46
+ require 'reactor/cm/channel'
47
+
48
+ # require main class
49
+ require 'reactor/migration'
50
+
51
+ # require misc
52
+ require 'reactor/cm/xml_request_error'
53
+ require 'reactor/cm/missing_credentials'
54
+
55
+ # require public tools
56
+ require 'reactor/tools/uploader'
24
57
 
25
58
  # require exceptions
26
59
  require 'reactor/already_released'
@@ -37,10 +70,11 @@ require 'reactor/rc_independent'
37
70
  require 'reactor/sudo'
38
71
  require 'reactor/workflow'
39
72
  require 'reactor/streaming_upload'
73
+ require 'reactor/rails_connector_meta'
40
74
 
41
75
  # require rails integration
42
76
  require 'reactor/session'
43
77
  require 'reactor/session/user'
44
78
 
45
79
  # require engine
46
- require File.expand_path('../engine', __FILE__) if defined?(Rails)
80
+ require File.expand_path('../reactor/engine', __FILE__) if defined?(Rails)
@@ -105,7 +105,7 @@ module Reactor
105
105
  end
106
106
  end
107
107
 
108
- [:main_content, :contentType].each do |attribute|
108
+ [:contentType].each do |attribute|
109
109
  writers << attribute.to_sym
110
110
  writers << attribute.to_s.underscore.to_sym
111
111
  end
@@ -268,13 +268,11 @@ module Reactor
268
268
  end
269
269
 
270
270
  def resolve_attribute_alias(key)
271
- key = :body if key == :main_content
272
271
  key
273
272
  end
274
273
 
275
274
  def key_to_attr(key)
276
275
  @__attribute_map ||= {
277
- :main_content => :blob,
278
276
  :body => :blob,
279
277
  :valid_until => :validUntil,
280
278
  :valid_from => :validFrom,
@@ -337,7 +335,7 @@ module Reactor
337
335
  def path=(*args) ; super ; end
338
336
 
339
337
  def attribute_type(attr)
340
- return :html if [:body, :blob, :main_content].include?(attr.to_sym)
338
+ return :html if [:body, :blob].include?(attr.to_sym)
341
339
  return :date if [:valid_from, :valid_until, :last_changed].include?(attr.to_sym)
342
340
  return :string if [:name, :title, :obj_class, :permalink].include?(attr.to_sym)
343
341
  return :multienum if [:channels].include?(attr.to_sym)
@@ -0,0 +1,91 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Reactor
3
+ module Cm
4
+ class Attribute
5
+ def self.exists?(name)
6
+ begin
7
+ return Attribute.new.send(:get,name).ok?
8
+ rescue
9
+ return false
10
+ end
11
+ end
12
+
13
+ def self.instance(name)
14
+ attr = Attribute.new
15
+ attr.instance_variable_set('@name', name)
16
+ attr
17
+ end
18
+
19
+ def self.get(name)
20
+ attr = Attribute.new
21
+ attr.send(:get,name)
22
+ attr
23
+ end
24
+
25
+ def self.create(name, type)
26
+ attr = Attribute.new
27
+ attr.send(:create,name,type)
28
+ attr
29
+ end
30
+
31
+ def set(key, value)
32
+ @params[key.to_sym] = value
33
+ end
34
+
35
+ def save!
36
+ request = XmlRequest.prepare do |xml|
37
+ xml.where_key_tag!(base_name, 'name', @name)
38
+ xml.set_tag!(base_name) do
39
+ @params.each do |key, value|
40
+ xml.value_tag!(key.to_s, value)
41
+ end
42
+ end
43
+ end
44
+ response = request.execute!
45
+ end
46
+
47
+ def delete!
48
+ request = XmlRequest.prepare do |xml|
49
+ xml.where_key_tag!(base_name, 'name', @name)
50
+ xml.tag!("#{base_name}-delete")
51
+ end
52
+ response = request.execute!
53
+ end
54
+
55
+ protected
56
+ def base_name
57
+ 'attribute'
58
+ end
59
+
60
+ def initialize
61
+ @params = {}
62
+ end
63
+
64
+ def get(name)
65
+ request = XmlRequest.prepare do |xml|
66
+ xml.where_key_tag!(base_name, 'name', name)
67
+ xml.get_key_tag!(base_name, 'name')
68
+ end
69
+ response = request.execute!
70
+ @name = name
71
+ response
72
+ end
73
+
74
+ def create(name, type)
75
+ request = XmlRequest.prepare do |xml|
76
+ xml.create_tag!(base_name) do
77
+ xml.tag!('name') do
78
+ xml.text!(name)
79
+ end
80
+ xml.tag!('type') do
81
+ xml.text!(type)
82
+ end
83
+ end
84
+ end
85
+ response = request.execute!
86
+ @name = name
87
+ response
88
+ end
89
+ end
90
+ end
91
+ end