eac_rails_remotes 0.3.0 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a6cc86581c903002e2e9913cb8d5177fcf6584335981aafe7f635a2e6bf91793
4
- data.tar.gz: 734e7de9b68fca2663e6ec6a932169ab7580e0597f5d12d17bf48f731b23e54b
3
+ metadata.gz: b12a302c21f1a69b8e03576b69b3920f97c1feca24cfba1b98660ca9444da77d
4
+ data.tar.gz: dcd50e1ceea808433376d06d1dccd7c72959335e242c2e162b8af4216c3fd018
5
5
  SHA512:
6
- metadata.gz: bde88ca426dffcf997c6a79101d7165eb7fc3b15593650b3345772b7d8566d6355ed48fc3870d9e41160f5030a81ce558ad6adffb27b27ae5d0587df4d9f9ffb
7
- data.tar.gz: c57298ba0a909455c8b212dbabd35b9b353fae6cecc27abf320662574b85873eb43dd8780faba300bd2361fbf30726b64dfc3642353a2ebe1ece03db8769572a
6
+ metadata.gz: c422d2c1b729540570886c2c9ea98613f4dbeaa865538c67afb69cbfb66303cec22be1bb6933789b6e3e33b905de03d3a40a1c0ddf4b144c507c3361c7d2bf6f
7
+ data.tar.gz: a674d9384cf95c83dbe7ea118cce32283a10b5845f4b3a593688d27f30538cd17999b1a610e2c123a8f05ae928c7de5ed7c1f9a1d5430d96088e7ca148f92c38
@@ -6,8 +6,11 @@ module EacRailsRemotes
6
6
 
7
7
  active_scaffold :'eac_rails_remotes/instance' do |conf|
8
8
  conf.actions.exclude :create, :update
9
+ conf.list.columns = %i[entity source code export_status target created_at
10
+ updated_at]
9
11
  conf.columns[:export_status].form_ui = :select
10
12
  conf.columns[:entity].form_ui = :select
13
+ conf.columns[:target].clear_link
11
14
  conf.actions.swap :search, :field_search
12
15
  conf.field_search.columns = :entity, :export_status
13
16
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRailsRemotes
6
+ class Instance < ::ActiveRecord::Base
7
+ module ClassMethods
8
+ common_concern
9
+ class_methods do
10
+ # @param record [Hash]
11
+ # @return [EacRailsRemotes::Instance]
12
+ def import(record)
13
+ ri = where(source: record.fetch(:source), entity: sanitize_entity(record.fetch(:entity)),
14
+ code: record.fetch(:code)).first_or_initialize
15
+ ri.parsed_data = record.fetch(:data)
16
+ if ri.data_changed?
17
+ ri.export_status = EXPORT_STATUS_NEW_DATA
18
+ ri.save!
19
+ end
20
+ ri
21
+ end
22
+
23
+ # @oaram entity [Object]
24
+ # @return [String]
25
+ def sanitize_entity(entity)
26
+ entity.is_a?(::Module) ? entity.name : entity.to_s
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRailsRemotes
6
+ class Instance < ::ActiveRecord::Base
7
+ class Export < ::SimpleDelegator
8
+ acts_as_instance_method
9
+ enable_simple_cache
10
+
11
+ def result
12
+ Rails.logger.info("Exporting #{self}")
13
+ begin
14
+ filled_target.save ? update_as_ok : update_as_error
15
+ rescue ::EacRailsRemotes::Errors::TargetAssociationExport => e
16
+ update_as_association_error(e)
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ # @return [ActiveRecord::Base]
23
+ def filled_target_uncached
24
+ t = target || entity_class.new
25
+ t.attributes = target_attributes
26
+ t
27
+ end
28
+
29
+ # @return [Hash]
30
+ def target_attributes
31
+ parsed_data.map { |k, v| export_target_attribute(k, v) }.compact_blank.to_h
32
+ end
33
+
34
+ # @return [String]
35
+ def target_export_message(target)
36
+ "ATTRIBUTES: #{target.attributes}\nERRORS: #{target.errors.messages}\n"
37
+ end
38
+
39
+ # @param error [EacRailsRemotes::Errors::TargetAssociationExport]
40
+ # @return [void]
41
+ def update_as_association_error(error)
42
+ update!(export_status: EXPORT_STATUS_ERROR,
43
+ export_message: target_export_message(error.record))
44
+ end
45
+
46
+ # @return [void]
47
+ def update_as_error
48
+ update!(export_status: EXPORT_STATUS_ERROR,
49
+ export_message: target_export_message(filled_target))
50
+ end
51
+
52
+ # @return [void]
53
+ def update_as_ok
54
+ update!(export_status: EXPORT_STATUS_OK, export_message: '', target: filled_target)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRailsRemotes
6
+ class Instance < ::ActiveRecord::Base
7
+ class ExportTargetAttribute
8
+ acts_as_instance_method
9
+ enable_simple_cache
10
+ common_constructor :instance, :attribute, :value
11
+
12
+ # @return [Array]
13
+ def result
14
+ return nil unless valid?
15
+ return [attribute, value] unless entity_association_class
16
+
17
+ result_by_association
18
+ end
19
+
20
+ protected
21
+
22
+ # @return [EacRailsRemotes::Instance]
23
+ def association_record_uncached
24
+ instance.class.find_by(
25
+ source: instance.source, entity: entity_association_class.klass.name, code: value
26
+ )
27
+ end
28
+
29
+ # @return [ActiveRecord::Reflection::BelongsToReflection, nil]
30
+ def entity_association_class_uncached
31
+ instance.entity_class.reflect_on_all_associations(:belongs_to)
32
+ .find { |x| x.foreign_key.to_sym == attribute.to_sym }
33
+ end
34
+
35
+ # @return [Array]
36
+ def result_by_association
37
+ [entity_association_class.name, association_record&.assert_target]
38
+ rescue ::EacRailsRemotes::Errors::TargetExport => e
39
+ raise ::EacRailsRemotes::Errors::TargetAssociationExport.new(
40
+ instance, entity_association_class.name, e.record
41
+ )
42
+ end
43
+
44
+ # @return [Boolean]
45
+ def valid?
46
+ instance.entity_class.primary_key != attribute.to_s &&
47
+ instance.entity_class.new.respond_to?("#{attribute}=")
48
+ end
49
+ end
50
+ end
51
+ end
@@ -16,10 +16,20 @@ module EacRailsRemotes
16
16
 
17
17
  belongs_to :target, polymorphic: true, optional: true
18
18
 
19
- scope :pendent, lambda {
19
+ scope :pending, lambda {
20
20
  where.not(export_status: EXPORT_STATUS_OK)
21
21
  }
22
22
 
23
+ # @return [Object]
24
+ def parsed_data
25
+ data.if_present(nil) { |v| ::EacRubyUtils::Yaml.load(v) }
26
+ end
27
+
28
+ # @param value [Object]
29
+ def parsed_data=(value)
30
+ self.data = value.if_present(nil) { |v| ::EacRubyUtils::Yaml.dump(v) }
31
+ end
32
+
23
33
  def to_s
24
34
  "#{source}|#{entity}|#{code}"
25
35
  end
@@ -31,68 +41,14 @@ module EacRailsRemotes
31
41
  export if export_status != EXPORT_STATUS_ERROR
32
42
  return target if target.present?
33
43
 
34
- raise "Export failed (ID: #{id}, export message: \"#{export_message}\""
35
- end
36
-
37
- def export
38
- Rails.logger.info("Exporting #{self}")
39
- t = target || entity_class.new
40
- t.attributes = target_attributes
41
- if t.save
42
- update!(export_status: EXPORT_STATUS_OK, export_message: '', target: t)
43
- else
44
- update!(export_status: EXPORT_STATUS_ERROR,
45
- export_message: target_export_message(t))
46
- end
47
- end
48
-
49
- private
50
-
51
- def target_attributes
52
- EacRubyUtils::Yaml.load(data).to_h { |k, v| target_attribute(k, v) }
53
- end
54
-
55
- def target_attribute(attr, value)
56
- a = entity_association_class(attr)
57
- return [attr, value] unless a
58
-
59
- ri = self.class.find_by(source: source, entity: a.klass.name, code: value)
60
- [a.name, ri&.target]
61
- end
62
-
63
- # @return [ActiveRecord::Reflection::BelongsToReflection, nil]
64
- def entity_association_class(attribute)
65
- entity_class.reflect_on_all_associations(:belongs_to)
66
- .find { |x| x.foreign_key.to_sym == attribute.to_sym }
44
+ raise ::EacRailsRemotes::Errors::TargetExport, self
67
45
  end
68
46
 
47
+ # @return [Class<ActiveRecord::Base>]
69
48
  def entity_class
70
49
  entity.constantize
71
50
  end
72
51
 
73
- def target_export_message(target)
74
- "ATTRIBUTES: #{target.attributes}\nERRORS: #{target.errors.messages}\n"
75
- end
76
-
77
- class << self
78
- # @param record [Hash]
79
- # @return [EacRailsRemotes::Instance]
80
- def import(record)
81
- ri = where(source: record.fetch(:source), entity: sanitize_entity(record.fetch(:entity)),
82
- code: record.fetch(:code)).first_or_initialize
83
- ri.data = record.fetch(:data).to_yaml
84
- if ri.data_changed?
85
- ri.export_status = EXPORT_STATUS_NEW_DATA
86
- ri.save!
87
- end
88
- ri
89
- end
90
-
91
- # @oaram entity [Object]
92
- # @return [String]
93
- def sanitize_entity(entity)
94
- entity.is_a?(::Module) ? entity.name : entity.to_s
95
- end
96
- end
52
+ require_sub __FILE__, require_mode: :kernel, include_modules: true
97
53
  end
98
54
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRailsRemotes
4
+ module Errors
5
+ class TargetAssociationExport < ::EacRailsRemotes::Errors::TargetExport
6
+ attr_reader :association_name, :owner_record
7
+
8
+ def initialize(association_record, association_name, owner_record)
9
+ super(association_record)
10
+ @association_name = association_name
11
+ @owner_record = owner_record
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRailsRemotes
4
+ module Errors
5
+ class TargetExport < ::RuntimeError
6
+ attr_reader :record
7
+
8
+ def initialize(record)
9
+ super("Export failed (ID: #{record.id}, export message: \"#{record.export_message}\")")
10
+ @record = record
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,7 +3,7 @@
3
3
  module EacRailsRemotes
4
4
  class ExportAll
5
5
  def perform
6
- ::EacRailsRemotes::Instance.pendent.each(&:export)
6
+ ::EacRailsRemotes::Instance.pending.each(&:export)
7
7
  end
8
8
  end
9
9
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRailsRemotes
4
- VERSION = '0.3.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/core_ext'
3
+ require 'eac_ruby_utils'
4
+ EacRubyUtils::RootModuleSetup.perform __FILE__
4
5
 
5
6
  module EacRailsRemotes
6
- require_sub __FILE__
7
7
  end
8
+
9
+ require 'eac_active_scaffold'
10
+ require 'eac_rails_utils'
11
+
12
+ require 'eac_rails_remotes/engine'
@@ -8,6 +8,6 @@ namespace :eac_rails_remotes do
8
8
 
9
9
  desc 'Export pending remote instances'
10
10
  task export_all: :environment do |_t, _args|
11
- EacRailsRemotes::Instance.pendent.each(&:export)
11
+ EacRailsRemotes::Instance.pending.each(&:export)
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_rails_remotes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Put here the authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-05 00:00:00.000000000 Z
11
+ date: 2025-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eac_active_scaffold
@@ -16,88 +16,62 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.6'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 0.6.1
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '0.6'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 0.6.1
33
- - !ruby/object:Gem::Dependency
34
- name: eac_rails_gem_support
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '0.10'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 0.10.1
19
+ version: '0.7'
43
20
  type: :runtime
44
21
  prerelease: false
45
22
  version_requirements: !ruby/object:Gem::Requirement
46
23
  requirements:
47
24
  - - "~>"
48
25
  - !ruby/object:Gem::Version
49
- version: '0.10'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 0.10.1
26
+ version: '0.7'
53
27
  - !ruby/object:Gem::Dependency
54
28
  name: eac_rails_utils
55
29
  requirement: !ruby/object:Gem::Requirement
56
30
  requirements:
57
31
  - - "~>"
58
32
  - !ruby/object:Gem::Version
59
- version: '0.24'
33
+ version: '0.26'
60
34
  type: :runtime
61
35
  prerelease: false
62
36
  version_requirements: !ruby/object:Gem::Requirement
63
37
  requirements:
64
38
  - - "~>"
65
39
  - !ruby/object:Gem::Version
66
- version: '0.24'
40
+ version: '0.26'
67
41
  - !ruby/object:Gem::Dependency
68
42
  name: eac_ruby_utils
69
43
  requirement: !ruby/object:Gem::Requirement
70
44
  requirements:
71
45
  - - "~>"
72
46
  - !ruby/object:Gem::Version
73
- version: '0.122'
47
+ version: '0.128'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.128.3
74
51
  type: :runtime
75
52
  prerelease: false
76
53
  version_requirements: !ruby/object:Gem::Requirement
77
54
  requirements:
78
55
  - - "~>"
79
56
  - !ruby/object:Gem::Version
80
- version: '0.122'
57
+ version: '0.128'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.128.3
81
61
  - !ruby/object:Gem::Dependency
82
62
  name: eac_rails_gem_support
83
63
  requirement: !ruby/object:Gem::Requirement
84
64
  requirements:
85
65
  - - "~>"
86
66
  - !ruby/object:Gem::Version
87
- version: '0.9'
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- version: 0.9.1
67
+ version: '0.11'
91
68
  type: :development
92
69
  prerelease: false
93
70
  version_requirements: !ruby/object:Gem::Requirement
94
71
  requirements:
95
72
  - - "~>"
96
73
  - !ruby/object:Gem::Version
97
- version: '0.9'
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- version: 0.9.1
74
+ version: '0.11'
101
75
  description:
102
76
  email:
103
77
  executables: []
@@ -108,6 +82,9 @@ files:
108
82
  - app/assets/stylesheets/eac_rails_remotes/application.scss
109
83
  - app/controllers/eac_rails_remotes/instances_controller.rb
110
84
  - app/models/eac_rails_remotes/instance.rb
85
+ - app/models/eac_rails_remotes/instance/class_methods.rb
86
+ - app/models/eac_rails_remotes/instance/export.rb
87
+ - app/models/eac_rails_remotes/instance/export_target_attribute.rb
111
88
  - config/initializers/menus.rb
112
89
  - config/locales/en.yml
113
90
  - config/locales/pt-BR.yml
@@ -115,6 +92,8 @@ files:
115
92
  - db/migrate/20230521002623_create_eac_rails_remotes_instances.rb
116
93
  - lib/eac_rails_remotes.rb
117
94
  - lib/eac_rails_remotes/engine.rb
95
+ - lib/eac_rails_remotes/errors/target_association_export.rb
96
+ - lib/eac_rails_remotes/errors/target_export.rb
118
97
  - lib/eac_rails_remotes/export_all.rb
119
98
  - lib/eac_rails_remotes/import_file.rb
120
99
  - lib/eac_rails_remotes/version.rb