railjet 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +44 -0
- data/.rspec +2 -0
- data/.ruby-gemset +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +96 -0
- data/LICENSE.txt +21 -0
- data/README.md +250 -0
- data/Rakefile +17 -0
- data/VERSION +1 -0
- data/bin/bundler +17 -0
- data/bin/coderay +17 -0
- data/bin/console +14 -0
- data/bin/htmldiff +17 -0
- data/bin/ldiff +17 -0
- data/bin/pry +17 -0
- data/bin/rake +17 -0
- data/bin/rspec +17 -0
- data/bin/setup +8 -0
- data/lib/active_model/merge_errors.rb +22 -0
- data/lib/gettext_i18n/translate_attributes.rb +73 -0
- data/lib/railjet.rb +46 -0
- data/lib/railjet/auth/ability.rb +20 -0
- data/lib/railjet/auth/activity.rb +12 -0
- data/lib/railjet/composed_policy.rb +41 -0
- data/lib/railjet/context.rb +32 -0
- data/lib/railjet/form.rb +10 -0
- data/lib/railjet/policy.rb +26 -0
- data/lib/railjet/railtie.rb +7 -0
- data/lib/railjet/repository.rb +34 -0
- data/lib/railjet/repository/active_record.rb +54 -0
- data/lib/railjet/repository/cupido.rb +34 -0
- data/lib/railjet/repository/registry.rb +71 -0
- data/lib/railjet/use_case.rb +65 -0
- data/lib/railjet/util/form_helper.rb +26 -0
- data/lib/railjet/util/policy_helper.rb +9 -0
- data/lib/railjet/util/use_case_helper.rb +9 -0
- data/lib/railjet/validator.rb +15 -0
- data/lib/railjet/version.rb +3 -0
- data/lib/tasks/gettext_i18n.rake +36 -0
- data/railjet.gemspec +33 -0
- metadata +226 -0
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
# RSpec rake tasks
|
4
|
+
require "rspec/core/rake_task"
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
# Version rake tasks
|
10
|
+
require 'rake-version'
|
11
|
+
|
12
|
+
RakeVersion::Tasks.new do |v|
|
13
|
+
v.copy 'lib/railjet/version.rb'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Rubygems rake tasks
|
17
|
+
require "bundler/gem_tasks"
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.1
|
data/bin/bundler
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'bundler' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("bundler", "bundler")
|
data/bin/coderay
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'coderay' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("coderay", "coderay")
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "railjet"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/htmldiff
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'htmldiff' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("diff-lcs", "htmldiff")
|
data/bin/ldiff
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'ldiff' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("diff-lcs", "ldiff")
|
data/bin/pry
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'pry' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("pry", "pry")
|
data/bin/rake
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'rake' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'rspec' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/setup
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
ActiveModel::Errors.class_eval do
|
2
|
+
def <<(other)
|
3
|
+
copy_messages_from(other)
|
4
|
+
copy_details_from(other) if respond_to?(:details)
|
5
|
+
|
6
|
+
self
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def copy_details_from(other)
|
12
|
+
details.merge!(other.details) do |_, val_one, val_two|
|
13
|
+
[*val_one] + [*val_two]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_messages_from(other)
|
18
|
+
messages.merge!(other.messages) do |_, val_one, val_two|
|
19
|
+
[*val_one] + [*val_two]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module GettextI18n
|
2
|
+
module TranslateAttributes
|
3
|
+
def self.store_form_attributes(file: "locale/form_attributes.rb")
|
4
|
+
store_attributes(file, FormAttributesFinder.new)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.store_policy_attributes(file: "locale/policy_attributes.rb")
|
8
|
+
store_attributes(file, PolicyAttributesFinder.new)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def self.store_attributes(file, finder)
|
14
|
+
File.open(file, 'w') do |f|
|
15
|
+
f.puts "# DO NOT MODIFY! AUTOMATICALLY GENERATED FILE!"
|
16
|
+
|
17
|
+
finder.find.each do |object, attributes|
|
18
|
+
f.puts("_('#{object.humanize_class_name}')")
|
19
|
+
|
20
|
+
attributes.each do |attribute|
|
21
|
+
translation = object.gettext_translation_for_attribute_name(attribute)
|
22
|
+
f.puts("_('#{translation}')")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
f.puts "# DO NOT MODIFY! AUTOMATICALLY GENERATED FILE!"
|
27
|
+
end
|
28
|
+
rescue
|
29
|
+
puts "[Error] Attribute extraction failed. Removing incomplete file (#{file})"
|
30
|
+
|
31
|
+
File.delete(file)
|
32
|
+
raise
|
33
|
+
end
|
34
|
+
|
35
|
+
class AttributeFinder
|
36
|
+
def find
|
37
|
+
ActiveSupport::OrderedHash.new([]).tap do |found|
|
38
|
+
objects.each do |object|
|
39
|
+
found[object] = attributes(object)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def objects
|
47
|
+
@objects ||= ObjectSpace.each_object(Class).select do |c|
|
48
|
+
c.included_modules.include?(base_class)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def attributes(object)
|
53
|
+
object.attribute_set.map(&:name).sort
|
54
|
+
end
|
55
|
+
|
56
|
+
def base_class
|
57
|
+
raise NotImplementedError
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class PolicyAttributesFinder < AttributeFinder
|
62
|
+
def base_class
|
63
|
+
Railjet::Policy
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class FormAttributesFinder < AttributeFinder
|
68
|
+
def base_class
|
69
|
+
Railjet::Form
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/railjet.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require "railjet/version"
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
require "active_model"
|
5
|
+
require "active_model/merge_errors"
|
6
|
+
require "virtus"
|
7
|
+
require "validates_timeliness"
|
8
|
+
|
9
|
+
module Railjet
|
10
|
+
Error = Class.new(StandardError)
|
11
|
+
UnauthorizedError = Class.new(Error)
|
12
|
+
RecordNotFound = Class.new(Error)
|
13
|
+
|
14
|
+
class ValidationError < Error
|
15
|
+
attr_reader :errors
|
16
|
+
|
17
|
+
def initialize(errors)
|
18
|
+
@errors = errors
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_messages
|
22
|
+
errors.try(:messages)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
FormError = Class.new(ValidationError)
|
27
|
+
PolicyError = Class.new(ValidationError)
|
28
|
+
PolicyNotMetError = Class.new(PolicyError)
|
29
|
+
end
|
30
|
+
|
31
|
+
require "railjet/context"
|
32
|
+
|
33
|
+
require "railjet/util/use_case_helper"
|
34
|
+
require "railjet/util/policy_helper"
|
35
|
+
require "railjet/util/form_helper"
|
36
|
+
|
37
|
+
require "railjet/validator"
|
38
|
+
require "railjet/form"
|
39
|
+
require "railjet/policy"
|
40
|
+
require "railjet/composed_policy"
|
41
|
+
require "railjet/use_case"
|
42
|
+
|
43
|
+
require "railjet/repository/registry"
|
44
|
+
require "railjet/repository"
|
45
|
+
|
46
|
+
require "railjet/railtie" if defined?(Rails)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Railjet
|
2
|
+
module Auth
|
3
|
+
class Ability
|
4
|
+
attr_reader :actor, :settings
|
5
|
+
|
6
|
+
def initialize(actor, settings)
|
7
|
+
@actor = actor
|
8
|
+
@settings = settings
|
9
|
+
|
10
|
+
@activities = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def activity(klass, object)
|
16
|
+
@activities[klass] ||= klass.new(object, settings)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Railjet
|
2
|
+
class ComposedPolicy
|
3
|
+
class_attribute :policies
|
4
|
+
|
5
|
+
attr_reader :context, :object
|
6
|
+
attr_reader :policies
|
7
|
+
|
8
|
+
def self.add(policy, after: nil, before: nil)
|
9
|
+
self.policies ||= []
|
10
|
+
|
11
|
+
if after
|
12
|
+
self.policies = policies.dup.insert(policies.index(after) + 1, policy)
|
13
|
+
elsif before
|
14
|
+
self.policies = policies.dup.insert(policies.index(before), policy)
|
15
|
+
else
|
16
|
+
self.policies += [policy]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(context, object)
|
21
|
+
@context, @object = context, object
|
22
|
+
|
23
|
+
@policies = self.class.policies.map do |policy|
|
24
|
+
policy.new(context, object)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def valid?
|
29
|
+
policies.map(&:valid?).all?
|
30
|
+
end
|
31
|
+
|
32
|
+
def errors
|
33
|
+
valid?
|
34
|
+
policies.map(&:errors).inject(&:<<)
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate!
|
38
|
+
policies.each(&:validate!)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Railjet
|
2
|
+
class Context
|
3
|
+
def initialize(**kwargs)
|
4
|
+
define_accessors(kwargs)
|
5
|
+
end
|
6
|
+
|
7
|
+
# New values can be assigned to context on-the-fly,
|
8
|
+
# but it's not possible to change anything.
|
9
|
+
def method_missing(name, *args, &block)
|
10
|
+
getter_name = name[0..-2]
|
11
|
+
|
12
|
+
if name =~ /^[a-z]+=$/ && !respond_to?(getter_name)
|
13
|
+
define_accessor(getter_name, args.first)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def define_accessors(kwargs)
|
22
|
+
kwargs.each do |name, val|
|
23
|
+
define_accessor(name, val)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def define_accessor(name, value)
|
28
|
+
instance_variable_set("@#{name}", value)
|
29
|
+
self.class.send(:attr_reader, name)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|