nobrainer 0.25.1 → 0.26.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/no_brainer/connection_manager.rb +20 -0
- data/lib/no_brainer/document/atomic_ops.rb +9 -3
- data/lib/no_brainer/document/dirty.rb +10 -9
- data/lib/no_brainer/document/index/synchronizer.rb +14 -4
- data/lib/no_brainer/document/validation/uniqueness.rb +5 -2
- data/lib/no_brainer/lock.rb +1 -1
- data/lib/no_brainer/query_runner/reconnect.rb +2 -3
- data/lib/no_brainer/railtie.rb +0 -12
- data/lib/no_brainer/rql.rb +5 -5
- data/lib/rails/generators/nobrainer/install_generator.rb +48 -0
- data/lib/rails/generators/nobrainer/{model/model_generator.rb → model_generator.rb} +7 -3
- data/lib/rails/generators/nobrainer/namespace_fix.rb +15 -0
- data/lib/rails/generators/{nobrainer/model/templates/model.rb.tt → templates/model.rb} +1 -1
- data/lib/rails/generators/templates/nobrainer.rb +92 -0
- metadata +7 -5
- data/lib/rails/generators/nobrainer.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22202d66d5f511c228b92b0a93df97628dd2ad6d
|
4
|
+
data.tar.gz: 28b596c4b83b83300add95b5f9971e4a3c9ceaf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df558fdce2a60deee0e500766a7963769ea6514fb1f97d6129c7d49eb66579f3b45990d9dca0b2506e0e8bb55940a826d1acf33e97233b8162cd4b53ec377862
|
7
|
+
data.tar.gz: 59ef60554676a4eff6919a3168d91803a6c11897cfa7073d52da262c4047640d7de6879a062c086994ea0a6f7fec4e56804ce6b46f444a86777c8151bbc667f5
|
@@ -11,9 +11,29 @@ module NoBrainer::ConnectionManager
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def warn_for_other_orms
|
15
|
+
if defined?(ActiveRecord) && NoBrainer::Config.warn_on_active_record
|
16
|
+
STDERR.puts "[NoBrainer] ActiveRecord is loaded which is probably not what you want."
|
17
|
+
STDERR.puts "[NoBrainer] Follow the instructions on http://nobrainer.io/docs/configuration/#removing_activerecord"
|
18
|
+
STDERR.puts "[NoBrainer] Configure NoBrainer with 'config.warn_on_active_record = false' to disable with warning."
|
19
|
+
end
|
20
|
+
|
21
|
+
if defined?(Mongoid)
|
22
|
+
STDERR.puts "[NoBrainer] WARNING: Mongoid is loaded, and we conflict on the symbol decorations"
|
23
|
+
STDERR.puts "[NoBrainer] They are used in queries such as Model.where(:tags.in => ['fun', 'stuff'])"
|
24
|
+
STDERR.puts "[NoBrainer] This is a problem!"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
14
28
|
def get_new_connection
|
15
29
|
url = NoBrainer::Config.rethinkdb_url
|
16
30
|
raise "Please specify a database connection to RethinkDB" unless url
|
31
|
+
|
32
|
+
# We don't want to warn on "rails g nobrainer:install", but because it's
|
33
|
+
# hard to check when the generator is running because of spring as it wipes
|
34
|
+
# ARGV. So we check for other ORMs during the connection instantiation.
|
35
|
+
warn_for_other_orms
|
36
|
+
|
17
37
|
NoBrainer::Connection.new(url)
|
18
38
|
end
|
19
39
|
|
@@ -56,14 +56,20 @@ module NoBrainer::Document::AtomicOps
|
|
56
56
|
|
57
57
|
def compile_rql_value(rql_doc)
|
58
58
|
field = @instance.class.lookup_field_alias(@field)
|
59
|
-
|
59
|
+
if @is_user_value
|
60
|
+
casted_value = @instance.class.cast_model_to_db_for(@field, @value)
|
61
|
+
value = RethinkDB::RQL.new.expr(casted_value)
|
62
|
+
else
|
63
|
+
value = rql_doc[field]
|
64
|
+
end
|
60
65
|
value = value.default(default_value) if default_value
|
61
66
|
@ops.reduce(value) { |v, (method, a, b)| v.__send__(method, *a, &b) }
|
62
67
|
end
|
63
68
|
|
64
69
|
def modify_source!
|
65
|
-
|
66
|
-
|
70
|
+
if (@is_user_value && @instance.instance_eval { @_attributes[@field].equal?(@value) }) ||
|
71
|
+
!@instance._is_attribute_touched?(@field)
|
72
|
+
@instance._write_attribute(@field, self)
|
67
73
|
end
|
68
74
|
end
|
69
75
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
module NoBrainer::Document::Dirty
|
2
2
|
extend ActiveSupport::Concern
|
3
|
-
# We
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
3
|
+
# 1) We should save the changes as seen through read_attribute, because the
|
4
|
+
# user sees attributes through the read_attribute getters, but it's near
|
5
|
+
# impossible because we would need to wrap the user defined getters, so we'll
|
6
|
+
# go through _read_attribute.
|
7
|
+
# 2) We want to detect changes based on @_attributes to track things like
|
8
|
+
# undefined -> nil. Going through the getters will not give us that.
|
8
9
|
|
9
10
|
def _create(*args)
|
10
11
|
super.tap { clear_dirtiness }
|
@@ -36,7 +37,7 @@ module NoBrainer::Document::Dirty
|
|
36
37
|
def changes
|
37
38
|
result = {}.with_indifferent_access
|
38
39
|
@_old_attributes.each do |attr, old_value|
|
39
|
-
current_value =
|
40
|
+
current_value = _read_attribute(attr)
|
40
41
|
if current_value != old_value || !@_old_attributes_keys.include?(attr)
|
41
42
|
result[attr] = [old_value, current_value]
|
42
43
|
end
|
@@ -49,7 +50,7 @@ module NoBrainer::Document::Dirty
|
|
49
50
|
if current_value == None
|
50
51
|
current_value = begin
|
51
52
|
assert_access_field(attr)
|
52
|
-
|
53
|
+
_read_attribute(attr)
|
53
54
|
rescue NoBrainer::Error::MissingAttribute => e
|
54
55
|
e
|
55
56
|
end
|
@@ -81,7 +82,7 @@ module NoBrainer::Document::Dirty
|
|
81
82
|
inject_in_layer :dirty_tracking do
|
82
83
|
define_method("#{attr}_change") do
|
83
84
|
if @_old_attributes.has_key?(attr)
|
84
|
-
result = [@_old_attributes[attr],
|
85
|
+
result = [@_old_attributes[attr], _read_attribute(attr)]
|
85
86
|
result if result.first != result.last || !@_old_attributes_keys.include?(attr)
|
86
87
|
end
|
87
88
|
end
|
@@ -91,7 +92,7 @@ module NoBrainer::Document::Dirty
|
|
91
92
|
end
|
92
93
|
|
93
94
|
define_method("#{attr}_was") do
|
94
|
-
@_old_attributes.has_key?(attr) ? @_old_attributes[attr] :
|
95
|
+
@_old_attributes.has_key?(attr) ? @_old_attributes[attr] : _read_attribute(attr)
|
95
96
|
end
|
96
97
|
end
|
97
98
|
end
|
@@ -48,12 +48,22 @@ class NoBrainer::Document::Index::Synchronizer
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def sync_indexes(options={})
|
51
|
-
|
52
|
-
|
51
|
+
lock = NoBrainer::Lock.new('nobrainer:sync_indexes')
|
52
|
+
|
53
|
+
lock.synchronize do
|
54
|
+
plan = generate_plan
|
55
|
+
plan.each { |op| lock.refresh; op.run(options) }
|
56
|
+
end
|
57
|
+
|
53
58
|
unless options[:wait] == false
|
54
|
-
models
|
55
|
-
|
59
|
+
# Waiting on all models due to possible races when performing concurrent
|
60
|
+
# sync_indexes()
|
61
|
+
@models_indexes_map.each_key do |model|
|
62
|
+
NoBrainer.run(model.rql_table.index_wait())
|
63
|
+
end
|
56
64
|
end
|
65
|
+
|
66
|
+
true
|
57
67
|
end
|
58
68
|
|
59
69
|
class << self
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module NoBrainer::Document::Validation::Uniqueness
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
+
# XXX we don't use read_attribute_for_validation, which goes through the user
|
5
|
+
# getters, but read internal attributes instead. It makes more sense.
|
6
|
+
|
4
7
|
def save?(options={})
|
5
8
|
lock_unique_fields
|
6
9
|
super
|
@@ -22,7 +25,7 @@ module NoBrainer::Document::Validation::Uniqueness
|
|
22
25
|
self.class.unique_validators
|
23
26
|
.flat_map { |validator| validator.attributes.map { |attr| [attr, validator] } }
|
24
27
|
.select { |f, validator| validator.should_validate_field?(self, f) }
|
25
|
-
.map { |f, validator| [f, *validator.scope].map { |k| [k,
|
28
|
+
.map { |f, validator| [f, *validator.scope].map { |k| [k, _read_attribute(k)] } }
|
26
29
|
.map { |params| self.class._uniqueness_key_name_from_params(params) }
|
27
30
|
.sort.each { |key| _lock_for_uniqueness_once(key) }
|
28
31
|
end
|
@@ -79,7 +82,7 @@ module NoBrainer::Document::Validation::Uniqueness
|
|
79
82
|
end
|
80
83
|
|
81
84
|
def apply_scopes(criteria, doc)
|
82
|
-
criteria.where(scope.map { |k| {k => doc.
|
85
|
+
criteria.where(scope.map { |k| {k => doc._read_attribute(k)} })
|
83
86
|
end
|
84
87
|
|
85
88
|
def exclude_doc(criteria, doc)
|
data/lib/no_brainer/lock.rb
CHANGED
@@ -36,9 +36,8 @@ class NoBrainer::QueryRunner::Reconnect < NoBrainer::QueryRunner::Middleware
|
|
36
36
|
Errno::ECONNRESET, Errno::ETIMEDOUT, IOError
|
37
37
|
true
|
38
38
|
when RethinkDB::RqlRuntimeError
|
39
|
-
e.message =~ /
|
40
|
-
e.message =~ /
|
41
|
-
e.message =~ /Error: Connection Closed/
|
39
|
+
e.message =~ /Primary .* not available/ ||
|
40
|
+
e.message =~ /Connection.*closed/
|
42
41
|
else
|
43
42
|
false
|
44
43
|
end
|
data/lib/no_brainer/railtie.rb
CHANGED
@@ -26,18 +26,6 @@ class NoBrainer::Railtie < Rails::Railtie
|
|
26
26
|
config.after_initialize do
|
27
27
|
NoBrainer::Config.configure unless NoBrainer::Config.configured?
|
28
28
|
|
29
|
-
if defined?(ActiveRecord) && NoBrainer::Config.warn_on_active_record
|
30
|
-
STDERR.puts "[NoBrainer] ActiveRecord is loaded which is probably not what you want."
|
31
|
-
STDERR.puts "[NoBrainer] Follow the instructions on http://nobrainer.io/docs/configuration/#removing_activerecord"
|
32
|
-
STDERR.puts "[NoBrainer] Configure NoBrainer with 'config.warn_on_active_record = false' to disable with warning."
|
33
|
-
end
|
34
|
-
|
35
|
-
if defined?(Mongoid)
|
36
|
-
STDERR.puts "[NoBrainer] WARNING: Mongoid is loaded, and we conflict on the symbol decorations"
|
37
|
-
STDERR.puts "[NoBrainer] They are used in queries such as Model.where(:tags.in => ['fun', 'stuff'])"
|
38
|
-
STDERR.puts "[NoBrainer] This is a problem!"
|
39
|
-
end
|
40
|
-
|
41
29
|
ActionDispatch::Reloader.to_prepare do
|
42
30
|
NoBrainer::Loader.cleanup
|
43
31
|
end
|
data/lib/no_brainer/rql.rb
CHANGED
@@ -13,19 +13,19 @@ module NoBrainer::RQL
|
|
13
13
|
RethinkDB::RQL.new.new_func(&block)))
|
14
14
|
end
|
15
15
|
|
16
|
-
def is_write_query?(
|
17
|
-
type_of(
|
16
|
+
def is_write_query?(rql)
|
17
|
+
type_of(rql) == :write
|
18
18
|
end
|
19
19
|
|
20
|
-
def type_of(
|
21
|
-
case
|
20
|
+
def type_of(rql)
|
21
|
+
case rql.is_a?(RethinkDB::RQL) && rql.body.is_a?(Array) && rql.body.first
|
22
22
|
when UPDATE, DELETE, REPLACE, INSERT
|
23
23
|
:write
|
24
24
|
when DB_CREATE, DB_DROP, DB_LIST, TABLE_CREATE, TABLE_DROP, TABLE_LIST, SYNC,
|
25
25
|
INDEX_CREATE, INDEX_DROP, INDEX_LIST, INDEX_STATUS, INDEX_WAIT
|
26
26
|
:management
|
27
27
|
else
|
28
|
-
# XXX Not
|
28
|
+
# XXX Not necessarily correct, but we'll be happy for logging colors.
|
29
29
|
:read
|
30
30
|
end
|
31
31
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "rails/generators/nobrainer/namespace_fix"
|
2
|
+
require 'rails/generators/base'
|
3
|
+
|
4
|
+
module NoBrainer::Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
extend NoBrainer::Generators::NamespaceFix
|
7
|
+
source_root File.expand_path("../../templates", __FILE__)
|
8
|
+
|
9
|
+
desc "Disable ActiveRecord and generates ./config/initializer/nobrainer.rb"
|
10
|
+
|
11
|
+
class RequireProxy
|
12
|
+
attr_accessor :required_paths
|
13
|
+
def initialize
|
14
|
+
self.required_paths = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def require(path)
|
18
|
+
self.required_paths << path
|
19
|
+
end
|
20
|
+
|
21
|
+
def resolve_require_path(path)
|
22
|
+
$:.map { |dir| File.join(dir, path) }.detect { |f| File.exists?(f) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def expand_require_rails_all
|
27
|
+
require_proxy = RequireProxy.new
|
28
|
+
rails_all_file = require_proxy.resolve_require_path('rails/all.rb')
|
29
|
+
require_proxy.instance_eval(File.read(rails_all_file))
|
30
|
+
|
31
|
+
gsub_file('config/application.rb', %r(^require 'rails/all'$)) do
|
32
|
+
require_proxy.required_paths.map { |f| "require '#{f}'" }.join("\n")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def remove_active_record
|
37
|
+
(Dir['config/environments/*'] + ['config/application.rb']).each do |config_file|
|
38
|
+
comment_lines(config_file, /active_record/)
|
39
|
+
end
|
40
|
+
remove_file('config/database.yml')
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def copy_initializer
|
45
|
+
template('nobrainer.rb', 'config/initializer/nobrainer.rb')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
require "rails/generators/nobrainer"
|
1
|
+
require "rails/generators/nobrainer/namespace_fix"
|
2
|
+
require 'rails/generators/named_base'
|
2
3
|
|
3
4
|
module NoBrainer::Generators
|
4
|
-
class ModelGenerator <
|
5
|
+
class ModelGenerator < Rails::Generators::NamedBase
|
6
|
+
extend NoBrainer::Generators::NamespaceFix
|
7
|
+
source_root File.expand_path("../../templates", __FILE__)
|
8
|
+
|
5
9
|
argument(:attributes, :type => :array, default: [],
|
6
10
|
banner: "field[:type][:index] ... field[:type][:index]")
|
7
11
|
|
@@ -10,7 +14,7 @@ module NoBrainer::Generators
|
|
10
14
|
class_option :parent, :type => :string, :desc => "The parent class for the generated model"
|
11
15
|
|
12
16
|
def create_model_file
|
13
|
-
template "model.rb
|
17
|
+
template "model.rb", File.join("app", "models", class_path, "#{file_name}.rb")
|
14
18
|
end
|
15
19
|
|
16
20
|
hook_for :test_framework
|
@@ -7,7 +7,7 @@ class <%= class_name %><%= " < #{options[:parent].classify}" if options[:parent]
|
|
7
7
|
<% end -%>
|
8
8
|
<% attributes.reject(&:reference?).each do |attribute| -%>
|
9
9
|
field :<%= attribute.name -%>
|
10
|
-
<%=
|
10
|
+
<%= ", :type => #{attribute.type.to_s.classify}" if attribute.type != :object -%>
|
11
11
|
<%= ", :index => true" if attribute.has_index? %>
|
12
12
|
<% end -%>
|
13
13
|
<% attributes.select(&:reference?).each do |attribute| -%>
|
@@ -0,0 +1,92 @@
|
|
1
|
+
NoBrainer.configure do |config|
|
2
|
+
# app_name is the name of your application in lowercase.
|
3
|
+
# When using Rails, the application name is automatically inferred.
|
4
|
+
# config.app_name = config.default_app_name
|
5
|
+
|
6
|
+
# environment defaults to Rails.env for Rails apps or to the environment
|
7
|
+
# variables RUBY_ENV, RAILS_ENV, RACK_ENV, or :production.
|
8
|
+
# config.environment = config.default_environment
|
9
|
+
|
10
|
+
# The rethinkdb_url specifies the RethinkDB database connection url.
|
11
|
+
# When left unspecified, NoBrainer picks a database connection by default.
|
12
|
+
# The default is to use localhost, with a database name matching the
|
13
|
+
# application name and the environment.
|
14
|
+
# NoBrainer also reads environment variables when defined:
|
15
|
+
# * RETHINKDB_URL, RDB_URL
|
16
|
+
# * RETHINKDB_HOST, RETHINKDB_PORT, RETHINKDB_DB, RETHINKDB_AUTH
|
17
|
+
# * RDB_HOST, RDB_PORT, RDB_DB, RDB_AUTH
|
18
|
+
# config.rethinkdb_url = config.default_rethinkdb_url
|
19
|
+
|
20
|
+
# NoBrainer uses logger to emit debugging information.
|
21
|
+
# The default logger is the Rails logger if run with Rails,
|
22
|
+
# otherwise Logger.new(STDERR) with a WARN level.
|
23
|
+
# If the logger is configured with a DEBUG level,
|
24
|
+
# then each database query is emitted.
|
25
|
+
# config.logger = config.default_logger
|
26
|
+
|
27
|
+
# NoBrainer will colorize the queries if colorize_logger is true.
|
28
|
+
# Specifically, NoBrainer will colorize management RQL queries in yellow,
|
29
|
+
# write queries in red and read queries in green.
|
30
|
+
# config.colorize_logger = true
|
31
|
+
|
32
|
+
# You probably do not want to use both NoBrainer and ActiveRecord in your
|
33
|
+
# application. NoBrainer will emit a warning if you do so.
|
34
|
+
# You can turn off the warning if you want to use both.
|
35
|
+
# config.warn_on_active_record = true
|
36
|
+
|
37
|
+
# When the network connection is lost, NoBrainer can retry running a given
|
38
|
+
# query a few times before giving up. Note that this can be a problem with
|
39
|
+
# non idempotent write queries such as increments.
|
40
|
+
# Setting it to 0 disable retries during reconnections.
|
41
|
+
# The default is 1 for development or test environment, otherwise 15.
|
42
|
+
# config.max_retries_on_connection_failure = \
|
43
|
+
# config.default_max_retries_on_connection_failure
|
44
|
+
|
45
|
+
# Configures the durability for database writes.
|
46
|
+
# The default is :soft for development or test environment, otherwise :hard.
|
47
|
+
# config.durability = config.default_durability
|
48
|
+
|
49
|
+
# Persisted Strings have a configurable maximum length. To get rid of the
|
50
|
+
# length validation, you may use the Text type instead.
|
51
|
+
# config.max_string_length = 255
|
52
|
+
|
53
|
+
# user_timezone can be configured with :utc, :local, or :unchanged.
|
54
|
+
# When reading an attribute from a model which type is Time, the timezone
|
55
|
+
# of that time is translated according to this setting.
|
56
|
+
# config.user_timezone = :local
|
57
|
+
|
58
|
+
# db_timezone can be configured with :utc, :local, or :unchanged.
|
59
|
+
# When writting to the database, the timezone of Time attributes are
|
60
|
+
# translated according to this setting.
|
61
|
+
# config.db_timezone = :utc
|
62
|
+
|
63
|
+
# Default options used when compiling geo queries.
|
64
|
+
# config.geo_options => { :geo_system => 'WGS84', :unit => 'm' }
|
65
|
+
|
66
|
+
# Configures which mechanism to use in order to perform non-racy uniqueness
|
67
|
+
# validations. More about this behavior in the Distributed Locks section.
|
68
|
+
# config.distributed_lock_class = NoBrainer::Lock
|
69
|
+
|
70
|
+
# Configures the default timing lock options.
|
71
|
+
# config.lock_options = { :expire => 60, :timeout => 10 }
|
72
|
+
|
73
|
+
# Instead of using a single connection to the database, You can tell
|
74
|
+
# NoBrainer to spin up a new connection for each thread. This is
|
75
|
+
# useful for multi-threading usage such as Sidekiq.
|
76
|
+
# Call NoBrainer.disconnect before a thread exits, otherwise you will have
|
77
|
+
# a resource leak, and you will run out of connections.
|
78
|
+
# Note that this is solution is temporary, until we get a connection pool.
|
79
|
+
# config.per_thread_connection = false
|
80
|
+
|
81
|
+
# The machine id is used to generate primary keys. The default one is seeded
|
82
|
+
# with the machine IP with Socket.gethostname.
|
83
|
+
# The env variable MACHINE_ID can also be used to set the machine id.
|
84
|
+
# When using distinct machine_id, then primary keys are guaranteed to be
|
85
|
+
# generated without conflicts.
|
86
|
+
# config.machine_id = config.default_machine_id
|
87
|
+
|
88
|
+
# Criteria cache elements. For example, the result of a has_many association
|
89
|
+
# is cached. The per criteria cache is disabled if it grows too big to avoid
|
90
|
+
# out of memory issues.
|
91
|
+
# config.criteria_cache_max_entries = 10_000
|
92
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nobrainer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.26.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Viennot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rethinkdb
|
@@ -192,9 +192,11 @@ files:
|
|
192
192
|
- lib/no_brainer/railtie/database.rake
|
193
193
|
- lib/no_brainer/rql.rb
|
194
194
|
- lib/nobrainer.rb
|
195
|
-
- lib/rails/generators/nobrainer.rb
|
196
|
-
- lib/rails/generators/nobrainer/
|
197
|
-
- lib/rails/generators/nobrainer/
|
195
|
+
- lib/rails/generators/nobrainer/install_generator.rb
|
196
|
+
- lib/rails/generators/nobrainer/model_generator.rb
|
197
|
+
- lib/rails/generators/nobrainer/namespace_fix.rb
|
198
|
+
- lib/rails/generators/templates/model.rb
|
199
|
+
- lib/rails/generators/templates/nobrainer.rb
|
198
200
|
homepage: http://nobrainer.io
|
199
201
|
licenses:
|
200
202
|
- LGPLv3
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'rails/generators/named_base'
|
2
|
-
require 'nobrainer'
|
3
|
-
|
4
|
-
module NoBrainer::Generators
|
5
|
-
class Base < Rails::Generators::NamedBase
|
6
|
-
def self.base_name
|
7
|
-
'nobrainer'
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.base_root
|
11
|
-
File.dirname(__FILE__)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.namespace
|
15
|
-
super.gsub(/no_brainer/, 'nobrainer')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|