micon 0.1.17 → 0.1.18
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.
- data/lib/micon.rb +8 -3
- data/lib/micon/config.rb +5 -5
- data/lib/micon/core.rb +76 -76
- data/lib/micon/helper.rb +6 -6
- data/lib/micon/metadata.rb +31 -31
- data/lib/micon/module.rb +12 -12
- data/lib/micon/spec.rb +4 -4
- data/lib/micon/support.rb +1 -1
- data/readme.md +72 -66
- data/spec/callbacks_spec.rb +18 -18
- data/spec/config_spec.rb +5 -5
- data/spec/constants_spec.rb +18 -18
- data/spec/custom_scope_spec.rb +14 -14
- data/spec/initialization_spec.rb +16 -16
- data/spec/managed_spec.rb +6 -6
- data/spec/miscellaneous_spec.rb +19 -19
- data/spec/nested_custom_scope_spec.rb +5 -5
- data/spec/spec_helper.rb +2 -2
- data/spec/static_scope_spec.rb +22 -22
- metadata +1 -12
- data/lib/micon/rad.rb +0 -8
- data/spec/example_spec.rb +0 -171
- data/spec/example_spec/lib/components/controller.rb +0 -8
- data/spec/example_spec/lib/components/logger.production.yml +0 -1
- data/spec/example_spec/lib/components/logger.rb +0 -8
- data/spec/example_spec/lib/components/logger.yml +0 -1
- data/spec/example_spec/lib/components/request.rb +0 -2
- data/spec/example_spec/lib/components/router.rb +0 -12
- data/spec/example_spec/lib/pages_controller.rb +0 -11
- data/spec/example_spec/lib/rack_adapter.rb +0 -25
- data/spec/example_spec/lib/request.rb +0 -8
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: micon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.18
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -25,7 +25,6 @@ files:
|
|
25
25
|
- lib/micon/helper.rb
|
26
26
|
- lib/micon/metadata.rb
|
27
27
|
- lib/micon/module.rb
|
28
|
-
- lib/micon/rad.rb
|
29
28
|
- lib/micon/spec.rb
|
30
29
|
- lib/micon/support.rb
|
31
30
|
- lib/micon.rb
|
@@ -39,16 +38,6 @@ files:
|
|
39
38
|
- spec/constants_spec/get_constant_component/lib/components/TheController.rb
|
40
39
|
- spec/constants_spec.rb
|
41
40
|
- spec/custom_scope_spec.rb
|
42
|
-
- spec/example_spec/lib/components/controller.rb
|
43
|
-
- spec/example_spec/lib/components/logger.production.yml
|
44
|
-
- spec/example_spec/lib/components/logger.rb
|
45
|
-
- spec/example_spec/lib/components/logger.yml
|
46
|
-
- spec/example_spec/lib/components/request.rb
|
47
|
-
- spec/example_spec/lib/components/router.rb
|
48
|
-
- spec/example_spec/lib/pages_controller.rb
|
49
|
-
- spec/example_spec/lib/rack_adapter.rb
|
50
|
-
- spec/example_spec/lib/request.rb
|
51
|
-
- spec/example_spec.rb
|
52
41
|
- spec/initialization_spec.rb
|
53
42
|
- spec/managed_spec.rb
|
54
43
|
- spec/miscellaneous_spec/autoload/lib/components/some_value.rb
|
data/lib/micon/rad.rb
DELETED
data/spec/example_spec.rb
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Micon Overview" do
|
4
|
-
before do
|
5
|
-
self.micon = Micon::Core.new
|
6
|
-
end
|
7
|
-
after do
|
8
|
-
remove_constants :Logger, :Router, :PagesController, :Request, :RackAdapter
|
9
|
-
end
|
10
|
-
|
11
|
-
it "example" do
|
12
|
-
require 'micon'
|
13
|
-
|
14
|
-
# Here's our Web Framework, let's call it Rad
|
15
|
-
|
16
|
-
# Let's define shortcut to access the IoC API (optional
|
17
|
-
# but handy step). I don't know how You would like to call it,
|
18
|
-
# so I leave this step to You.
|
19
|
-
class ::Object
|
20
|
-
def rad; MICON end
|
21
|
-
end
|
22
|
-
|
23
|
-
# let's define some components
|
24
|
-
# the :logger is one per application, it's a static component (like singleton)
|
25
|
-
class Logger
|
26
|
-
register_as :logger
|
27
|
-
attr_accessor :log_file_path
|
28
|
-
def info msg
|
29
|
-
puts "#{msg} (writen to #{log_file_path})" unless defined?(RSpec)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# To demostrate basics of working with compnents let's configure our :logger
|
34
|
-
# explicitly (in the next example, it will be configured automatically).
|
35
|
-
rad.logger.log_file_path = '/tmp/rad.log'
|
36
|
-
|
37
|
-
# The :router requires complex initialization, so we use
|
38
|
-
# another form of component registration.
|
39
|
-
class Router
|
40
|
-
def initialize routes; @routes = routes end
|
41
|
-
def decode request;
|
42
|
-
class_name, method = @routes[request.url]
|
43
|
-
return eval(class_name), method # returning actual class
|
44
|
-
end
|
45
|
-
end
|
46
|
-
rad.register :router do
|
47
|
-
Router.new '/index' => ['PagesController', :index]
|
48
|
-
end
|
49
|
-
|
50
|
-
# The :controller component should be created and destroyed dynamically,
|
51
|
-
# for each request, we specifying that component is dynamic
|
52
|
-
# by declaring it's :scope.
|
53
|
-
# And, we don't know beforehead what it actully will be, for different
|
54
|
-
# request there can be different controllers,
|
55
|
-
# so, here we just declaring it without any initialization block, it
|
56
|
-
# will be created at runtime later.
|
57
|
-
rad.register :controller, scope: :request
|
58
|
-
|
59
|
-
# Let's define some of our controllers, the PagesController, note - we
|
60
|
-
# don't register it as component.
|
61
|
-
class PagesController
|
62
|
-
# We need access to :logger and :request, let's inject them
|
63
|
-
inject logger: :logger, request: :request
|
64
|
-
|
65
|
-
def index
|
66
|
-
# Here we can use injected component
|
67
|
-
logger.info "Application: processing #{request}"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# Request is also dynamic, and it also can't be created beforehead.
|
72
|
-
# We also registering it without initialization, it will be
|
73
|
-
# created at runtime later.
|
74
|
-
class Request
|
75
|
-
attr_reader :url
|
76
|
-
def initialize url; @url = url end
|
77
|
-
def to_s; @url end
|
78
|
-
end
|
79
|
-
# Registering without initialization block.
|
80
|
-
rad.register :request, scope: :request
|
81
|
-
|
82
|
-
# We need to integrate our application with web server, for example with the Rack.
|
83
|
-
# When the server receive web request, it calls the :call method of our RackAdapter
|
84
|
-
class RackAdapter
|
85
|
-
# Injecting components
|
86
|
-
inject request: :request, controller: :controller
|
87
|
-
|
88
|
-
def call env
|
89
|
-
# We need to tell Micon that the :request scope is started, so it will know
|
90
|
-
# that some dynamic components should be created during this scope and
|
91
|
-
# destroyed at the end of it.
|
92
|
-
rad.activate :request, {} do
|
93
|
-
# Here we manually creating the Request component
|
94
|
-
self.request = Request.new '/index'
|
95
|
-
|
96
|
-
# The :router also can be injected via :inject,
|
97
|
-
# but we can also use another way to access components,
|
98
|
-
# every component also availiable as rad.<component_name>
|
99
|
-
controller_class, method = rad.router.decode request
|
100
|
-
|
101
|
-
# Let's create and call our controller
|
102
|
-
self.controller = controller_class.new
|
103
|
-
controller.send method
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
# Let's pretend that there's a Web Server and run our application,
|
109
|
-
# You should see something like this in the console:
|
110
|
-
# Application: processing /index
|
111
|
-
RackAdapter.new.call({})
|
112
|
-
end
|
113
|
-
|
114
|
-
describe 'real-life' do
|
115
|
-
class_loader_available = begin
|
116
|
-
require 'class_loader'
|
117
|
-
require 'class_loader/spec'
|
118
|
-
true
|
119
|
-
rescue LoadError
|
120
|
-
false
|
121
|
-
end
|
122
|
-
|
123
|
-
if class_loader_available
|
124
|
-
with_load_path "#{spec_dir}/lib"
|
125
|
-
with_autoload_path "#{spec_dir}/lib"
|
126
|
-
|
127
|
-
it "example" do
|
128
|
-
require 'micon'
|
129
|
-
require 'class_loader'
|
130
|
-
|
131
|
-
# Here's our Web Framework, let's call it Rad
|
132
|
-
|
133
|
-
# Let's define shortcut to access the IoC API (optional
|
134
|
-
# but handy step). I don't know how You would like to call it,
|
135
|
-
# so I leave this step to You.
|
136
|
-
class ::Object
|
137
|
-
def rad; MICON end
|
138
|
-
end
|
139
|
-
|
140
|
-
# Auto-discovering:
|
141
|
-
#
|
142
|
-
# All components (:logger, :router, :request, :controller) are
|
143
|
-
# defined in spec/example_spec/lib/components folder.
|
144
|
-
# All classes (PagesController, RackAdapter) are
|
145
|
-
# located in spec/example_spec/lib folder.
|
146
|
-
#
|
147
|
-
# Note that there's no any "require 'xxx'" clause, all components and
|
148
|
-
# classes are loaded and dependecies are resolved automatically.
|
149
|
-
|
150
|
-
# Auto-configuring
|
151
|
-
#
|
152
|
-
# Remember our manual configuration of "logger.log_file_path" from
|
153
|
-
# the previous example?
|
154
|
-
# This time it will be configured automatically, take a look at
|
155
|
-
# the spec/example_spec/lib/components/logger.yml file.
|
156
|
-
#
|
157
|
-
# Note, that there are also logger.production.yml, configs are smart
|
158
|
-
# and are merged in the following order:
|
159
|
-
# logger.yml <- logger.<env>.yml <- <runtime_path>/config/logger.yml
|
160
|
-
# (If you define :environment and :runtime_path variables).
|
161
|
-
|
162
|
-
# Let's pretend that there's a Web Server and run our application,
|
163
|
-
# You should see something like this in the console:
|
164
|
-
# Application: processing /index
|
165
|
-
RackAdapter.new.call({})
|
166
|
-
end
|
167
|
-
else
|
168
|
-
warn "The 'real-life example' requires 'class_loader' gem, please install it"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# The :controller component should be created and destroyed dynamically,
|
2
|
-
# for each request, we specifying that component is dynamic
|
3
|
-
# by declaring it's :scope.
|
4
|
-
# And, we don't know beforehead what it actully will be, for different
|
5
|
-
# request there can be different controllers,
|
6
|
-
# so, here we just declaring it without any initialization block, it
|
7
|
-
# will be created at runtime later.
|
8
|
-
rad.register :controller, scope: :request
|
@@ -1 +0,0 @@
|
|
1
|
-
log_file_path: /tmp/rad.production.log
|
@@ -1 +0,0 @@
|
|
1
|
-
log_file_path: /tmp/rad.log
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# The :router requires complex initialization, so we use
|
2
|
-
# another form of component registration.
|
3
|
-
class Router
|
4
|
-
def initialize routes; @routes = routes end
|
5
|
-
def decode request;
|
6
|
-
class_name, method = @routes[request.url]
|
7
|
-
return eval(class_name), method # returning actual class
|
8
|
-
end
|
9
|
-
end
|
10
|
-
rad.register :router do
|
11
|
-
Router.new '/index' => ['PagesController', :index]
|
12
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# Let's define some of our controllers, the PagesController, note - we
|
2
|
-
# don't register it as component.
|
3
|
-
class PagesController
|
4
|
-
# We need access to :logger and :request, let's inject them
|
5
|
-
inject logger: :logger, request: :request
|
6
|
-
|
7
|
-
def index
|
8
|
-
# Here we can use injected component
|
9
|
-
logger.info "Application: processing #{request}"
|
10
|
-
end
|
11
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# We need to integrate our application with web server, for example with the Rack.
|
2
|
-
# When the server receive web request, it calls the :call method of our RackAdapter
|
3
|
-
class RackAdapter
|
4
|
-
# Injecting components
|
5
|
-
inject request: :request, controller: :controller
|
6
|
-
|
7
|
-
def call env
|
8
|
-
# We need to tell Micon that the :request scope is started, so it will know
|
9
|
-
# that some dynamic components should be created during this scope and
|
10
|
-
# destroyed at the end of it.
|
11
|
-
rad.activate :request, {} do
|
12
|
-
# Here we manually creating the Request component
|
13
|
-
self.request = Request.new '/index'
|
14
|
-
|
15
|
-
# The :router also can be injected via :inject,
|
16
|
-
# but we can also use another way to access components,
|
17
|
-
# every component also availiable as rad.<component_name>
|
18
|
-
controller_class, method = rad.router.decode request
|
19
|
-
|
20
|
-
# Let's create and call our controller
|
21
|
-
self.controller = controller_class.new
|
22
|
-
controller.send method
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|