redmine_acts_as_taggable_on 0.1.1 → 0.2.0

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
2
  SHA1:
3
- metadata.gz: a47dcc653f37f43a611fd9c52d5b6d8a818dc05e
4
- data.tar.gz: 2f9a5b64d103e28287316955901a809877522730
3
+ metadata.gz: af36a6d9277e4b6f7ebb23802fd4df6df58549e2
4
+ data.tar.gz: 170406c9ce7d640b54d6f0958733c19a788cb8b3
5
5
  SHA512:
6
- metadata.gz: 68e5c10907d01cc88a51d43dc06bfbf6dc1ccc87f2207ff2cebfe0f8c915940ba101f62560ac88c5fb1ce048da50891979071851a17b10c11c5f40d47bf2dbfc
7
- data.tar.gz: 69e174c227a423a591c8ee938aefcb6c06e01688d3cc406922ffcc0395a6bdeaace815e020594701d8fd7d14e05e3cce3702cae9a917d185d61ab56335ff1884
6
+ metadata.gz: 80e76b8c0900f2770409953877d088c65555095bdef02dc073c17227b03e94f2ba35f294de25f2330689328c459b910437274dba081b0f7fb3d45c244189779c
7
+ data.tar.gz: 0400ed073a494d7e57abdbc06029d07bebe198fbad7465f1f446a5dee3a7f8008b29639cfeee0229a3afefb3ed1fe90963d2ea202761dded90cda029a8302b89
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "test/bats"]
2
+ path = test/bats
3
+ url = git://github.com/sstephenson/bats.git
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ script: test/run.bash
3
+ rvm:
4
+ - "2.0.0"
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # redmine_acts_as_taggable_on
2
2
 
3
3
  `redmine_acts_as_taggable_on` is a gem which allows multiple Redmine plugins to
4
- use the tables provided by `acts_as_taggable_on` without stepping on each
4
+ use the tables provided by `acts-as-taggable-on` without stepping on each
5
5
  others' toes.
6
6
 
7
- ## How it works
7
+ ## Why?
8
8
 
9
9
  The problem we ran into when we discovered that both `redmine_tags` and
10
- `redmine_knowledgebase` want to use the `acts_as_taggable_on` gem is that after
10
+ `redmine_knowledgebase` want to use the `acts-as-taggable-on` gem is that after
11
11
  either is installed, the migration for the other fails, since the database
12
12
  tables already exist.
13
13
 
@@ -23,30 +23,33 @@ mechanism to declare that they require these tables, and providing intelligent
23
23
  migrations which only drop the tables when no other plugins are using them.
24
24
 
25
25
  `redmine_acts_as_taggable_on` also provides a limited defence against plugins
26
- which directly depend on `acts-as-taggable-on` by grepping through their
27
- Gemfiles for the string `acts-as-taggable-on`, and treating them the same way
28
- as plugins which use this gem, together with a gentle(-ish) suggestion to
29
- use this gem instead.
26
+ which directly depend on `acts-as-taggable-on`. It does this by grepping
27
+ through their Gemfiles for the string `acts-as-taggable-on` -- if found, it
28
+ will treat the plugin as requiring the `acts-as-taggable-on` tables, and will
29
+ print a gentle(-ish) suggestion to use this gem instead.
30
30
 
31
31
  ## Status
32
32
 
33
- **Believed to be stable; not extensively tested in the wild.**
33
+ Believed to be stable. The automated tests currently pass on Redmine trunk,
34
+ 2.3.1, 2.2.4, and 2.1.5. However, this gem is not yet used by any Redmine
35
+ plugins in the wild.
34
36
 
35
37
  ## Limitations
36
38
 
37
- This plugin cannot currently protect against situations where a plugin directly
38
- using `acts-as-taggable-on` has put the generated migration into its
39
- db/migrate, and the Redmine admin tries to uninstall it.
39
+ This gem cannot currently protect against situations where a plugin directly
40
+ using `acts-as-taggable-on` has put the generated migration into its db/migrate
41
+ directory. If a user tries to migrate the plugin down by executing `rake
42
+ redmine:plugins:migrate VERSION=0 NAME=redmine_foo_plugin`, the tables will
43
+ still be dropped, regardless of whether other plugins are still using them.
40
44
 
41
- I'm in two minds about whether to fix this: one the one hand, it would require
42
- some nasty hackery, and it's no worse than the current situation. On the other,
43
- losing one's data is not fun.
45
+ I'm in two minds about whether to fix this: on the one hand, it would require
46
+ some nasty monkey-patching. On the other hand, data loss is no fun at all.
44
47
 
45
48
  ## Setup
46
49
 
47
50
  Add it to your plugin's Gemfile:
48
51
 
49
- gem 'redmine_acts_as_taggable_on', '~> 0.1'
52
+ gem 'redmine_acts_as_taggable_on', '~> 0.2'
50
53
 
51
54
  Add the migration:
52
55
 
@@ -61,4 +64,31 @@ Declare that your plugin needs `redmine_acts_as_taggable_on` inside init.rb:
61
64
  requires_acts_as_taggable_on
62
65
  ...
63
66
 
64
- That's it. Your plugin should now migrate up and down intelligently.
67
+ That's it. Your plugin will now migrate up and down intelligently. For example:
68
+
69
+ cd /path/to/redmine
70
+
71
+ cp -r /some/plugin/using/this/gem plugins/redmine_foo
72
+ cp -r /another/plugin/using/this/gem plugins/redmine_bar
73
+
74
+ rake redmine:plugins:migrate
75
+
76
+ Migrating redmine_bar (Redmine bar)...
77
+ == AddTagsAndTaggings: migrating =========================================
78
+ -- create_table(:tags)
79
+ -> 0.0039s
80
+ -- create_table(:taggings)
81
+ -> 0.0007s
82
+ -- add_index(:taggings, :tag_id)
83
+ -> 0.0003s
84
+ -- add_index(:taggings, [:taggable_id, :taggable_type, :context])
85
+ -> 0.0003s
86
+ == AddTagsAndTaggings: migrated (0.0059s) ================================
87
+
88
+ Migrating redmine_foo (Redmine foo)...
89
+ == AddTagsAndTaggings: migrating =========================================
90
+ -- Not creating "tags" and "taggings" because they already exist
91
+ == AddTagsAndTaggings: migrated (0.0006s) ================================
92
+
93
+ You can look at the [test script](test/test.bats) to see how other situations
94
+ are handled.
@@ -1,13 +1,16 @@
1
1
  require 'generators/acts_as_taggable_on/migration/templates/active_record/migration'
2
2
 
3
3
  class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
4
+ class SchemaMismatchError < StandardError; end
5
+
4
6
  def up
5
7
  enforce_declarations!
8
+ check_for_old_style_plugins
6
9
 
7
- if performed?
8
- say 'Not creating "tags" and "taggings" because they already exist'
9
- else
10
+ if ok_to_go_up?
10
11
  super
12
+ else
13
+ say 'Not creating "tags" and "taggings" because they already exist'
11
14
  end
12
15
  end
13
16
 
@@ -19,35 +22,11 @@ class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
19
22
  else
20
23
  say 'Not dropping "tags" and "taggings" because they\'re still needed by'
21
24
  say 'the following plugins:'
22
- requiring_plugins.each { |p| say p.id, true }
25
+ plugins_still_using_tables.each { |p| say p.id, true }
23
26
  end
24
27
  end
25
28
 
26
29
  private
27
- def performed?
28
- ['tags', 'taggings'].any? do |table|
29
- ActiveRecord::Base.connection.table_exists? table
30
- end
31
- end
32
-
33
- # A list of plugins which require redmine_acts_as_taggable_on.
34
- #
35
- # We reject the current one because we don't want to say
36
- #
37
- # refusing to migrate redmine_foo down: tags and taggings tables are still
38
- # required by redmine_foo
39
- #
40
- # That would be silly.
41
- def requiring_plugins
42
- Redmine::Plugin.all.
43
- select(&:requires_acts_as_taggable_on?).
44
- reject {|p| p == Redmine::Plugin::Migrator.current_plugin }
45
- end
46
-
47
- def ok_to_go_down?
48
- requiring_plugins.empty?
49
- end
50
-
51
30
  def enforce_declarations!
52
31
  unless current_plugin_declaration_made?
53
32
  msg = "You have to declare that you need redmine_acts_as_taggable_on inside\n"
@@ -58,6 +37,74 @@ class RedmineActsAsTaggableOn::Migration < ActsAsTaggableOnMigration
58
37
  end
59
38
 
60
39
  def current_plugin_declaration_made?
61
- Redmine::Plugin::Migrator.current_plugin.requires_acts_as_taggable_on?
40
+ current_plugin.requires_acts_as_taggable_on?
41
+ end
42
+
43
+ def current_plugin
44
+ Redmine::Plugin::Migrator.current_plugin
45
+ end
46
+
47
+ # Check if any plugins are using acts-as-taggable-on directly; the purpose of
48
+ # this is only to print a warning if so.
49
+ def check_for_old_style_plugins
50
+ Redmine::Plugin.all.each { |p| p.requires_acts_as_taggable_on? }
51
+ nil
52
+ end
53
+
54
+ def ok_to_go_up?
55
+ tables_already_exist = %w(tags taggings).any? do |table|
56
+ ActiveRecord::Base.connection.table_exists? table
57
+ end
58
+ if tables_already_exist
59
+ assert_schema_match!
60
+ return false
61
+ end
62
+ true
63
+ end
64
+
65
+ def assert_schema_match!
66
+ if (obtain_structure('tags') != expected_tags_structure) ||
67
+ (obtain_structure('taggings') != expected_taggings_structure)
68
+ msg = "A plugin is already using the \"tags\" or \"taggings\" tables, and\n"
69
+ msg << "the structure of the table does not match the structure expected\n"
70
+ msg << "by #{current_plugin.id}.\n"
71
+ raise SchemaMismatchError, msg
72
+ end
73
+ end
74
+
75
+ def obtain_structure(table_name)
76
+ ActiveRecord::Base.connection.columns(table_name).
77
+ reject { |c| %w(created_at updated_at id).include? c.name }.
78
+ map { |c| [c.name, c.type.to_s] }.
79
+ sort
80
+ end
81
+
82
+ def expected_tags_structure
83
+ [
84
+ ['name', 'string']
85
+ ]
86
+ end
87
+
88
+ def expected_taggings_structure
89
+ [
90
+ ['tag_id', 'integer'],
91
+ ['taggable_id', 'integer'],
92
+ ['taggable_type', 'string'],
93
+ ['tagger_id', 'integer'],
94
+ ['tagger_type', 'string'],
95
+ ['context', 'string'],
96
+ ].sort
97
+ end
98
+
99
+ # A list of plugins which are using the acts_as_taggable_on tables (excluding
100
+ # the current one)
101
+ def plugins_still_using_tables
102
+ Redmine::Plugin.all.
103
+ select(&:using_acts_as_taggable_on_tables?).
104
+ reject {|p| p == Redmine::Plugin::Migrator.current_plugin }
105
+ end
106
+
107
+ def ok_to_go_down?
108
+ plugins_still_using_tables.empty?
62
109
  end
63
110
  end
@@ -18,6 +18,12 @@ module RedmineActsAsTaggableOn::RedminePluginPatch
18
18
  false
19
19
  end
20
20
 
21
+ def using_acts_as_taggable_on_tables?
22
+ return false unless requires_acts_as_taggable_on?
23
+ return false if Redmine::Plugin::Migrator.current_version(self) == 0
24
+ true
25
+ end
26
+
21
27
  private
22
28
  def gemfile_path
23
29
  File.join(self.directory, 'Gemfile')
@@ -1,3 +1,3 @@
1
1
  module RedmineActsAsTaggableOn
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency "acts-as-taggable-on", "~> 2.4"
21
+ spec.add_runtime_dependency "acts-as-taggable-on", ">= 2.3", "< 2.5"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # makes a new Redmine installation in a temporary directory, using SQLite as
5
+ # the database.
6
+ make_temp_redmine() {
7
+ local branch="$1"
8
+ [ -z "$branch" ] && branch="trunk"
9
+
10
+ # for branches which have slashes in them, like tags/2.3.0
11
+ local branch_filename="${branch//\//-}"
12
+ temp_redmine=`mktemp -d /tmp/redmine_acts_as_taggable_on.$branch_filename.XXXXXXX`
13
+ pushd "$temp_redmine"
14
+
15
+ svn checkout "http://svn.redmine.org/redmine/$branch" redmine
16
+ pushd redmine
17
+
18
+ echo "production:
19
+ adapter: sqlite3
20
+ database: db/redmine.sqlite3" > config/database.yml
21
+
22
+ bundle install
23
+ rake generate_secret_token db:create db:migrate
24
+
25
+ popd
26
+ popd
27
+ }
28
+
29
+ make_temp_redmine >/dev/null
30
+ echo "$temp_redmine"
data/test/run.bash ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # Run all the tests on a specific branch of Redmine.
5
+ run_tests_on_branch() {
6
+ temp_redmine_path="`test/mk_temp_redmine.bash "$1"`"
7
+ export temp_redmine_path
8
+
9
+ [ -f test/bats/bin/bats ] || git submodule update
10
+
11
+ local test_status=0
12
+ test/bats/bin/bats test/test.bats || test_status=1
13
+
14
+ if [ "$test_status" -eq 1 ]; then
15
+ echo "Some tests failed on redmine:$1. You can inspect the tree at $temp_redmine_path"
16
+ else
17
+ rm -rf "$temp_redmine_path"
18
+ fi
19
+
20
+ return $test_status
21
+ }
22
+
23
+ RAILS_ENV="production"
24
+ export RAILS_ENV
25
+
26
+ redmine_acts_as_taggable_on_path="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
27
+ export redmine_acts_as_taggable_on_path
28
+ pushd "$redmine_acts_as_taggable_on_path" >/dev/null
29
+
30
+ branches=(trunk tags/2.3.1 tags/2.2.4 tags/2.1.5)
31
+ test_status=0
32
+
33
+ for branch in ${branches[@]}; do
34
+ echo "testing on branch: $branch"
35
+ echo -n "==================="
36
+ # make the underline the same length as the title
37
+ echo ${branch//?/=}
38
+
39
+ run_tests_on_branch "$branch" || test_status=1
40
+ echo
41
+ done
42
+
43
+ popd >/dev/null
44
+ exit $test_status
data/test/test.bats ADDED
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env bats
2
+
3
+ load test_helpers
4
+
5
+ # files which should be backed up and restored to how they were at the start
6
+ # between each test
7
+ preserved_files=(db/redmine.sqlite3 db/schema.rb)
8
+
9
+ setup() {
10
+ pushd "$temp_redmine_path/redmine" >/dev/null
11
+ for file in $preserved_files; do
12
+ cp $file $file.bak
13
+ done
14
+ }
15
+
16
+ teardown() {
17
+ rm -rf plugins/*
18
+ for file in $preserved_files; do
19
+ mv $file.bak $file
20
+ done
21
+ popd >/dev/null
22
+ }
23
+
24
+ @test "migrates upwards with solitary proper plugin" {
25
+ mk_proper_plugin "foo"
26
+ rake redmine:plugins:migrate
27
+
28
+ db_table_exists 'tags'
29
+ db_table_exists 'taggings'
30
+ }
31
+
32
+ @test "migrates downwards with solitary proper plugin" {
33
+ mk_proper_plugin "foo"
34
+ rake redmine:plugins:migrate
35
+ rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
36
+
37
+ ! db_table_exists 'tags'
38
+ ! db_table_exists 'taggings'
39
+ }
40
+
41
+ @test "migrates upwards with two proper plugins" {
42
+ mk_proper_plugin "foo"
43
+ rake redmine:plugins:migrate
44
+
45
+ mk_proper_plugin "bar"
46
+ run rake redmine:plugins:migrate
47
+ [ "$status" -eq 0 ]
48
+ assert_contain 'Not creating "tags" and "taggings"' "$output"
49
+
50
+ db_table_exists 'tags'
51
+ db_table_exists 'taggings'
52
+ }
53
+
54
+ @test "doesn't drop tables when another proper plugin exists" {
55
+ mk_proper_plugin "foo"
56
+ mk_proper_plugin "bar"
57
+
58
+ rake redmine:plugins:migrate
59
+
60
+ echo 'Now migrating down...'
61
+ run rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
62
+ [ "$status" -eq 0 ]
63
+ assert_contain 'Not dropping "tags" and "taggings"' "$output"
64
+
65
+ # Should say still needed by redmine_bar
66
+ assert_contain '-> redmine_bar' "$output"
67
+ # Should not say still needed by redmine_foo
68
+ ! assert_contain '-> redmine_foo' "$output"
69
+
70
+ db_table_exists 'tags'
71
+ db_table_exists 'taggings'
72
+ }
73
+
74
+ @test "migrates downwards with two proper plugins" {
75
+ mk_proper_plugin "foo"
76
+ mk_proper_plugin "bar"
77
+
78
+ rake redmine:plugins:migrate
79
+ rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
80
+ rake redmine:plugins:migrate NAME=redmine_bar VERSION=0
81
+
82
+ ! db_table_exists 'tags'
83
+ ! db_table_exists 'taggings'
84
+ }
85
+
86
+ @test "schema sanity check when migrating proper plugin up" {
87
+ mk_standard_plugin "baz"
88
+
89
+ mkdir -p plugins/redmine_baz/db/migrate
90
+ echo "class AddTags < ActiveRecord::Migration
91
+ def up
92
+ create_table :tags do |t|
93
+ t.integer :foo
94
+ end
95
+ end
96
+
97
+ def down
98
+ drop_table :tags
99
+ end
100
+ end" > plugins/redmine_baz/db/migrate/001_add_tags.rb
101
+
102
+ rake redmine:plugins:migrate
103
+
104
+ mk_proper_plugin "foo"
105
+ run rake redmine:plugins:migrate
106
+ [ "$status" -ne 0 ]
107
+ assert_contain 'table does not match' "$output"
108
+ }
109
+
110
+ @test "enforces that declarations were made" {
111
+ mk_plugin_missing_declaration "quux"
112
+
113
+ run rake redmine:plugins:migrate
114
+ [ "$status" -ne 0 ]
115
+ echo "$output"
116
+ assert_contain 'You have to declare that you need' "$output"
117
+ }
118
+
119
+ @test "warns about acts-as-taggable-on when going up" {
120
+ mk_proper_plugin "foo"
121
+ mk_old_style_plugin "bar"
122
+
123
+ run rake redmine:plugins:migrate
124
+ [ "$status" -eq 0 ]
125
+ echo "$output"
126
+ assert_contain "WARNING: The plugin redmine_bar is using 'acts-" "$output"
127
+ }
128
+
129
+ @test "warns about acts-as-taggable-on when going down" {
130
+ mk_proper_plugin "foo"
131
+ mk_old_style_plugin "bar"
132
+
133
+ rake redmine:plugins:migrate
134
+
135
+ # Note that we have to migrate redmine_foo down so that the
136
+ # RedmineActsAsTaggableOn::Migration class does the migration, because it
137
+ # does the checking. Migrating redmine_bar down would not trigger the
138
+ # warning.
139
+ run rake redmine:plugins:migrate NAME=redmine_foo VERSION=0
140
+ [ "$status" -eq 0 ]
141
+ echo "$output"
142
+ assert_contain "WARNING: The plugin redmine_bar is using 'acts-" "$output"
143
+ }
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Create an empty skeleton Redmine plugin. It's given the name redmine_$1.
4
+ mk_standard_plugin() {
5
+ local name="redmine_$1"
6
+ mkdir plugins/$name
7
+ pushd plugins/$name >/dev/null
8
+
9
+ echo "Redmine::Plugin.register(:$name) { name '$name' }" > init.rb
10
+
11
+ popd >/dev/null
12
+
13
+ echo "Created a standard redmine plugin: $name"
14
+ }
15
+
16
+ # Create a plugin which uses the redmine_acts_as_taggable_on gem properly.
17
+ mk_proper_plugin() {
18
+ mk_standard_plugin "$1" >/dev/null
19
+ local name="redmine_$1"
20
+ pushd plugins/$name >/dev/null
21
+
22
+ echo "gem 'redmine_acts_as_taggable_on',
23
+ :path => '$redmine_acts_as_taggable_on_path'" > Gemfile
24
+
25
+ echo "require 'redmine_acts_as_taggable_on/initialize'
26
+ Redmine::Plugin.register(:$name) { requires_acts_as_taggable_on }" \
27
+ > init.rb
28
+
29
+ mkdir -p db/migrate
30
+ echo "class AddTagsAndTaggings < RedmineActsAsTaggableOn::Migration; end" \
31
+ > db/migrate/001_add_tags_and_taggings.rb
32
+
33
+ bundle >/dev/null
34
+
35
+ popd >/dev/null
36
+
37
+ echo "Created a redmine plugin using redmine_acts_as_taggable_on: $name"
38
+ }
39
+
40
+ # Create a plugin which uses redmine_acts_as_taggable_on but without the
41
+ # declaration in init.rb
42
+ mk_plugin_missing_declaration() {
43
+ mk_proper_plugin "$1" >/dev/null
44
+ local name="redmine_$1"
45
+ pushd plugins/$name >/dev/null
46
+
47
+ echo "require 'redmine_acts_as_taggable_on/initialize'
48
+ Redmine::Plugin.register(:$name) { name '$name' }" > init.rb
49
+
50
+ popd >/dev/null
51
+
52
+ echo "Created a redmine plugin using redmine_acts_as_taggable_on"
53
+ echo " (but without the declaration): $name"
54
+ }
55
+
56
+ # Create a plugin which uses acts-as-taggable-on directly, and which expects
57
+ # you to do rails g acts_as_taggable_on:migration yourself.
58
+ mk_old_style_plugin() {
59
+ mk_standard_plugin "$1" >/dev/null
60
+ local name="redmine_$1"
61
+ pushd plugins/$name >/dev/null
62
+
63
+ echo "gem 'acts-as-taggable-on'" > Gemfile
64
+ bundle >/dev/null
65
+ popd >/dev/null
66
+
67
+ echo "Created a plugin using acts-as-taggable-on without the embedded"
68
+ echo " migration: $name"
69
+ }
70
+
71
+ db_query() {
72
+ # use -init to ensure ~/.sqliterc isn't read
73
+ sqlite3 -init "" db/redmine.sqlite3 "$1"
74
+ }
75
+
76
+ db_table_exists() {
77
+ db_query "SELECT 'it exists'
78
+ FROM sqlite_master
79
+ WHERE type='table' AND name='$1'" | grep 'it exists' >/dev/null
80
+
81
+ exists="$?"
82
+ if [ "$exists" -eq 1 ]; then
83
+ echo "Database table $1 exists."
84
+ else
85
+ echo "Database table $1 does not exist."
86
+ fi
87
+
88
+ return $exists
89
+ }
90
+
91
+ assert_contain() {
92
+ echo -n "Checking whether a string contains '$1'... "
93
+ if [[ "$2" == *"$1"* ]]; then
94
+ echo "Yep."
95
+ else
96
+ echo "Nope."
97
+ return 1
98
+ fi
99
+ }
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_acts_as_taggable_on
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Garrood
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-08 00:00:00.000000000 Z
11
+ date: 2013-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts-as-taggable-on
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ - - <
18
21
  - !ruby/object:Gem::Version
19
- version: '2.4'
22
+ version: '2.5'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ~>
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '2.3'
30
+ - - <
25
31
  - !ruby/object:Gem::Version
26
- version: '2.4'
32
+ version: '2.5'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +66,8 @@ extensions: []
60
66
  extra_rdoc_files: []
61
67
  files:
62
68
  - .gitignore
69
+ - .gitmodules
70
+ - .travis.yml
63
71
  - Gemfile
64
72
  - LICENSE.txt
65
73
  - README.md
@@ -70,6 +78,10 @@ files:
70
78
  - lib/redmine_acts_as_taggable_on/redmine_plugin_patch.rb
71
79
  - lib/redmine_acts_as_taggable_on/version.rb
72
80
  - redmine_acts_as_taggable_on.gemspec
81
+ - test/mk_temp_redmine.bash
82
+ - test/run.bash
83
+ - test/test.bats
84
+ - test/test_helpers.bash
73
85
  homepage: https://github.com/hdgarrood/redmine_acts_as_taggable_on
74
86
  licenses:
75
87
  - GPLv2
@@ -90,10 +102,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
102
  version: '0'
91
103
  requirements: []
92
104
  rubyforge_project:
93
- rubygems_version: 2.0.0
105
+ rubygems_version: 2.0.3
94
106
  signing_key:
95
107
  specification_version: 4
96
108
  summary: Allows multiple Redmine plugins to use the acts_as_taggable_on gem without
97
109
  stepping on each others' toes.
98
- test_files: []
110
+ test_files:
111
+ - test/mk_temp_redmine.bash
112
+ - test/run.bash
113
+ - test/test.bats
114
+ - test/test_helpers.bash
99
115
  has_rdoc: