dynflow 0.7.9 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +16 -1
  3. data/Gemfile +13 -1
  4. data/doc/pages/source/_drafts/2015-03-01-new-documentation.markdown +10 -0
  5. data/doc/pages/source/_includes/menu.html +1 -0
  6. data/doc/pages/source/_includes/menu_right.html +1 -1
  7. data/doc/pages/source/_sass/_bootstrap-variables.sass +1 -0
  8. data/doc/pages/source/_sass/_style.scss +4 -0
  9. data/doc/pages/source/blog/index.html +12 -0
  10. data/doc/pages/source/documentation/index.md +330 -5
  11. data/dynflow.gemspec +3 -1
  12. data/examples/example_helper.rb +18 -11
  13. data/examples/orchestrate_evented.rb +2 -1
  14. data/examples/remote_executor.rb +53 -20
  15. data/lib/dynflow.rb +16 -6
  16. data/lib/dynflow/action/suspended.rb +1 -1
  17. data/lib/dynflow/action/with_sub_plans.rb +3 -6
  18. data/lib/dynflow/actor.rb +56 -0
  19. data/lib/dynflow/clock.rb +43 -38
  20. data/lib/dynflow/config.rb +107 -0
  21. data/lib/dynflow/connectors.rb +7 -0
  22. data/lib/dynflow/connectors/abstract.rb +41 -0
  23. data/lib/dynflow/connectors/database.rb +175 -0
  24. data/lib/dynflow/connectors/direct.rb +71 -0
  25. data/lib/dynflow/coordinator.rb +280 -0
  26. data/lib/dynflow/coordinator_adapters.rb +8 -0
  27. data/lib/dynflow/coordinator_adapters/abstract.rb +28 -0
  28. data/lib/dynflow/coordinator_adapters/sequel.rb +29 -0
  29. data/lib/dynflow/dispatcher.rb +58 -0
  30. data/lib/dynflow/dispatcher/abstract.rb +14 -0
  31. data/lib/dynflow/dispatcher/client_dispatcher.rb +139 -0
  32. data/lib/dynflow/dispatcher/executor_dispatcher.rb +86 -0
  33. data/lib/dynflow/errors.rb +7 -1
  34. data/lib/dynflow/execution_history.rb +46 -0
  35. data/lib/dynflow/execution_plan.rb +19 -15
  36. data/lib/dynflow/executors.rb +0 -1
  37. data/lib/dynflow/executors/abstract.rb +5 -10
  38. data/lib/dynflow/executors/parallel.rb +16 -13
  39. data/lib/dynflow/executors/parallel/core.rb +76 -78
  40. data/lib/dynflow/executors/parallel/execution_plan_manager.rb +4 -5
  41. data/lib/dynflow/executors/parallel/pool.rb +22 -52
  42. data/lib/dynflow/executors/parallel/running_steps_manager.rb +9 -2
  43. data/lib/dynflow/executors/parallel/worker.rb +5 -10
  44. data/lib/dynflow/persistence.rb +14 -0
  45. data/lib/dynflow/persistence_adapters/abstract.rb +14 -3
  46. data/lib/dynflow/persistence_adapters/sequel.rb +142 -38
  47. data/lib/dynflow/persistence_adapters/sequel_migrations/004_coordinator_records.rb +14 -0
  48. data/lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb +14 -0
  49. data/lib/dynflow/round_robin.rb +37 -0
  50. data/lib/dynflow/serializable.rb +1 -2
  51. data/lib/dynflow/serializer.rb +46 -0
  52. data/lib/dynflow/testing/dummy_executor.rb +2 -2
  53. data/lib/dynflow/testing/dummy_world.rb +1 -1
  54. data/lib/dynflow/transaction_adapters/abstract.rb +0 -5
  55. data/lib/dynflow/transaction_adapters/active_record.rb +0 -10
  56. data/lib/dynflow/version.rb +1 -1
  57. data/lib/dynflow/web.rb +26 -0
  58. data/lib/dynflow/web/console.rb +108 -0
  59. data/lib/dynflow/web/console_helpers.rb +158 -0
  60. data/lib/dynflow/web/filtering_helpers.rb +85 -0
  61. data/lib/dynflow/web/world_helpers.rb +9 -0
  62. data/lib/dynflow/web_console.rb +3 -310
  63. data/lib/dynflow/world.rb +188 -119
  64. data/test/abnormal_states_recovery_test.rb +152 -0
  65. data/test/action_test.rb +2 -3
  66. data/test/clock_test.rb +1 -5
  67. data/test/coordinator_test.rb +152 -0
  68. data/test/dispatcher_test.rb +146 -0
  69. data/test/execution_plan_test.rb +2 -1
  70. data/test/executor_test.rb +534 -612
  71. data/test/middleware_test.rb +4 -4
  72. data/test/persistence_test.rb +17 -0
  73. data/test/prepare_travis_env.sh +35 -0
  74. data/test/rescue_test.rb +5 -3
  75. data/test/round_robin_test.rb +28 -0
  76. data/test/support/code_workflow_example.rb +0 -73
  77. data/test/support/dummy_example.rb +130 -0
  78. data/test/support/test_execution_log.rb +41 -0
  79. data/test/test_helper.rb +222 -116
  80. data/test/testing_test.rb +10 -10
  81. data/test/web_console_test.rb +3 -3
  82. data/test/world_test.rb +23 -0
  83. data/web/assets/images/logo-square.png +0 -0
  84. data/web/assets/stylesheets/application.css +9 -0
  85. data/web/assets/vendor/bootstrap/config.json +429 -0
  86. data/web/assets/vendor/bootstrap/css/bootstrap-theme.css +479 -0
  87. data/web/assets/vendor/bootstrap/css/bootstrap-theme.min.css +10 -0
  88. data/web/assets/vendor/bootstrap/css/bootstrap.css +5377 -4980
  89. data/web/assets/vendor/bootstrap/css/bootstrap.min.css +9 -8
  90. data/web/assets/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  91. data/web/assets/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg +288 -0
  92. data/web/assets/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  93. data/web/assets/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  94. data/web/assets/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  95. data/web/assets/vendor/bootstrap/js/bootstrap.js +1674 -1645
  96. data/web/assets/vendor/bootstrap/js/bootstrap.min.js +11 -5
  97. data/web/views/execution_history.erb +17 -0
  98. data/web/views/index.erb +4 -6
  99. data/web/views/layout.erb +44 -8
  100. data/web/views/show.erb +4 -5
  101. data/web/views/worlds.erb +26 -0
  102. metadata +116 -23
  103. checksums.yaml +0 -15
  104. data/lib/dynflow/daemon.rb +0 -30
  105. data/lib/dynflow/executors/remote_via_socket.rb +0 -43
  106. data/lib/dynflow/executors/remote_via_socket/core.rb +0 -184
  107. data/lib/dynflow/future.rb +0 -173
  108. data/lib/dynflow/listeners.rb +0 -7
  109. data/lib/dynflow/listeners/abstract.rb +0 -17
  110. data/lib/dynflow/listeners/serialization.rb +0 -77
  111. data/lib/dynflow/listeners/socket.rb +0 -117
  112. data/lib/dynflow/micro_actor.rb +0 -102
  113. data/lib/dynflow/simple_world.rb +0 -19
  114. data/test/remote_via_socket_test.rb +0 -170
  115. data/web/assets/vendor/bootstrap/css/bootstrap-responsive.css +0 -1109
  116. data/web/assets/vendor/bootstrap/css/bootstrap-responsive.min.css +0 -9
  117. data/web/assets/vendor/bootstrap/img/glyphicons-halflings-white.png +0 -0
  118. data/web/assets/vendor/bootstrap/img/glyphicons-halflings.png +0 -0
data/test/testing_test.rb CHANGED
@@ -11,22 +11,22 @@ module Dynflow
11
11
 
12
12
  specify '#plan_action' do
13
13
  input = { 'input' => 'input' }
14
- action = create_and_plan_action CWE::DummyHeavyProgress, input
14
+ action = create_and_plan_action Support::DummyExample::WeightedPolling, input
15
15
 
16
- action.must_be_kind_of CWE::DummyHeavyProgress
16
+ action.must_be_kind_of Support::DummyExample::WeightedPolling
17
17
  action.phase.must_equal Action::Plan
18
18
  action.input.must_equal input
19
19
  action.execution_plan.must_be_kind_of Testing::DummyExecutionPlan
20
20
  action.state.must_equal :success
21
21
  assert_run_phase action
22
22
  assert_finalize_phase action
23
- assert_action_planned action, CWE::DummySuspended
23
+ assert_action_planned action, Support::DummyExample::Polling
24
24
  refute_action_planned action, CWE::DummyAnotherTrigger
25
25
  end
26
26
 
27
27
  specify 'stub_plan_action' do
28
- action = create_action CWE::DummyHeavyProgress
29
- action.execution_plan.stub_planned_action(CWE::DummySuspended) do |sub_action|
28
+ action = create_action Support::DummyExample::WeightedPolling
29
+ action.execution_plan.stub_planned_action(Support::DummyExample::Polling) do |sub_action|
30
30
  sub_action.define_singleton_method(:test) { "test" }
31
31
  end
32
32
  plan_action(action, {})
@@ -36,10 +36,10 @@ module Dynflow
36
36
 
37
37
  specify '#run_action without suspend' do
38
38
  input = { 'input' => 'input' }
39
- plan = create_and_plan_action CWE::DummyHeavyProgress, input
39
+ plan = create_and_plan_action Support::DummyExample::WeightedPolling, input
40
40
  action = run_action plan
41
41
 
42
- action.must_be_kind_of CWE::DummyHeavyProgress
42
+ action.must_be_kind_of Support::DummyExample::WeightedPolling
43
43
  action.phase.must_equal Action::Run
44
44
  action.input.must_equal input
45
45
  action.world.must_equal plan.world
@@ -49,7 +49,7 @@ module Dynflow
49
49
 
50
50
  specify '#run_action with suspend' do
51
51
  input = { 'input' => 'input' }
52
- plan = create_and_plan_action CWE::DummySuspended, input
52
+ plan = create_and_plan_action Support::DummyExample::Polling, input
53
53
  action = run_action plan
54
54
 
55
55
  action.output.must_equal 'task' => { 'progress' => 0, 'done' => false }
@@ -76,12 +76,12 @@ module Dynflow
76
76
 
77
77
  specify '#finalize_action' do
78
78
  input = { 'input' => 'input' }
79
- plan = create_and_plan_action CWE::DummyHeavyProgress, input
79
+ plan = create_and_plan_action Support::DummyExample::WeightedPolling, input
80
80
  run = run_action plan
81
81
  $dummy_heavy_progress = false
82
82
  action = finalize_action run
83
83
 
84
- action.must_be_kind_of CWE::DummyHeavyProgress
84
+ action.must_be_kind_of Support::DummyExample::WeightedPolling
85
85
  action.phase.must_equal Action::Finalize
86
86
  action.input.must_equal input
87
87
  action.output.must_equal run.output
@@ -1,7 +1,7 @@
1
1
  require_relative 'test_helper'
2
2
 
3
3
  ENV['RACK_ENV'] = 'test'
4
- require 'dynflow/web_console'
4
+ require 'dynflow/web'
5
5
 
6
6
  require 'rack/test'
7
7
 
@@ -9,7 +9,7 @@ module Dynflow
9
9
  describe 'web console' do
10
10
 
11
11
  include Rack::Test::Methods
12
- include WorldInstance
12
+ let(:world) { WorldFactory.create_world }
13
13
 
14
14
  let :execution_plan_id do
15
15
  world.trigger(Support::CodeWorkflowExample::FastCommit, 'sha' => 'abc123').
@@ -19,7 +19,7 @@ module Dynflow
19
19
 
20
20
  let :app do
21
21
  world = self.world
22
- Dynflow::WebConsole.setup do
22
+ Dynflow::Web.setup do
23
23
  set :world, world
24
24
  end
25
25
  end
@@ -0,0 +1,23 @@
1
+ require_relative 'test_helper'
2
+ require 'fileutils'
3
+
4
+ module Dynflow
5
+ module WorldTest
6
+ describe World do
7
+ let(:world) { WorldFactory.create_world }
8
+ let(:world_with_custom_meta) { WorldFactory.create_world { |c| c.meta = { 'fast' => true } } }
9
+
10
+ describe '#meta' do
11
+ it 'by default informs about the hostname and the pid running the world' do
12
+ registered_world = world.coordinator.find_worlds(false, id: world.id).first
13
+ registered_world.meta.must_equal('hostname' => Socket.gethostname, 'pid' => Process.pid)
14
+ end
15
+
16
+ it 'is configurable' do
17
+ registered_world = world.coordinator.find_worlds(false, id: world_with_custom_meta.id).first
18
+ registered_world.meta.must_equal('fast' => true)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
Binary file
@@ -1,4 +1,5 @@
1
1
  body {
2
+ padding-top: 60px;
2
3
  margin: 1em;
3
4
  }
4
5
 
@@ -65,6 +66,7 @@ table.flow table {
65
66
 
66
67
  ul.plan-step p.step-label {
67
68
  cursor: pointer;
69
+ margin-bottom: 1em;
68
70
  }
69
71
 
70
72
  table.flow td.success span.step-label {
@@ -107,3 +109,10 @@ table.flow div.action {
107
109
  table.flow td.error div.step-data {
108
110
  display: block;
109
111
  }
112
+
113
+ .navbar-brand img {
114
+ height: 50px;
115
+ display: inline;
116
+ margin-top: -20px;
117
+ margin-bottom: -20px;
118
+ }
@@ -0,0 +1,429 @@
1
+ {
2
+ "vars": {
3
+ "@gray-base": "#000",
4
+ "@gray-darker": "lighten(@gray-base, 13.5%)",
5
+ "@gray-dark": "lighten(@gray-base, 20%)",
6
+ "@gray": "lighten(@gray-base, 33.5%)",
7
+ "@gray-light": "lighten(@gray-base, 46.7%)",
8
+ "@gray-lighter": "lighten(@gray-base, 93.5%)",
9
+ "@brand-primary": "darken(#428bca, 6.5%)",
10
+ "@brand-success": "#5cb85c",
11
+ "@brand-info": "#5bc0de",
12
+ "@brand-warning": "#f0ad4e",
13
+ "@brand-danger": "#d9534f",
14
+ "@body-bg": "#fff",
15
+ "@text-color": "@gray-dark",
16
+ "@link-color": "@brand-primary",
17
+ "@link-hover-color": "darken(@link-color, 15%)",
18
+ "@link-hover-decoration": "underline",
19
+ "@font-family-sans-serif": "\"Droid Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
20
+ "@font-family-serif": "\"Droid Serif\", Georgia, \"Times New Roman\", Times, serif",
21
+ "@font-family-monospace": "\"Ubuntu Mono\", Menlo, Monaco, Consolas, \"Courier New\", monospace",
22
+ "@font-family-base": "@font-family-sans-serif",
23
+ "@font-size-base": "14px",
24
+ "@font-size-large": "ceil((@font-size-base * 1.25))",
25
+ "@font-size-small": "ceil((@font-size-base * 0.85))",
26
+ "@font-size-h1": "floor((@font-size-base * 2.6))",
27
+ "@font-size-h2": "floor((@font-size-base * 2.15))",
28
+ "@font-size-h3": "ceil((@font-size-base * 1.7))",
29
+ "@font-size-h4": "ceil((@font-size-base * 1.25))",
30
+ "@font-size-h5": "@font-size-base",
31
+ "@font-size-h6": "ceil((@font-size-base * 0.85))",
32
+ "@line-height-base": "1.428571429",
33
+ "@line-height-computed": "floor((@font-size-base * @line-height-base))",
34
+ "@headings-font-family": "\"Yanone Kaffeesatz\"",
35
+ "@headings-font-weight": "400",
36
+ "@headings-line-height": "1.1",
37
+ "@headings-color": "inherit",
38
+ "@icon-font-path": "\"../fonts/\"",
39
+ "@icon-font-name": "\"glyphicons-halflings-regular\"",
40
+ "@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
41
+ "@padding-base-vertical": "6px",
42
+ "@padding-base-horizontal": "12px",
43
+ "@padding-large-vertical": "10px",
44
+ "@padding-large-horizontal": "16px",
45
+ "@padding-small-vertical": "5px",
46
+ "@padding-small-horizontal": "10px",
47
+ "@padding-xs-vertical": "1px",
48
+ "@padding-xs-horizontal": "5px",
49
+ "@line-height-large": "1.3333333",
50
+ "@line-height-small": "1.5",
51
+ "@border-radius-base": "4px",
52
+ "@border-radius-large": "6px",
53
+ "@border-radius-small": "3px",
54
+ "@component-active-color": "#fff",
55
+ "@component-active-bg": "@brand-primary",
56
+ "@caret-width-base": "4px",
57
+ "@caret-width-large": "5px",
58
+ "@table-cell-padding": "8px",
59
+ "@table-condensed-cell-padding": "5px",
60
+ "@table-bg": "transparent",
61
+ "@table-bg-accent": "#f9f9f9",
62
+ "@table-bg-hover": "#f5f5f5",
63
+ "@table-bg-active": "@table-bg-hover",
64
+ "@table-border-color": "#ddd",
65
+ "@btn-font-weight": "normal",
66
+ "@btn-default-color": "#333",
67
+ "@btn-default-bg": "#fff",
68
+ "@btn-default-border": "#ccc",
69
+ "@btn-primary-color": "#fff",
70
+ "@btn-primary-bg": "@brand-primary",
71
+ "@btn-primary-border": "darken(@btn-primary-bg, 5%)",
72
+ "@btn-success-color": "#fff",
73
+ "@btn-success-bg": "@brand-success",
74
+ "@btn-success-border": "darken(@btn-success-bg, 5%)",
75
+ "@btn-info-color": "#fff",
76
+ "@btn-info-bg": "@brand-info",
77
+ "@btn-info-border": "darken(@btn-info-bg, 5%)",
78
+ "@btn-warning-color": "#fff",
79
+ "@btn-warning-bg": "@brand-warning",
80
+ "@btn-warning-border": "darken(@btn-warning-bg, 5%)",
81
+ "@btn-danger-color": "#fff",
82
+ "@btn-danger-bg": "@brand-danger",
83
+ "@btn-danger-border": "darken(@btn-danger-bg, 5%)",
84
+ "@btn-link-disabled-color": "@gray-light",
85
+ "@input-bg": "#fff",
86
+ "@input-bg-disabled": "@gray-lighter",
87
+ "@input-color": "@gray",
88
+ "@input-border": "#ccc",
89
+ "@input-border-radius": "@border-radius-base",
90
+ "@input-border-radius-large": "@border-radius-large",
91
+ "@input-border-radius-small": "@border-radius-small",
92
+ "@input-border-focus": "#66afe9",
93
+ "@input-color-placeholder": "#999",
94
+ "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
95
+ "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
96
+ "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
97
+ "@legend-color": "@gray-dark",
98
+ "@legend-border-color": "#e5e5e5",
99
+ "@input-group-addon-bg": "@gray-lighter",
100
+ "@input-group-addon-border-color": "@input-border",
101
+ "@cursor-disabled": "not-allowed",
102
+ "@dropdown-bg": "#fff",
103
+ "@dropdown-border": "rgba(0,0,0,.15)",
104
+ "@dropdown-fallback-border": "#ccc",
105
+ "@dropdown-divider-bg": "#e5e5e5",
106
+ "@dropdown-link-color": "@gray-dark",
107
+ "@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
108
+ "@dropdown-link-hover-bg": "#f5f5f5",
109
+ "@dropdown-link-active-color": "@component-active-color",
110
+ "@dropdown-link-active-bg": "@component-active-bg",
111
+ "@dropdown-link-disabled-color": "@gray-light",
112
+ "@dropdown-header-color": "@gray-light",
113
+ "@dropdown-caret-color": "#000",
114
+ "@screen-xs": "480px",
115
+ "@screen-xs-min": "@screen-xs",
116
+ "@screen-phone": "@screen-xs-min",
117
+ "@screen-sm": "768px",
118
+ "@screen-sm-min": "@screen-sm",
119
+ "@screen-tablet": "@screen-sm-min",
120
+ "@screen-md": "992px",
121
+ "@screen-md-min": "@screen-md",
122
+ "@screen-desktop": "@screen-md-min",
123
+ "@screen-lg": "1200px",
124
+ "@screen-lg-min": "@screen-lg",
125
+ "@screen-lg-desktop": "@screen-lg-min",
126
+ "@screen-xs-max": "(@screen-sm-min - 1)",
127
+ "@screen-sm-max": "(@screen-md-min - 1)",
128
+ "@screen-md-max": "(@screen-lg-min - 1)",
129
+ "@grid-columns": "12",
130
+ "@grid-gutter-width": "30px",
131
+ "@grid-float-breakpoint": "@screen-sm-min",
132
+ "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
133
+ "@container-tablet": "(720px + @grid-gutter-width)",
134
+ "@container-sm": "@container-tablet",
135
+ "@container-desktop": "(940px + @grid-gutter-width)",
136
+ "@container-md": "@container-desktop",
137
+ "@container-large-desktop": "(1140px + @grid-gutter-width)",
138
+ "@container-lg": "@container-large-desktop",
139
+ "@navbar-height": "50px",
140
+ "@navbar-margin-bottom": "@line-height-computed",
141
+ "@navbar-border-radius": "@border-radius-base",
142
+ "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
143
+ "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
144
+ "@navbar-collapse-max-height": "340px",
145
+ "@navbar-default-color": "#777",
146
+ "@navbar-default-bg": "#f8f8f8",
147
+ "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
148
+ "@navbar-default-link-color": "#777",
149
+ "@navbar-default-link-hover-color": "#333",
150
+ "@navbar-default-link-hover-bg": "transparent",
151
+ "@navbar-default-link-active-color": "#555",
152
+ "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
153
+ "@navbar-default-link-disabled-color": "#ccc",
154
+ "@navbar-default-link-disabled-bg": "transparent",
155
+ "@navbar-default-brand-color": "@navbar-default-link-color",
156
+ "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
157
+ "@navbar-default-brand-hover-bg": "transparent",
158
+ "@navbar-default-toggle-hover-bg": "#ddd",
159
+ "@navbar-default-toggle-icon-bar-bg": "#888",
160
+ "@navbar-default-toggle-border-color": "#ddd",
161
+ "@navbar-inverse-color": "lighten(@gray-light, 15%)",
162
+ "@navbar-inverse-bg": "#222",
163
+ "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
164
+ "@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
165
+ "@navbar-inverse-link-hover-color": "#fff",
166
+ "@navbar-inverse-link-hover-bg": "transparent",
167
+ "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
168
+ "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
169
+ "@navbar-inverse-link-disabled-color": "#444",
170
+ "@navbar-inverse-link-disabled-bg": "transparent",
171
+ "@navbar-inverse-brand-color": "@navbar-inverse-link-color",
172
+ "@navbar-inverse-brand-hover-color": "#fff",
173
+ "@navbar-inverse-brand-hover-bg": "transparent",
174
+ "@navbar-inverse-toggle-hover-bg": "#333",
175
+ "@navbar-inverse-toggle-icon-bar-bg": "#fff",
176
+ "@navbar-inverse-toggle-border-color": "#333",
177
+ "@nav-link-padding": "10px 15px",
178
+ "@nav-link-hover-bg": "@gray-lighter",
179
+ "@nav-disabled-link-color": "@gray-light",
180
+ "@nav-disabled-link-hover-color": "@gray-light",
181
+ "@nav-tabs-border-color": "#ddd",
182
+ "@nav-tabs-link-hover-border-color": "@gray-lighter",
183
+ "@nav-tabs-active-link-hover-bg": "@body-bg",
184
+ "@nav-tabs-active-link-hover-color": "@gray",
185
+ "@nav-tabs-active-link-hover-border-color": "#ddd",
186
+ "@nav-tabs-justified-link-border-color": "#ddd",
187
+ "@nav-tabs-justified-active-link-border-color": "@body-bg",
188
+ "@nav-pills-border-radius": "@border-radius-base",
189
+ "@nav-pills-active-link-hover-bg": "@component-active-bg",
190
+ "@nav-pills-active-link-hover-color": "@component-active-color",
191
+ "@pagination-color": "@link-color",
192
+ "@pagination-bg": "#fff",
193
+ "@pagination-border": "#ddd",
194
+ "@pagination-hover-color": "@link-hover-color",
195
+ "@pagination-hover-bg": "@gray-lighter",
196
+ "@pagination-hover-border": "#ddd",
197
+ "@pagination-active-color": "#fff",
198
+ "@pagination-active-bg": "@brand-primary",
199
+ "@pagination-active-border": "@brand-primary",
200
+ "@pagination-disabled-color": "@gray-light",
201
+ "@pagination-disabled-bg": "#fff",
202
+ "@pagination-disabled-border": "#ddd",
203
+ "@pager-bg": "@pagination-bg",
204
+ "@pager-border": "@pagination-border",
205
+ "@pager-border-radius": "15px",
206
+ "@pager-hover-bg": "@pagination-hover-bg",
207
+ "@pager-active-bg": "@pagination-active-bg",
208
+ "@pager-active-color": "@pagination-active-color",
209
+ "@pager-disabled-color": "@pagination-disabled-color",
210
+ "@jumbotron-padding": "30px",
211
+ "@jumbotron-color": "inherit",
212
+ "@jumbotron-bg": "@gray-lighter",
213
+ "@jumbotron-heading-color": "inherit",
214
+ "@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
215
+ "@state-success-text": "#3c763d",
216
+ "@state-success-bg": "#dff0d8",
217
+ "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
218
+ "@state-info-text": "#31708f",
219
+ "@state-info-bg": "#d9edf7",
220
+ "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
221
+ "@state-warning-text": "#8a6d3b",
222
+ "@state-warning-bg": "#fcf8e3",
223
+ "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
224
+ "@state-danger-text": "#a94442",
225
+ "@state-danger-bg": "#f2dede",
226
+ "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
227
+ "@tooltip-max-width": "200px",
228
+ "@tooltip-color": "#fff",
229
+ "@tooltip-bg": "#000",
230
+ "@tooltip-opacity": ".9",
231
+ "@tooltip-arrow-width": "5px",
232
+ "@tooltip-arrow-color": "@tooltip-bg",
233
+ "@popover-bg": "#fff",
234
+ "@popover-max-width": "276px",
235
+ "@popover-border-color": "rgba(0,0,0,.2)",
236
+ "@popover-fallback-border-color": "#ccc",
237
+ "@popover-title-bg": "darken(@popover-bg, 3%)",
238
+ "@popover-arrow-width": "10px",
239
+ "@popover-arrow-color": "@popover-bg",
240
+ "@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
241
+ "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
242
+ "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
243
+ "@label-default-bg": "@gray-light",
244
+ "@label-primary-bg": "@brand-primary",
245
+ "@label-success-bg": "@brand-success",
246
+ "@label-info-bg": "@brand-info",
247
+ "@label-warning-bg": "@brand-warning",
248
+ "@label-danger-bg": "@brand-danger",
249
+ "@label-color": "#fff",
250
+ "@label-link-hover-color": "#fff",
251
+ "@modal-inner-padding": "15px",
252
+ "@modal-title-padding": "15px",
253
+ "@modal-title-line-height": "@line-height-base",
254
+ "@modal-content-bg": "#fff",
255
+ "@modal-content-border-color": "rgba(0,0,0,.2)",
256
+ "@modal-content-fallback-border-color": "#999",
257
+ "@modal-backdrop-bg": "#000",
258
+ "@modal-backdrop-opacity": ".5",
259
+ "@modal-header-border-color": "#e5e5e5",
260
+ "@modal-footer-border-color": "@modal-header-border-color",
261
+ "@modal-lg": "900px",
262
+ "@modal-md": "600px",
263
+ "@modal-sm": "300px",
264
+ "@alert-padding": "15px",
265
+ "@alert-border-radius": "@border-radius-base",
266
+ "@alert-link-font-weight": "bold",
267
+ "@alert-success-bg": "@state-success-bg",
268
+ "@alert-success-text": "@state-success-text",
269
+ "@alert-success-border": "@state-success-border",
270
+ "@alert-info-bg": "@state-info-bg",
271
+ "@alert-info-text": "@state-info-text",
272
+ "@alert-info-border": "@state-info-border",
273
+ "@alert-warning-bg": "@state-warning-bg",
274
+ "@alert-warning-text": "@state-warning-text",
275
+ "@alert-warning-border": "@state-warning-border",
276
+ "@alert-danger-bg": "@state-danger-bg",
277
+ "@alert-danger-text": "@state-danger-text",
278
+ "@alert-danger-border": "@state-danger-border",
279
+ "@progress-bg": "#f5f5f5",
280
+ "@progress-bar-color": "#fff",
281
+ "@progress-border-radius": "@border-radius-base",
282
+ "@progress-bar-bg": "@brand-primary",
283
+ "@progress-bar-success-bg": "@brand-success",
284
+ "@progress-bar-warning-bg": "@brand-warning",
285
+ "@progress-bar-danger-bg": "@brand-danger",
286
+ "@progress-bar-info-bg": "@brand-info",
287
+ "@list-group-bg": "#fff",
288
+ "@list-group-border": "#ddd",
289
+ "@list-group-border-radius": "@border-radius-base",
290
+ "@list-group-hover-bg": "#f5f5f5",
291
+ "@list-group-active-color": "@component-active-color",
292
+ "@list-group-active-bg": "@component-active-bg",
293
+ "@list-group-active-border": "@list-group-active-bg",
294
+ "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
295
+ "@list-group-disabled-color": "@gray-light",
296
+ "@list-group-disabled-bg": "@gray-lighter",
297
+ "@list-group-disabled-text-color": "@list-group-disabled-color",
298
+ "@list-group-link-color": "#555",
299
+ "@list-group-link-hover-color": "@list-group-link-color",
300
+ "@list-group-link-heading-color": "#333",
301
+ "@panel-bg": "#fff",
302
+ "@panel-body-padding": "15px",
303
+ "@panel-heading-padding": "10px 15px",
304
+ "@panel-footer-padding": "@panel-heading-padding",
305
+ "@panel-border-radius": "@border-radius-base",
306
+ "@panel-inner-border": "#ddd",
307
+ "@panel-footer-bg": "#f5f5f5",
308
+ "@panel-default-text": "@gray-dark",
309
+ "@panel-default-border": "#ddd",
310
+ "@panel-default-heading-bg": "#f5f5f5",
311
+ "@panel-primary-text": "#fff",
312
+ "@panel-primary-border": "@brand-primary",
313
+ "@panel-primary-heading-bg": "@brand-primary",
314
+ "@panel-success-text": "@state-success-text",
315
+ "@panel-success-border": "@state-success-border",
316
+ "@panel-success-heading-bg": "@state-success-bg",
317
+ "@panel-info-text": "@state-info-text",
318
+ "@panel-info-border": "@state-info-border",
319
+ "@panel-info-heading-bg": "@state-info-bg",
320
+ "@panel-warning-text": "@state-warning-text",
321
+ "@panel-warning-border": "@state-warning-border",
322
+ "@panel-warning-heading-bg": "@state-warning-bg",
323
+ "@panel-danger-text": "@state-danger-text",
324
+ "@panel-danger-border": "@state-danger-border",
325
+ "@panel-danger-heading-bg": "@state-danger-bg",
326
+ "@thumbnail-padding": "4px",
327
+ "@thumbnail-bg": "@body-bg",
328
+ "@thumbnail-border": "#ddd",
329
+ "@thumbnail-border-radius": "@border-radius-base",
330
+ "@thumbnail-caption-color": "@text-color",
331
+ "@thumbnail-caption-padding": "9px",
332
+ "@well-bg": "#f5f5f5",
333
+ "@well-border": "darken(@well-bg, 7%)",
334
+ "@badge-color": "#fff",
335
+ "@badge-link-hover-color": "#fff",
336
+ "@badge-bg": "@gray-light",
337
+ "@badge-active-color": "@link-color",
338
+ "@badge-active-bg": "#fff",
339
+ "@badge-font-weight": "bold",
340
+ "@badge-line-height": "1",
341
+ "@badge-border-radius": "10px",
342
+ "@breadcrumb-padding-vertical": "8px",
343
+ "@breadcrumb-padding-horizontal": "15px",
344
+ "@breadcrumb-bg": "#f5f5f5",
345
+ "@breadcrumb-color": "#ccc",
346
+ "@breadcrumb-active-color": "@gray-light",
347
+ "@breadcrumb-separator": "\"/\"",
348
+ "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
349
+ "@carousel-control-color": "#fff",
350
+ "@carousel-control-width": "15%",
351
+ "@carousel-control-opacity": ".5",
352
+ "@carousel-control-font-size": "20px",
353
+ "@carousel-indicator-active-bg": "#fff",
354
+ "@carousel-indicator-border-color": "#fff",
355
+ "@carousel-caption-color": "#fff",
356
+ "@close-font-weight": "bold",
357
+ "@close-color": "#000",
358
+ "@close-text-shadow": "0 1px 0 #fff",
359
+ "@code-color": "#c7254e",
360
+ "@code-bg": "#f9f2f4",
361
+ "@kbd-color": "#fff",
362
+ "@kbd-bg": "#333",
363
+ "@pre-bg": "#f5f5f5",
364
+ "@pre-color": "@gray-dark",
365
+ "@pre-border-color": "#ccc",
366
+ "@pre-scrollable-max-height": "340px",
367
+ "@component-offset-horizontal": "180px",
368
+ "@text-muted": "@gray-light",
369
+ "@abbr-border-color": "@gray-light",
370
+ "@headings-small-color": "@gray-light",
371
+ "@blockquote-small-color": "@gray-light",
372
+ "@blockquote-font-size": "(@font-size-base * 1.25)",
373
+ "@blockquote-border-color": "@gray-lighter",
374
+ "@page-header-border-color": "@gray-lighter",
375
+ "@dl-horizontal-offset": "@component-offset-horizontal",
376
+ "@hr-border": "@gray-lighter"
377
+ },
378
+ "css": [
379
+ "print.less",
380
+ "type.less",
381
+ "code.less",
382
+ "grid.less",
383
+ "tables.less",
384
+ "forms.less",
385
+ "buttons.less",
386
+ "responsive-utilities.less",
387
+ "glyphicons.less",
388
+ "button-groups.less",
389
+ "input-groups.less",
390
+ "navs.less",
391
+ "navbar.less",
392
+ "breadcrumbs.less",
393
+ "pagination.less",
394
+ "pager.less",
395
+ "labels.less",
396
+ "badges.less",
397
+ "jumbotron.less",
398
+ "thumbnails.less",
399
+ "alerts.less",
400
+ "progress-bars.less",
401
+ "media.less",
402
+ "list-group.less",
403
+ "panels.less",
404
+ "responsive-embed.less",
405
+ "wells.less",
406
+ "close.less",
407
+ "component-animations.less",
408
+ "dropdowns.less",
409
+ "tooltip.less",
410
+ "popovers.less",
411
+ "modals.less",
412
+ "carousel.less"
413
+ ],
414
+ "js": [
415
+ "alert.js",
416
+ "button.js",
417
+ "carousel.js",
418
+ "dropdown.js",
419
+ "modal.js",
420
+ "tooltip.js",
421
+ "popover.js",
422
+ "tab.js",
423
+ "affix.js",
424
+ "collapse.js",
425
+ "scrollspy.js",
426
+ "transition.js"
427
+ ],
428
+ "customizerUrl": "http://getbootstrap.com/customize/?id=9d12231ad700ab8f1be0"
429
+ }