rasti-app 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cba21fb4295b4b4c61c202817b62332a224d7c97
4
+ data.tar.gz: 43596dc5717bf0d2c8ac93fd26507a164c789b53
5
+ SHA512:
6
+ metadata.gz: 7df33bf07509cafc7a650619fe973007bede58ad4903de34df7216c5433d7fc1f95d69a90bbc71d65269a54e0d7b0b18fc96360d663933f390211398fef8c2f2
7
+ data.tar.gz: 1bab17df06843a11a20065cca28695dbf068a8b691bb69374718be9fb1ae4fa913cbf08d96f5d279a0f573de1006e5dff3285325d74777e46db7ac1adfc2b329
data/.coveralls.yml ADDED
@@ -0,0 +1,2 @@
1
+ service_name: travis-ci
2
+ repo_token:
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ rasti-app
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.3.0
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
7
+ - 2.3.0
8
+ - jruby
9
+ before_install:
10
+ - gem install bundler
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rasti-app.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Gabriel Naiman
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Rasti::App
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rasti-app.svg)](https://rubygems.org/gems/rasti-app)
4
+ [![Build Status](https://travis-ci.org/gabynaiman/rasti-app.svg?branch=master)](https://travis-ci.org/gabynaiman/rasti-app)
5
+ [![Coverage Status](https://coveralls.io/repos/github/gabynaiman/rasti-app/badge.svg?branch=master)](https://coveralls.io/github/gabynaiman/rasti-app?branch=master)
6
+ [![Code Climate](https://codeclimate.com/github/gabynaiman/rasti-app.svg)](https://codeclimate.com/github/gabynaiman/rasti-app)
7
+ [![Dependency Status](https://gemnasium.com/gabynaiman/rasti-app.svg)](https://gemnasium.com/gabynaiman/rasti-app)
8
+
9
+ TODO: Delete this and the text above, and describe your gem
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'rasti-app'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install rasti-app
26
+
27
+ ## Usage
28
+
29
+ TODO: Write usage instructions here
30
+
31
+ ## Contributing
32
+
33
+ Bug reports and pull requests are welcome on GitHub at https://github.com/gabynaiman/rasti-app.
34
+
35
+
36
+ ## License
37
+
38
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
39
+
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:spec) do |t|
5
+ t.libs << 'spec'
6
+ t.libs << 'lib'
7
+ t.pattern = ENV['DIR'] ? File.join(ENV['DIR'], '**', '*_spec.rb') : 'spec/**/*_spec.rb'
8
+ t.verbose = false
9
+ t.warning = false
10
+ t.loader = nil if ENV['TEST']
11
+ ENV['TEST'], ENV['LINE'] = ENV['TEST'].split(':') if ENV['TEST'] && !ENV['LINE']
12
+ t.options = ''
13
+ t.options << "--name=/#{ENV['NAME']}/ " if ENV['NAME']
14
+ t.options << "-l #{ENV['LINE']} " if ENV['LINE'] && ENV['TEST']
15
+ end
16
+
17
+ task default: :spec
18
+
19
+ desc 'Pry console'
20
+ task :console do
21
+ require 'rasti-app'
22
+ require 'pry'
23
+ ARGV.clear
24
+ Pry.start
25
+ end
@@ -0,0 +1,27 @@
1
+ module Rasti
2
+ class App
3
+ class AsynchronicInteraction < Interaction
4
+
5
+ private
6
+
7
+ def job
8
+ @job ||= Asynchronic[context.fetch(:job_id)].job
9
+ end
10
+
11
+ def enqueue(interaction, params)
12
+ job.send :async, Job, queue: params.delete(:queue) || Asynchronic.default_queue,
13
+ alias: params.delete(:alias) || interaction,
14
+ dependency: params.delete(:dependency),
15
+ dependencies: params.delete(:dependencies),
16
+ interaction: interaction,
17
+ context: context,
18
+ params: params
19
+ end
20
+
21
+ def result_of(reference)
22
+ job.send :result, reference
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ module Rasti
2
+ class App
3
+ class Container
4
+
5
+ def initialize
6
+ @registry = {}
7
+ @cache = {}
8
+ yield self if block_given?
9
+ end
10
+
11
+ def register(key, &block)
12
+ registry[key] = block
13
+ end
14
+
15
+ def resolve(key)
16
+ cache[key] ||= registry.fetch(key).call
17
+ end
18
+
19
+ alias_method :[], :resolve
20
+
21
+ def resolve_all
22
+ registry.each_key { |k| resolve k }
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :registry, :cache
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module Rasti
2
+ class App
3
+ class Interaction
4
+
5
+ def self.build_form(params)
6
+ constants.include?(:Form) ? const_get(:Form).new(params) : Form.new
7
+ end
8
+
9
+ def initialize(container, context)
10
+ @container = container
11
+ @context = context
12
+ end
13
+
14
+ def call(params)
15
+ Thread.current[thread_form_key] = self.class.build_form(params)
16
+ execute
17
+ ensure
18
+ Thread.current[thread_form_key] = nil
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :container, :context
24
+
25
+ def form
26
+ Thread.current[thread_form_key]
27
+ end
28
+
29
+ def thread_form_key
30
+ "#{self.class.name}::Form[#{self.object_id}]"
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ module Rasti
2
+ class App
3
+ class Job < Asynchronic::Job
4
+
5
+ extend ClassConfig
6
+
7
+ attr_config :container
8
+
9
+ def call
10
+ raise "Undefined #{self.class.name}.container" unless self.class.container
11
+
12
+ context = params[:context].merge(job_id: @process.id)
13
+ interaction = params[:interaction].new self.class.container, context
14
+ interaction.call params[:params]
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ module Rasti
2
+ class App
3
+ class Permission < String
4
+
5
+ SEPARATOR = '.'
6
+
7
+ def initialize(*args)
8
+ super Array(args).flatten.map(&:to_s).join(SEPARATOR)
9
+ end
10
+
11
+ def include?(permission)
12
+ other = Permission.new permission
13
+ sections.count <= other.sections.count && self == other.sections.take(sections.count).join(SEPARATOR)
14
+ end
15
+
16
+ def sections
17
+ split SEPARATOR
18
+ end
19
+
20
+ def last_section
21
+ sections.last
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ module Rasti
2
+ class App
3
+ class Policy
4
+
5
+ class UnauthorizedError < StandardError
6
+ def initialize(user, permission)
7
+ super "Access denied [#{user} -> #{permission}]"
8
+ end
9
+ end
10
+
11
+ class << self
12
+
13
+ def authorizations
14
+ @authorizations ||= {}
15
+ end
16
+
17
+ private
18
+
19
+ def authorization(permission, &block)
20
+ authorizations[permission] = block
21
+ end
22
+
23
+ def ignore(permission)
24
+ authorization(permission) { true }
25
+ end
26
+
27
+ end
28
+
29
+ def initialize(container, user)
30
+ @container = container
31
+ @user = user
32
+ end
33
+
34
+ def authorized?(permission, params)
35
+ if self.class.authorizations.key? permission
36
+ self.class.authorizations[permission].call params
37
+ else
38
+ user.authorized? permission
39
+ end
40
+ end
41
+
42
+ def authorize!(permission, params)
43
+ raise UnauthorizedError.new(user.name, permission) unless authorized? permission, params
44
+ end
45
+
46
+ private
47
+
48
+ attr_reader :container, :user
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ module Rasti
2
+ class App
3
+ class Service
4
+
5
+ def self.implements(*methods)
6
+ methods.each do |method|
7
+ define_method method do |*args, &block|
8
+ adapter.public_send method, *args, &block
9
+ end
10
+ end
11
+ end
12
+
13
+ def initialize(adapter)
14
+ @adapter = adapter
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :adapter
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ module Rasti
2
+ class App
3
+ class ServiceFactory
4
+
5
+ class << self
6
+
7
+ def service(name, service_class=nil)
8
+ services[name] = service_class || Consty.get(Inflecto.camelize(name), self)
9
+
10
+ define_method name do
11
+ cache[name] ||= begin
12
+ adapter_class = Consty.get(settings[name][:adapter], self.class.services[name])
13
+ self.class.services[name].new adapter_class.new(settings[name][:options])
14
+ end
15
+ end
16
+ end
17
+
18
+ def services
19
+ @services ||= {}
20
+ end
21
+
22
+ end
23
+
24
+ def initialize(settings)
25
+ @settings = settings
26
+ @cache = {}
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :settings, :cache
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ module Rasti
2
+ class App
3
+ class Settings
4
+ class << self
5
+
6
+ def load(environment)
7
+ load_file File.join(Dir.pwd, "#{environment}.yml")
8
+ end
9
+
10
+ def load_file(filename)
11
+ Hash::Accessible.new evaluate(File.read(filename))
12
+ end
13
+
14
+ private
15
+
16
+ def evaluate(yml)
17
+ YAML.load ERB.new(yml).result
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module Rasti
2
+ class App
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
data/lib/rasti/app.rb ADDED
@@ -0,0 +1,104 @@
1
+ require 'yaml'
2
+ require 'erb'
3
+ require 'inflecto'
4
+ require 'asynchronic'
5
+ require 'hash_ext'
6
+ require 'consty'
7
+ require 'multi_require'
8
+
9
+
10
+ module Rasti
11
+ class App
12
+
13
+ extend MultiRequire
14
+
15
+ require_relative 'app/interaction'
16
+ require_relative_pattern 'app/*'
17
+
18
+ class << self
19
+
20
+ def permissions
21
+ @permissions ||= []
22
+ end
23
+
24
+ def valid_permission?(permission)
25
+ permission = Permission.new permission
26
+ permissions.any? { |p| permission.include? p }
27
+ end
28
+
29
+ def classes_in(namespace, superclass=nil)
30
+ [].tap do |classes|
31
+ namespace.constants.each do |name|
32
+ constant = namespace.const_get name
33
+ if constant.class == Module
34
+ classes_in(constant, superclass).each { |c| classes << c }
35
+ elsif constant.class == Class && (superclass.nil? || constant.ancestors.include?(superclass))
36
+ classes << constant
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def facade(namespace)
45
+ classes_in(namespace, Interaction).each do |interaction|
46
+ permission = interaction_permission interaction, namespace
47
+ permissions << permission
48
+
49
+ if !interaction.ancestors.include?(AsynchronicInteraction)
50
+ define_method permission.last_section do |params={}|
51
+ call interaction, permission, params
52
+ end
53
+ end
54
+
55
+ define_method "enqueue_#{permission.last_section}" do |params={}|
56
+ enqueue interaction, permission, params
57
+ end
58
+ end
59
+ end
60
+
61
+ def interaction_permission(interaction, namespace)
62
+ Permission.new interaction.name.sub("#{namespace.name}::", '').split('::').map { |s| Inflecto.underscore s }
63
+ end
64
+
65
+ end
66
+
67
+ def initialize(container, context={})
68
+ @container = container
69
+ @context = context
70
+ end
71
+
72
+ private
73
+
74
+ attr_reader :container, :context
75
+
76
+ def user
77
+ context.fetch(:user)
78
+ end
79
+
80
+ def policy
81
+ @policy ||= (container[:policy_class] || Policy).new container, user
82
+ end
83
+
84
+ def call(interaction, permission, params)
85
+ authorize! permission, params
86
+ interaction.new(container, context).call(params)
87
+ end
88
+
89
+ def enqueue(interaction, permission, params)
90
+ authorize! permission, params
91
+
92
+ Job.enqueue queue: params.delete(:queue) || Asynchronic.default_queue,
93
+ alias: interaction,
94
+ interaction: interaction,
95
+ context: context,
96
+ params: interaction.build_form(params).attributes
97
+ end
98
+
99
+ def authorize!(permission, params)
100
+ policy.authorize! permission, params
101
+ end
102
+
103
+ end
104
+ end
data/lib/rasti-app.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative 'rasti/app'
data/rasti-app.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rasti/app/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rasti-app'
8
+ spec.version = Rasti::App::VERSION
9
+ spec.authors = ['Gabriel Naiman']
10
+ spec.email = ['gabynaiman@gmail.com']
11
+ spec.summary = ''
12
+ spec.description = ''
13
+ spec.homepage = 'https://github.com/gabynaiman/rasti-app'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'inflecto', '~> 0.0'
22
+ spec.add_runtime_dependency 'asynchronic', '~> 1.0'
23
+ spec.add_runtime_dependency 'multi_require', '~> 1.0'
24
+ spec.add_runtime_dependency 'hash_ext', '~> 0.2', '>= 0.2.1'
25
+ spec.add_runtime_dependency 'consty', '~> 1.0'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.12'
28
+ spec.add_development_dependency 'rake', '~> 11.0'
29
+ spec.add_development_dependency 'minitest', '~> 5.0'
30
+ spec.add_development_dependency 'minitest-colorin', '~> 0.1'
31
+ spec.add_development_dependency 'minitest-line', '~> 0.6'
32
+ spec.add_development_dependency 'simplecov', '~> 0.12'
33
+ spec.add_development_dependency 'coveralls', '~> 0.8'
34
+ spec.add_development_dependency 'pry-nav', '~> 0.2'
35
+
36
+ if RUBY_VERSION < '2'
37
+ spec.add_development_dependency 'term-ansicolor', '~> 1.3.0'
38
+ spec.add_development_dependency 'tins', '~> 1.6.0'
39
+ spec.add_development_dependency 'json', '~> 1.8'
40
+ end
41
+ end
@@ -0,0 +1,5 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
5
+ SimpleCov.start
@@ -0,0 +1,5 @@
1
+ require 'coverage_helper'
2
+ require 'minitest/autorun'
3
+ require 'minitest/colorin'
4
+ require 'pry-nav'
5
+ require 'rasti-app'
metadata ADDED
@@ -0,0 +1,258 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rasti-app
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Naiman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: inflecto
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: asynchronic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_require
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hash_ext
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.2.1
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '0.2'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.2.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: consty
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: bundler
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.12'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.12'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '11.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '11.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: minitest
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '5.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '5.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: minitest-colorin
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.1'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.1'
145
+ - !ruby/object:Gem::Dependency
146
+ name: minitest-line
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.6'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.6'
159
+ - !ruby/object:Gem::Dependency
160
+ name: simplecov
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.12'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.12'
173
+ - !ruby/object:Gem::Dependency
174
+ name: coveralls
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.8'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '0.8'
187
+ - !ruby/object:Gem::Dependency
188
+ name: pry-nav
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.2'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '0.2'
201
+ description: ''
202
+ email:
203
+ - gabynaiman@gmail.com
204
+ executables: []
205
+ extensions: []
206
+ extra_rdoc_files: []
207
+ files:
208
+ - ".coveralls.yml"
209
+ - ".gitignore"
210
+ - ".ruby-gemset"
211
+ - ".ruby-version"
212
+ - ".travis.yml"
213
+ - Gemfile
214
+ - LICENSE.txt
215
+ - README.md
216
+ - Rakefile
217
+ - lib/rasti-app.rb
218
+ - lib/rasti/app.rb
219
+ - lib/rasti/app/asynchronic_interaction.rb
220
+ - lib/rasti/app/container.rb
221
+ - lib/rasti/app/interaction.rb
222
+ - lib/rasti/app/job.rb
223
+ - lib/rasti/app/permission.rb
224
+ - lib/rasti/app/policy.rb
225
+ - lib/rasti/app/service.rb
226
+ - lib/rasti/app/service_factory.rb
227
+ - lib/rasti/app/settings.rb
228
+ - lib/rasti/app/version.rb
229
+ - rasti-app.gemspec
230
+ - spec/coverage_helper.rb
231
+ - spec/minitest_helper.rb
232
+ homepage: https://github.com/gabynaiman/rasti-app
233
+ licenses:
234
+ - MIT
235
+ metadata: {}
236
+ post_install_message:
237
+ rdoc_options: []
238
+ require_paths:
239
+ - lib
240
+ required_ruby_version: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ required_rubygems_version: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ requirements: []
251
+ rubyforge_project:
252
+ rubygems_version: 2.5.1
253
+ signing_key:
254
+ specification_version: 4
255
+ summary: ''
256
+ test_files:
257
+ - spec/coverage_helper.rb
258
+ - spec/minitest_helper.rb