dm-is-reflective 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e0cf6d64d700dd5f9892573cc43a1d19eb3ba2cd
4
- data.tar.gz: 7c7647fd2e0a7c917aaf4b035432cff3849ad828
2
+ SHA256:
3
+ metadata.gz: 972e519551e2031e811a3e88abca4ae417993dfd88c14c3470784f2abe5ddeaa
4
+ data.tar.gz: ffc5f2f1637e6fd97304a40533326361226661693038e0a30ef333f05ed522cd
5
5
  SHA512:
6
- metadata.gz: f2551113619f6540170864bcb217550037d70e5f4887812c88501b8aa302174080b7244817596e47d45e7d9826b0d152a39cc040d352a2d7803795b33e5946b0
7
- data.tar.gz: eb33bdb42e9c47d686a7f8cd99a8848f99260fa82053d751e070855de838f045aa4b146b5919fa469a77b9b8b3b71cfd1f7b9cbb59b658d37c2e6702e64c10f6
6
+ metadata.gz: 31ca16bc14df04ad99fc3b4141d5730e123e81fd64304b188f54cd576045856b8441dd14f537755d7a7dd846a6d99aafa0206a0c7cfd21bc32a4109097406b7f
7
+ data.tar.gz: 8cd3bb490db9d397b02ae9b1e78424547ad6cbd4885ccb991f527a372265104157b034bb5e3b74336f9ff1278bb207545d2eff1d269839fa88aef6572a807be6
data/.gitignore CHANGED
@@ -1,7 +1,2 @@
1
- tmp
2
- pkg
3
- doc
4
- ann-*
5
- Gemfile.lock
6
-
1
+ /pkg/
7
2
  *.rbc
@@ -1,15 +1,28 @@
1
- before_install:
2
- - 'git submodule update --init'
3
- - mysql -e 'create database myapp_test;'
4
- - psql -c 'create database myapp_test;' -U postgres
1
+ sudo: false
2
+ language: ruby
3
+
4
+ install: 'gem install bundler; bundle install --retry=3'
5
+ script: 'ruby -vr bundler/setup -S rake test'
5
6
 
6
- script: 'ruby -r bundler/setup -S rake test'
7
+ matrix:
8
+ include:
9
+ - rvm: 2.2
10
+ - rvm: 2.3
11
+ - rvm: 2.4
12
+ - rvm: ruby-head
13
+ - rvm: jruby
14
+ env: JRUBY_OPTS=--debug
15
+ - rvm: rbx
7
16
 
8
- env:
9
- - 'RBXOPT=-X19'
17
+ allow_failures:
18
+ - rvm: rbx
19
+ - rvm: jruby
10
20
 
11
- rvm:
12
- - 1.9.3
13
- - 2.0.0
14
- - rbx-head
15
- - jruby-head
21
+ addons:
22
+ postgresql: 9.3
23
+
24
+ before_install:
25
+ - sudo apt-get update
26
+ - sudo apt-get install postgresql-server-dev-9.3 libpq-dev
27
+ - mysql -e 'create database myapp_test;'
28
+ - psql -c 'create database myapp_test;' -U postgres
data/CHANGES.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # CHANGES
2
2
 
3
+ ## dm-is-reflective 1.3.2 -- 2017-12-29
4
+
5
+ * Prefix an underscore whenever the property begins with a number, which
6
+ cannot be used as a method name. See:
7
+ [#9](https://github.com/godfat/dm-is-reflective/pull/9)
8
+ Thanks Mischa Molhoek (@mmolhoek)
9
+ * Don't create the model for PostgreSQL views. See:
10
+ [#10](https://github.com/godfat/dm-is-reflective/pull/10)
11
+ Thanks @philfine
12
+
3
13
  ## dm-is-reflective 1.3.1, 2013-05-22
4
14
 
5
15
  * Introduce `indices` method which would return all indices in the storage.
data/Gemfile CHANGED
@@ -5,3 +5,10 @@ gemspec
5
5
 
6
6
  gem 'rake'
7
7
  gem 'bacon'
8
+
9
+ gem 'simplecov', :require => false if ENV['COV']
10
+ gem 'coveralls', :require => false if ENV['CI']
11
+
12
+ platforms :rbx do
13
+ gem 'rubysl-singleton' # used in rake
14
+ end
data/README.md CHANGED
@@ -140,12 +140,15 @@ puts User.to_source
140
140
 
141
141
  * Andrew Kreps (@onewheelskyward)
142
142
  * Lin Jen-Shin (@godfat)
143
+ * Mischa Molhoek (@mmolhoek)
144
+ * @philfine
145
+ * Sebastian Marr (@sebastianmarr)
143
146
 
144
147
  ## LICENSE:
145
148
 
146
149
  Apache License 2.0
147
150
 
148
- Copyright (c) 2008-2013, Lin Jen-Shin (godfat)
151
+ Copyright (c) 2008-2017, Lin Jen-Shin (godfat)
149
152
 
150
153
  Licensed under the Apache License, Version 2.0 (the "License");
151
154
  you may not use this file except in compliance with the License.
data/Rakefile CHANGED
@@ -1,28 +1,19 @@
1
- # encoding: utf-8
2
1
 
3
2
  begin
4
3
  require "#{dir = File.dirname(__FILE__)}/task/gemgem"
5
4
  rescue LoadError
6
- sh "git submodule update --init"
7
- exec Gem.ruby, "-S", "rake", *ARGV
5
+ sh 'git submodule update --init'
6
+ exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
8
7
  end
9
8
 
10
- Gemgem.dir = dir
11
- ($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib" )).uniq!
9
+ Gemgem.init(dir) do |s|
10
+ require 'dm-is-reflective/version'
11
+ s.name = 'dm-is-reflective'
12
+ s.version = DmIsReflective::VERSION
12
13
 
13
- desc 'Generate gemspec'
14
- task 'gem:spec' do
15
- Gemgem.spec = Gemgem.create do |s|
16
- require 'dm-is-reflective/version'
17
- s.name = 'dm-is-reflective'
18
- s.version = DmIsReflective::VERSION
19
-
20
- %w[dm-core dm-do-adapter].each{ |g| s.add_runtime_dependency(g) }
21
- %w[dm-migrations
22
- dm-sqlite-adapter
23
- dm-mysql-adapter
24
- dm-postgres-adapter].each{ |g| s.add_development_dependency(g) }
25
- end
26
-
27
- Gemgem.write
14
+ %w[dm-core dm-do-adapter].each{ |g| s.add_runtime_dependency(g) }
15
+ %w[dm-migrations
16
+ dm-sqlite-adapter
17
+ dm-mysql-adapter
18
+ dm-postgres-adapter].each{ |g| s.add_development_dependency(g) }
28
19
  end
@@ -1,78 +1,79 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ # stub: dm-is-reflective 1.3.2 ruby lib
2
3
 
3
4
  Gem::Specification.new do |s|
4
- s.name = "dm-is-reflective"
5
- s.version = "1.3.1"
5
+ s.name = "dm-is-reflective".freeze
6
+ s.version = "1.3.2"
6
7
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Lin Jen-Shin (godfat)"]
9
- s.date = "2013-05-22"
10
- s.description = "DataMapper plugin that helps you manipulate an existing database.\nIt creates mappings between existing columns and model's properties."
11
- s.email = ["godfat (XD) godfat.org"]
12
- s.executables = ["dm-is-reflective"]
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib".freeze]
10
+ s.authors = ["Lin Jen-Shin (godfat)".freeze]
11
+ s.date = "2017-12-29"
12
+ s.description = "DataMapper plugin that helps you manipulate an existing database.\nIt creates mappings between existing columns and model's properties.".freeze
13
+ s.email = ["godfat (XD) godfat.org".freeze]
14
+ s.executables = ["dm-is-reflective".freeze]
13
15
  s.files = [
14
- ".gitignore",
15
- ".gitmodules",
16
- ".travis.yml",
17
- "CHANGES.md",
18
- "Gemfile",
19
- "LICENSE",
20
- "README.md",
21
- "Rakefile",
22
- "TODO.md",
23
- "bin/dm-is-reflective",
24
- "dm-is-reflective.gemspec",
25
- "lib/dm-is-reflective.rb",
26
- "lib/dm-is-reflective/adapters/data_objects_adapter.rb",
27
- "lib/dm-is-reflective/adapters/mysql_adapter.rb",
28
- "lib/dm-is-reflective/adapters/postgres_adapter.rb",
29
- "lib/dm-is-reflective/adapters/sqlite_adapter.rb",
30
- "lib/dm-is-reflective/reflective.rb",
31
- "lib/dm-is-reflective/runner.rb",
32
- "lib/dm-is-reflective/test.rb",
33
- "lib/dm-is-reflective/version.rb",
34
- "task/.gitignore",
35
- "task/gemgem.rb",
36
- "test/setup_db.sh",
37
- "test/test_mysql.rb",
38
- "test/test_postgres.rb",
39
- "test/test_sqlite.rb",
40
- "test/test_to_source.rb"]
41
- s.homepage = "https://github.com/godfat/dm-is-reflective"
42
- s.licenses = ["Apache License 2.0"]
43
- s.require_paths = ["lib"]
44
- s.rubygems_version = "2.0.3"
45
- s.summary = "DataMapper plugin that helps you manipulate an existing database."
16
+ ".gitignore".freeze,
17
+ ".gitmodules".freeze,
18
+ ".travis.yml".freeze,
19
+ "CHANGES.md".freeze,
20
+ "Gemfile".freeze,
21
+ "LICENSE".freeze,
22
+ "README.md".freeze,
23
+ "Rakefile".freeze,
24
+ "TODO.md".freeze,
25
+ "bin/dm-is-reflective".freeze,
26
+ "dm-is-reflective.gemspec".freeze,
27
+ "lib/dm-is-reflective.rb".freeze,
28
+ "lib/dm-is-reflective/adapters/data_objects_adapter.rb".freeze,
29
+ "lib/dm-is-reflective/adapters/mysql_adapter.rb".freeze,
30
+ "lib/dm-is-reflective/adapters/postgres_adapter.rb".freeze,
31
+ "lib/dm-is-reflective/adapters/sqlite_adapter.rb".freeze,
32
+ "lib/dm-is-reflective/reflective.rb".freeze,
33
+ "lib/dm-is-reflective/runner.rb".freeze,
34
+ "lib/dm-is-reflective/test.rb".freeze,
35
+ "lib/dm-is-reflective/version.rb".freeze,
36
+ "task/README.md".freeze,
37
+ "task/gemgem.rb".freeze,
38
+ "test/setup_db.sh".freeze,
39
+ "test/test_mysql.rb".freeze,
40
+ "test/test_postgres.rb".freeze,
41
+ "test/test_sqlite.rb".freeze,
42
+ "test/test_to_source.rb".freeze]
43
+ s.homepage = "https://github.com/godfat/dm-is-reflective".freeze
44
+ s.licenses = ["Apache License 2.0".freeze]
45
+ s.rubygems_version = "2.7.3".freeze
46
+ s.summary = "DataMapper plugin that helps you manipulate an existing database.".freeze
46
47
  s.test_files = [
47
- "test/test_mysql.rb",
48
- "test/test_postgres.rb",
49
- "test/test_sqlite.rb",
50
- "test/test_to_source.rb"]
48
+ "test/test_mysql.rb".freeze,
49
+ "test/test_postgres.rb".freeze,
50
+ "test/test_sqlite.rb".freeze,
51
+ "test/test_to_source.rb".freeze]
51
52
 
52
53
  if s.respond_to? :specification_version then
53
54
  s.specification_version = 4
54
55
 
55
56
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
- s.add_runtime_dependency(%q<dm-core>, [">= 0"])
57
- s.add_runtime_dependency(%q<dm-do-adapter>, [">= 0"])
58
- s.add_development_dependency(%q<dm-migrations>, [">= 0"])
59
- s.add_development_dependency(%q<dm-sqlite-adapter>, [">= 0"])
60
- s.add_development_dependency(%q<dm-mysql-adapter>, [">= 0"])
61
- s.add_development_dependency(%q<dm-postgres-adapter>, [">= 0"])
57
+ s.add_runtime_dependency(%q<dm-core>.freeze, [">= 0"])
58
+ s.add_runtime_dependency(%q<dm-do-adapter>.freeze, [">= 0"])
59
+ s.add_development_dependency(%q<dm-migrations>.freeze, [">= 0"])
60
+ s.add_development_dependency(%q<dm-sqlite-adapter>.freeze, [">= 0"])
61
+ s.add_development_dependency(%q<dm-mysql-adapter>.freeze, [">= 0"])
62
+ s.add_development_dependency(%q<dm-postgres-adapter>.freeze, [">= 0"])
62
63
  else
63
- s.add_dependency(%q<dm-core>, [">= 0"])
64
- s.add_dependency(%q<dm-do-adapter>, [">= 0"])
65
- s.add_dependency(%q<dm-migrations>, [">= 0"])
66
- s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
67
- s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
68
- s.add_dependency(%q<dm-postgres-adapter>, [">= 0"])
64
+ s.add_dependency(%q<dm-core>.freeze, [">= 0"])
65
+ s.add_dependency(%q<dm-do-adapter>.freeze, [">= 0"])
66
+ s.add_dependency(%q<dm-migrations>.freeze, [">= 0"])
67
+ s.add_dependency(%q<dm-sqlite-adapter>.freeze, [">= 0"])
68
+ s.add_dependency(%q<dm-mysql-adapter>.freeze, [">= 0"])
69
+ s.add_dependency(%q<dm-postgres-adapter>.freeze, [">= 0"])
69
70
  end
70
71
  else
71
- s.add_dependency(%q<dm-core>, [">= 0"])
72
- s.add_dependency(%q<dm-do-adapter>, [">= 0"])
73
- s.add_dependency(%q<dm-migrations>, [">= 0"])
74
- s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
75
- s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
76
- s.add_dependency(%q<dm-postgres-adapter>, [">= 0"])
72
+ s.add_dependency(%q<dm-core>.freeze, [">= 0"])
73
+ s.add_dependency(%q<dm-do-adapter>.freeze, [">= 0"])
74
+ s.add_dependency(%q<dm-migrations>.freeze, [">= 0"])
75
+ s.add_dependency(%q<dm-sqlite-adapter>.freeze, [">= 0"])
76
+ s.add_dependency(%q<dm-mysql-adapter>.freeze, [">= 0"])
77
+ s.add_dependency(%q<dm-postgres-adapter>.freeze, [">= 0"])
77
78
  end
78
79
  end
@@ -5,7 +5,7 @@ module DmIsReflective::PostgresAdapter
5
5
  def storages
6
6
  sql = <<-SQL
7
7
  SELECT table_name FROM "information_schema"."tables"
8
- WHERE table_schema = current_schema()
8
+ WHERE table_schema = current_schema() AND table_type = 'BASE TABLE'
9
9
  SQL
10
10
 
11
11
  select(Ext::String.compress_lines(sql))
@@ -55,13 +55,19 @@ module DmIsReflective
55
55
 
56
56
  reflected = targets.each{ |target|
57
57
  case target
58
- when Regexp;
59
- break name if name.to_s =~ target
58
+ when Regexp
59
+ if name.to_s =~ target
60
+ if name.to_s =~ /^\d/
61
+ break :"_#{name}" # TODO: missing test for this
62
+ else
63
+ break name
64
+ end
65
+ end
60
66
 
61
- when Symbol, String;
67
+ when Symbol, String
62
68
  break name if name == target.to_sym
63
69
 
64
- when Class;
70
+ when Class
65
71
  break name if type == target
66
72
 
67
73
  else
@@ -73,8 +73,9 @@ module DmIsReflective::Runner
73
73
  end
74
74
 
75
75
  def help
76
- maxn = options.transpose.first.map(&:size).max
77
- maxd = options.transpose.last .map(&:size).max
76
+ optt = options.transpose
77
+ maxn = optt.first.map(&:size).max
78
+ maxd = optt.last .map(&:size).max
78
79
  "Usage: dm-is-reflective DATABASE_URI\n" +
79
80
  options.map{ |(name, desc)|
80
81
  if desc.empty?
@@ -1,4 +1,4 @@
1
1
 
2
2
  module DmIsReflective
3
- VERSION = '1.3.1'
3
+ VERSION = '1.3.2'
4
4
  end
@@ -0,0 +1,54 @@
1
+ # Gemgem
2
+
3
+ ## DESCRIPTION:
4
+
5
+ Provided tasks:
6
+
7
+ rake clean # Trash ignored files
8
+ rake gem:build # Build gem
9
+ rake gem:install # Install gem
10
+ rake gem:release # Release gem
11
+ rake gem:spec # Generate gemspec
12
+ rake test # Run tests
13
+
14
+ ## REQUIREMENTS:
15
+
16
+ * Tested with MRI (official CRuby), Rubinius and JRuby.
17
+
18
+ ## INSTALLATION:
19
+
20
+ git submodule add git://github.com/godfat/gemgem.git task
21
+
22
+ And in Rakefile:
23
+
24
+ ``` ruby
25
+ begin
26
+ require "#{__dir__}/task/gemgem"
27
+ rescue LoadError
28
+ sh 'git submodule update --init --recursive'
29
+ exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
30
+ end
31
+
32
+ Gemgem.init(__dir__, :submodules => %w[your-dep]) do |s|
33
+ s.name = 'your-gem'
34
+ s.version = '0.1.0'
35
+ end
36
+ ```
37
+
38
+ ## LICENSE:
39
+
40
+ Apache License 2.0 (Apache-2.0)
41
+
42
+ Copyright (c) 2011-2017, Lin Jen-Shin (godfat)
43
+
44
+ Licensed under the Apache License, Version 2.0 (the "License");
45
+ you may not use this file except in compliance with the License.
46
+ You may obtain a copy of the License at
47
+
48
+ <http://www.apache.org/licenses/LICENSE-2.0>
49
+
50
+ Unless required by applicable law or agreed to in writing, software
51
+ distributed under the License is distributed on an "AS IS" BASIS,
52
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
53
+ See the License for the specific language governing permissions and
54
+ limitations under the License.
@@ -1,107 +1,150 @@
1
1
 
2
- require 'pathname'
3
-
4
2
  module Gemgem
5
3
  class << self
6
- attr_accessor :dir, :spec
4
+ attr_accessor :dir, :spec, :submodules, :spec_create
7
5
  end
8
6
 
9
7
  module_function
8
+ def gem_tag ; "#{spec.name}-#{spec.version}" ; end
9
+ def gem_path ; "#{pkg_dir}/#{gem_tag}.gem" ; end
10
+ def spec_path ; "#{dir}/#{spec.name}.gemspec" ; end
11
+ def pkg_dir ; "#{dir}/pkg" ; end
12
+ def escaped_dir; @escaped_dir ||= Regexp.escape(dir); end
13
+
14
+ def init dir, options={}, &block
15
+ self.dir = dir
16
+ ENV['RUBYLIB'] = "#{dir}/lib:#{ENV['RUBYLIB']}"
17
+ ENV['PATH'] = "#{dir}/bin:#{ENV['PATH']}"
18
+ self.submodules = options[:submodules] || []
19
+ self.spec_create = block
20
+
21
+ $LOAD_PATH.unshift("#{dir}/lib", *submodules_libs)
22
+ end
23
+
10
24
  def create
11
- yield(spec = Gem::Specification.new{ |s|
25
+ spec = Gem::Specification.new do |s|
12
26
  s.authors = ['Lin Jen-Shin (godfat)']
13
27
  s.email = ['godfat (XD) godfat.org']
14
28
 
15
29
  s.description = description.join
16
30
  s.summary = description.first
17
- s.license = readme['LICENSE'].sub(/.+\n\n/, '').lines.first.strip
18
-
19
- s.rubygems_version = Gem::VERSION
20
- s.date = Time.now.strftime('%Y-%m-%d')
21
- s.files = gem_files
22
- s.test_files = gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
23
- s.executables = Dir['bin/*'].map{ |f| File.basename(f) }
24
- s.require_paths = %w[lib]
25
- })
31
+ s.license = license
32
+
33
+ s.date = Time.now.strftime('%Y-%m-%d')
34
+ s.files = gem_files
35
+ s.test_files = test_files
36
+ s.executables = bin_files
37
+ end
38
+ spec_create.call(spec)
26
39
  spec.homepage ||= "https://github.com/godfat/#{spec.name}"
27
- spec
40
+ self.spec = spec
28
41
  end
29
42
 
30
- def readme
31
- path = %w[README.md README].find{ |name|
32
- File.exist?("#{Gemgem.dir}/#{name}")
33
- }
34
- @readme ||=
35
- if path
36
- ps = "##{File.read(path)}".
37
- scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
38
- ps.inject('HEADER' => ps.first){ |r, s, i|
39
- r[s[/\w+/]] = s
40
- r
41
- }
42
- else
43
- {}
44
- end
43
+ def gem_install
44
+ require 'rubygems/commands/install_command'
45
+ # read ~/.gemrc
46
+ Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
47
+ Gem::Command.extra_args = Gem.configuration[:gem]
48
+
49
+ # setup install options
50
+ cmd = Gem::Commands::InstallCommand.new
51
+ cmd.handle_options([])
52
+
53
+ # install
54
+ install = Gem::Installer.new(gem_path, cmd.options)
55
+ install.install
56
+ puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
45
57
  end
46
58
 
47
- def description
48
- @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines
59
+ def gem_spec
60
+ create
61
+ write
49
62
  end
50
63
 
51
- def changes
52
- path = %w[CHANGES.md CHANGES].find{ |name|
53
- File.exist?("#{Gemgem.dir}/#{name}")
54
- }
55
- @changes ||=
56
- if path
57
- date = '\d+{4}\-\d+{2}\-\d{2}'
58
- File.read(path).match(
59
- /([^\n]+#{date}\n\n(.+?))(?=\n\n[^\n]+#{date}\n|\Z)/m)[1]
60
- else
61
- ''
62
- end
64
+ def gem_build
65
+ require 'fileutils'
66
+ require 'rubygems/package'
67
+ gem = nil
68
+ Dir.chdir(dir) do
69
+ gem = Gem::Package.build(Gem::Specification.load(spec_path))
70
+ FileUtils.mkdir_p(pkg_dir)
71
+ FileUtils.mv(gem, pkg_dir) # gem is relative path, but might be ok
72
+ end
73
+ puts "\e[35mGem built: \e[33m#{strip_path("#{pkg_dir}/#{gem}")}\e[0m"
63
74
  end
64
75
 
65
- def ann_md
66
- "#{readme['HEADER'].sub(/([\w\-]+)/, "[\\1](#{spec.homepage})")}\n\n" \
67
- "##{readme['DESCRIPTION'][/[^\n]+\n\n[^\n]+/]}\n\n" \
68
- "### CHANGES:\n\n" \
69
- "###{changes}\n\n" \
70
- "##{readme['INSTALLATION']}\n\n" +
71
- if readme['SYNOPSIS'] then "##{readme['SYNOPSIS'][/[^\n]+\n\n[^\n]+/]}"
72
- else '' end
76
+ def gem_release
77
+ sh_git('tag', gem_tag)
78
+ sh_git('push')
79
+ sh_git('push', '--tags')
80
+ sh_gem('push', gem_path)
73
81
  end
74
82
 
75
- def ann_html
76
- gem 'nokogiri'
77
- gem 'kramdown'
83
+ def gem_check
84
+ unless git('status', '--porcelain').empty?
85
+ puts("\e[35mWorking copy is not clean.\e[0m")
86
+ exit(3)
87
+ end
88
+
89
+ ver = spec.version.to_s
78
90
 
79
- IO.popen('kramdown', 'r+') do |md|
80
- md.puts Gemgem.ann_md
81
- md.close_write
82
- require 'nokogiri'
83
- html = Nokogiri::XML.parse("<gemgem>#{md.read}</gemgem>")
84
- html.css('*').each{ |n| n.delete('id') }
85
- html.root.children.to_html
91
+ if ENV['VERSION'].nil?
92
+ puts("\e[35mExpected " \
93
+ "\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
94
+ exit(1)
95
+
96
+ elsif ENV['VERSION'] != ver
97
+ puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
98
+ "\e[35mbut got\n " \
99
+ "\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
100
+ exit(2)
86
101
  end
87
102
  end
88
103
 
89
- def ann_email
90
- "#{readme['HEADER'].sub(/([\w\-]+)/, "\\1 <#{spec.homepage}>")}\n\n" \
91
- "#{readme['DESCRIPTION']}\n\n" \
92
- "#{readme['INSTALLATION']}\n\n" +
93
- if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}\n\n" else '' end +
94
- "## CHANGES:\n\n" \
95
- "##{changes}\n\n"
104
+ def test
105
+ return if test_files.empty?
106
+
107
+ if ENV['COV'] || ENV['CI']
108
+ require 'simplecov'
109
+ if ENV['CI']
110
+ begin
111
+ require 'coveralls'
112
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
113
+ rescue LoadError => e
114
+ puts "Cannot load coveralls, skip: #{e}"
115
+ end
116
+ end
117
+ SimpleCov.start do
118
+ add_filter('test/')
119
+ add_filter('test.rb')
120
+ submodules_libs.each(&method(:add_filter))
121
+ end
122
+ end
123
+
124
+ test_files.each{ |file| require "#{dir}/#{file[0..-4]}" }
96
125
  end
97
126
 
98
- def gem_tag
99
- "#{spec.name}-#{spec.version}"
127
+ def clean
128
+ return if ignored_files.empty?
129
+
130
+ require 'fileutils'
131
+ trash = File.expand_path("~/.Trash/#{spec.name}")
132
+ puts "Move the following files into: \e[35m#{strip_path(trash)}\e[33m"
133
+
134
+ ignored_files.each do |file|
135
+ from = "#{dir}/#{file}"
136
+ to = "#{trash}/#{File.dirname(file)}"
137
+ puts strip_path(from)
138
+
139
+ FileUtils.mkdir_p(to)
140
+ FileUtils.mv(from, to)
141
+ end
142
+
143
+ print "\e[0m"
100
144
  end
101
145
 
102
146
  def write
103
- File.open("#{dir}/#{spec.name}.gemspec", 'w'){ |f|
104
- f << split_lines(spec.to_ruby) }
147
+ File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
105
148
  end
106
149
 
107
150
  def split_lines ruby
@@ -114,65 +157,139 @@ module Gemgem
114
157
  }
115
158
  end
116
159
 
160
+ def strip_path path
161
+ strip_home_path(strip_cwd_path(path))
162
+ end
163
+
164
+ def strip_home_path path
165
+ path.sub(/\A#{Regexp.escape(ENV['HOME'])}\//, '~/')
166
+ end
167
+
168
+ def strip_cwd_path path
169
+ path.sub(/\A#{Regexp.escape(Dir.pwd)}\//, '')
170
+ end
171
+
172
+ def submodules_libs
173
+ submodules.map{ |path| "#{dir}/#{path}/lib" }
174
+ end
175
+
176
+ def git *args
177
+ `git --git-dir=#{dir}/.git #{args.join(' ')}`
178
+ end
179
+
180
+ def sh_git *args
181
+ Rake.sh('git', "--git-dir=#{dir}/.git", *args)
182
+ end
183
+
184
+ def sh_gem *args
185
+ Rake.sh(Gem.ruby, '-S', 'gem', *args)
186
+ end
187
+
188
+ def glob path=dir
189
+ Dir.glob("#{path}/**/*", File::FNM_DOTMATCH)
190
+ end
191
+
192
+ def readme
193
+ @readme ||=
194
+ if (path = "#{Gemgem.dir}/README.md") && File.exist?(path)
195
+ ps = "##{File.read(path)}".
196
+ scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
197
+ ps.inject('HEADER' => ps.first){ |r, s, i|
198
+ r[s[/\w+/]] = s
199
+ r
200
+ }
201
+ else
202
+ {}
203
+ end
204
+ end
205
+
206
+ def description
207
+ # JRuby String#lines is returning an enumerator
208
+ @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
209
+ end
210
+
211
+ def license
212
+ readme['LICENSE'].sub(/.+\n\n/, '').lines.first.
213
+ split(/[()]/).map(&:strip).reject(&:empty?).last
214
+ end
215
+
117
216
  def all_files
118
- @all_files ||= find_files(Pathname.new(dir)).map{ |file|
119
- if file.to_s =~ %r{\.git/|\.git$}
120
- nil
217
+ @all_files ||= fold_files(glob).sort
218
+ end
219
+
220
+ def fold_files files
221
+ files.inject([]){ |r, path|
222
+ if File.file?(path) && path !~ %r{/\.git(/|$)} &&
223
+ (rpath = path[%r{^#{escaped_dir}/(.*$)}, 1])
224
+ r << rpath
225
+ elsif File.symlink?(path) # walk into symlinks...
226
+ r.concat(fold_files(glob(File.expand_path(path,
227
+ File.readlink(path)))))
121
228
  else
122
- file.to_s
229
+ r
123
230
  end
124
- }.compact.sort
231
+ }
125
232
  end
126
233
 
127
234
  def gem_files
128
- @gem_files ||= all_files - ignored_files
235
+ @gem_files ||= all_files.reject{ |f|
236
+ f =~ submodules_pattern ||
237
+ (f =~ ignored_pattern && !git_files.include?(f))
238
+ }
129
239
  end
130
240
 
131
- def ignored_files
132
- @ignored_file ||= all_files.select{ |path| ignore_patterns.find{ |ignore|
133
- path =~ ignore && !git_files.include?(path)}}
241
+ def test_files
242
+ @test_files ||= gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
243
+ end
244
+
245
+ def bin_files
246
+ @bin_files ||= gem_files.grep(%r{^bin/}).map{ |f| File.basename(f) }
134
247
  end
135
248
 
136
249
  def git_files
137
250
  @git_files ||= if File.exist?("#{dir}/.git")
138
- `git ls-files`.split("\n")
251
+ git('ls-files').split("\n")
139
252
  else
140
253
  []
141
254
  end
142
255
  end
143
256
 
144
- # protected
145
- def find_files path
146
- path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
147
- path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
257
+ def ignored_files
258
+ @ignored_files ||= all_files.grep(ignored_pattern)
259
+ end
260
+
261
+ def ignored_pattern
262
+ @ignored_pattern ||= if gitignore.empty?
263
+ /^$/
264
+ else
265
+ Regexp.new(expand_patterns(gitignore).join('|'))
266
+ end
148
267
  end
149
268
 
150
- def ignore_patterns
151
- @ignore_files ||= expand_patterns(
152
- gitignore.split("\n").reject{ |pattern|
153
- pattern.strip == ''
154
- }).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
269
+ def submodules_pattern
270
+ @submodules_pattern ||= if submodules.empty?
271
+ /^$/
272
+ else
273
+ Regexp.new(submodules.map{ |path|
274
+ "^#{Regexp.escape(path)}/" }.join('|'))
275
+ end
155
276
  end
156
277
 
157
278
  def expand_patterns pathes
158
- pathes.map{ |path|
159
- if path !~ /\*/
160
- path
161
- else
162
- expand_patterns(
163
- Dir[path] +
164
- Pathname.new(File.dirname(path)).children.select(&:directory?).
165
- map{ |prefix| "#{prefix}/#{File.basename(path)}" })
166
- end
167
- }.flatten
279
+ # http://git-scm.com/docs/gitignore
280
+ pathes.flat_map{ |path|
281
+ # we didn't implement negative pattern for now
282
+ Regexp.escape(path).sub(%r{^/}, '^').gsub(/\\\*/, '[^/]*')
283
+ }
168
284
  end
169
285
 
170
286
  def gitignore
171
- if File.exist?(path = "#{dir}/.gitignore")
172
- File.read(path)
173
- else
174
- ''
175
- end
287
+ @gitignore ||= if File.exist?(path = "#{dir}/.gitignore")
288
+ File.read(path).lines.
289
+ reject{ |l| l == /^\s*(#|\s+$)/ }.map(&:strip)
290
+ else
291
+ []
292
+ end
176
293
  end
177
294
  end
178
295
 
@@ -180,89 +297,42 @@ namespace :gem do
180
297
 
181
298
  desc 'Install gem'
182
299
  task :install => [:build] do
183
- sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}.gem")
300
+ Gemgem.gem_install
184
301
  end
185
302
 
186
303
  desc 'Build gem'
187
304
  task :build => [:spec] do
188
- sh("#{Gem.ruby} -S gem build #{Gemgem.spec.name}.gemspec")
189
- sh("mkdir -p pkg")
190
- sh("mv #{Gemgem.gem_tag}.gem pkg/")
305
+ Gemgem.gem_build
306
+ end
307
+
308
+ desc 'Generate gemspec'
309
+ task :spec do
310
+ Gemgem.gem_spec
191
311
  end
192
312
 
193
313
  desc 'Release gem'
194
314
  task :release => [:spec, :check, :build] do
195
- sh("git tag #{Gemgem.gem_tag}")
196
- sh("git push")
197
- sh("git push --tags")
198
- sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
315
+ Gemgem.gem_release
199
316
  end
200
317
 
201
318
  task :check do
202
- ver = Gemgem.spec.version.to_s
203
-
204
- if ENV['VERSION'].nil?
205
- puts("\e[35mExpected " \
206
- "\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
207
- exit(1)
208
-
209
- elsif ENV['VERSION'] != ver
210
- puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
211
- "\e[35mbut got\n " \
212
- "\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
213
- exit(2)
214
- end
319
+ Gemgem.gem_check
215
320
  end
216
321
 
217
322
  end # of gem namespace
218
323
 
219
- desc 'Run tests in memory'
324
+ desc 'Run tests'
220
325
  task :test do
221
- require 'bacon'
222
- Bacon.extend(Bacon::TestUnitOutput)
223
- Bacon.summary_on_exit
224
- $LOAD_PATH.unshift('lib')
225
- Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
226
- end
227
-
228
- desc 'Run tests with shell'
229
- task 'test:shell', :RUBY_OPTS do |t, args|
230
- files = Dir['test/**/test_*.rb'].join(' ')
231
-
232
- cmd = [Gem.ruby, args[:RUBY_OPTS],
233
- '-I', 'lib', '-S', 'bacon', '--quiet', files]
234
-
235
- sh(cmd.compact.join(' '))
236
- end
237
-
238
- desc 'Generate ann markdown'
239
- task 'ann:md' => ['gem:spec'] do
240
- puts Gemgem.ann_md
241
- end
242
-
243
- desc 'Generate ann html'
244
- task 'ann:html' => ['gem:spec'] do
245
- puts Gemgem.ann_html
246
- end
247
-
248
- desc 'Generate ann email'
249
- task 'ann:email' => ['gem:spec'] do
250
- puts Gemgem.ann_email
251
- end
252
-
253
- desc 'Generate rdoc'
254
- task :doc => ['gem:spec'] do
255
- sh("yardoc -o rdoc --main README.md" \
256
- " --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
326
+ Gemgem.test
257
327
  end
258
328
 
259
- desc 'Remove ignored files'
329
+ desc 'Trash ignored files'
260
330
  task :clean => ['gem:spec'] do
261
- trash = "~/.Trash/#{Gemgem.spec.name}/"
262
- sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
263
- Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
331
+ Gemgem.clean
264
332
  end
265
333
 
266
334
  task :default do
267
- puts `#{Gem.ruby} -S #{$PROGRAM_NAME} -T`
335
+ # Is there a reliable way to do this in the current process?
336
+ # It failed miserably before between Rake versions...
337
+ exec "#{Gem.ruby} -S #{$PROGRAM_NAME} -f #{Rake.application.rakefile} -T"
268
338
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-is-reflective
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-22 00:00:00.000000000 Z
11
+ date: 2017-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dm-core
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: dm-do-adapter
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: dm-migrations
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: dm-sqlite-adapter
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: dm-mysql-adapter
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: dm-postgres-adapter
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description: |-
@@ -104,9 +104,9 @@ executables:
104
104
  extensions: []
105
105
  extra_rdoc_files: []
106
106
  files:
107
- - .gitignore
108
- - .gitmodules
109
- - .travis.yml
107
+ - ".gitignore"
108
+ - ".gitmodules"
109
+ - ".travis.yml"
110
110
  - CHANGES.md
111
111
  - Gemfile
112
112
  - LICENSE
@@ -124,7 +124,7 @@ files:
124
124
  - lib/dm-is-reflective/runner.rb
125
125
  - lib/dm-is-reflective/test.rb
126
126
  - lib/dm-is-reflective/version.rb
127
- - task/.gitignore
127
+ - task/README.md
128
128
  - task/gemgem.rb
129
129
  - test/setup_db.sh
130
130
  - test/test_mysql.rb
@@ -141,17 +141,17 @@ require_paths:
141
141
  - lib
142
142
  required_ruby_version: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - '>='
144
+ - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - '>='
149
+ - - ">="
150
150
  - !ruby/object:Gem::Version
151
151
  version: '0'
152
152
  requirements: []
153
153
  rubyforge_project:
154
- rubygems_version: 2.0.3
154
+ rubygems_version: 2.7.3
155
155
  signing_key:
156
156
  specification_version: 4
157
157
  summary: DataMapper plugin that helps you manipulate an existing database.
@@ -1 +0,0 @@
1
- *.rbc