actic 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +29 -0
- data/Rakefile +2 -0
- data/actic.gemspec +23 -0
- data/lib/actic.rb +180 -0
- data/lib/actic/engine.rb +7 -0
- data/lib/actic/models/actic_calendar.rb +8 -0
- data/lib/actic/models/event.rb +5 -0
- data/lib/actic/models/sub_component.rb +5 -0
- data/lib/actic/railtie.rb +62 -0
- data/lib/actic/version.rb +3 -0
- data/lib/generators/actic/USAGE +8 -0
- data/lib/generators/actic/actic_generator.rb +3 -0
- data/lib/generators/actic_calendar/USAGE +8 -0
- data/lib/generators/actic_calendar/actic_calendar_generator.rb +51 -0
- data/lib/generators/actic_calendar/templates/actic_calendar.rb.txt +4 -0
- data/lib/generators/actic_calendar/templates/migration.rb.txt +20 -0
- data/lib/generators/actic_subcomponent/USAGE +8 -0
- data/lib/generators/actic_subcomponent/actic_subcomponent_generator.rb +13 -0
- data/lib/generators/actic_subcomponent/templates/event.rb.txt +2 -0
- data/lib/generators/actic_subcomponent/templates/journal.rb.txt +2 -0
- metadata +92 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in actic.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
#gem "rails", "3.0.0"
|
7
|
+
if File.exist? File.expand_path('../../rails', __FILE__)
|
8
|
+
#gem "rails", "3.0.0", :path => "../rails"
|
9
|
+
else
|
10
|
+
#gem "rails", "3.0.0", :git => "git://github.com/rails/rails.git"
|
11
|
+
end
|
12
|
+
|
13
|
+
platforms :jruby do
|
14
|
+
#gem 'activerecord-jdbcsqlite3-adapter'
|
15
|
+
end
|
16
|
+
|
17
|
+
platforms :ruby do
|
18
|
+
#gem "sqlite3-ruby"
|
19
|
+
if RUBY_VERSION < '1.9'
|
20
|
+
#gem "ruby-debug", ">= 0.10.3"
|
21
|
+
end
|
22
|
+
group :mongoid do
|
23
|
+
#gem "mongo"
|
24
|
+
#gem "mongoid", :git => "git://github.com/durran/mongoid.git"
|
25
|
+
#gem "bson_ext"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'ri_cal', :require => 'ri_cal', :git => "git@github.com:tevio/ri_cal.git"
|
data/Rakefile
ADDED
data/actic.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "actic/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "actic"
|
7
|
+
s.version = Actic::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Steve A Martin"]
|
10
|
+
s.email = ["steve@shakewell.co.uk"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/actic"
|
12
|
+
s.summary = %q{A fusion of ORM and ical}
|
13
|
+
s.description = %q{This gem includes the actic orm wrapperb and a series of generators, it is purely for rails 3}
|
14
|
+
|
15
|
+
s.rubyforge_project = "actic"
|
16
|
+
|
17
|
+
#s.add_dependency('rical', '>= 0.8.7')
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
end
|
data/lib/actic.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
# Every active record model that implements the interface must
|
2
|
+
# have a string variable either in the DB or initialized in memory called "ical"
|
3
|
+
|
4
|
+
require 'ri_cal'
|
5
|
+
require 'active_support/dependencies'
|
6
|
+
require 'set'
|
7
|
+
#require 'actic/models/calendar'
|
8
|
+
#require 'actic/railtie'
|
9
|
+
module Actic
|
10
|
+
require 'actic/railtie' if defined?(Rails)
|
11
|
+
require 'actic/engine' if defined?(Rails)
|
12
|
+
|
13
|
+
def ic_respond
|
14
|
+
true
|
15
|
+
end
|
16
|
+
module Event
|
17
|
+
|
18
|
+
def ic_component
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
module ClassMethods; end
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.extend(ClassMethods)
|
26
|
+
base.send :after_initialize, :si
|
27
|
+
end
|
28
|
+
|
29
|
+
def ievent
|
30
|
+
@ic ? @ic : @ic = RiCal.parse_string(self.ical).first
|
31
|
+
end
|
32
|
+
|
33
|
+
def description=(desc)
|
34
|
+
ievent.description=desc; si(@ic)
|
35
|
+
end
|
36
|
+
|
37
|
+
def description
|
38
|
+
ievent.description
|
39
|
+
end
|
40
|
+
|
41
|
+
def start_time=(start)
|
42
|
+
ievent.dtstart=start; si(@ic)
|
43
|
+
end
|
44
|
+
|
45
|
+
def start_time
|
46
|
+
ievent.start_time
|
47
|
+
end
|
48
|
+
|
49
|
+
def end_time=(endt)
|
50
|
+
ievent.dtend=endt; si(@ic)
|
51
|
+
end
|
52
|
+
|
53
|
+
def end_time
|
54
|
+
ievent.end_time
|
55
|
+
end
|
56
|
+
|
57
|
+
def recurrence=(rec)
|
58
|
+
ievent.rrule=rec; si(@ic)
|
59
|
+
end
|
60
|
+
|
61
|
+
## e.recurs :freq => :daily, :count => 10
|
62
|
+
## e.recurs :string => "FREQ=WEEKLY;COUNT=10;"
|
63
|
+
## NOTE - if specifying :string, all other options are overridden
|
64
|
+
def recurs(opts = {})
|
65
|
+
rec = ""
|
66
|
+
|
67
|
+
unless opts[:freq].nil?
|
68
|
+
#p "Frequency Present"
|
69
|
+
rec += "FREQ=#{opts[:freq].to_s.upcase};"
|
70
|
+
end
|
71
|
+
unless opts[:count].nil?
|
72
|
+
#p "Count Present"
|
73
|
+
rec += "COUNT=#{opts[:count].to_i};"
|
74
|
+
end
|
75
|
+
unless opts[:string].nil?
|
76
|
+
#p "String Present"
|
77
|
+
rec = opts[:string]
|
78
|
+
end
|
79
|
+
ievent.rrule=rec; si(@ic)
|
80
|
+
#rec
|
81
|
+
end
|
82
|
+
|
83
|
+
def occurrences(*oc)
|
84
|
+
ievent.occurrences(*oc);
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def set_ievent(ic = nil)
|
90
|
+
if !ical.nil? && ic.nil?
|
91
|
+
if @ic
|
92
|
+
@ic
|
93
|
+
else
|
94
|
+
@ic = RiCal.parse_string(self.ical).first
|
95
|
+
end
|
96
|
+
elsif ic.nil?
|
97
|
+
self.ical = RiCal.Event.to_rfc2445_string
|
98
|
+
else
|
99
|
+
@ic = ic; self.ical = @ic.to_rfc2445_string
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
alias si set_ievent
|
104
|
+
end
|
105
|
+
|
106
|
+
module Calendar
|
107
|
+
module ClassMethods; end
|
108
|
+
|
109
|
+
def self.included(base)
|
110
|
+
base.extend(ClassMethods)
|
111
|
+
base.send :after_initialize, :si
|
112
|
+
end
|
113
|
+
|
114
|
+
def icalendar
|
115
|
+
@ic ? @ic : @ic = RiCal.parse_string(self.ical).first
|
116
|
+
end
|
117
|
+
|
118
|
+
## Can add a subcomponent as a String, Actic enabled Model, or a RiCal component
|
119
|
+
## If the argument is a Actic Model, attempt to create an association (currently only works with has_many)
|
120
|
+
def add_subcomponent(comp)
|
121
|
+
i = icalendar
|
122
|
+
if comp.is_a? String
|
123
|
+
i.add_subcomponent(RiCal.parse_string(comp).first)
|
124
|
+
elsif comp.respond_to? "ic_component"
|
125
|
+
#p "Item is a subcomponent"
|
126
|
+
assoc = comp.class.to_s.downcase.pluralize.to_sym
|
127
|
+
if self.class.reflect_on_association assoc
|
128
|
+
#p "Item has association - #{assoc.to_s} on #{self.class.to_s} "
|
129
|
+
eval "#{assoc.to_s} << comp"
|
130
|
+
else
|
131
|
+
p "Item has no association on self"
|
132
|
+
end
|
133
|
+
i.add_subcomponent(RiCal.parse_string(comp.ievent.to_rfc2445_string).first)
|
134
|
+
else
|
135
|
+
i.add_subcomponent(RiCal.parse_string(comp.to_rfc2445_string).first)
|
136
|
+
end
|
137
|
+
si(@ic)
|
138
|
+
end
|
139
|
+
|
140
|
+
# def add_subcomponent(comp)
|
141
|
+
# i = icalendar
|
142
|
+
# if comp.is_a? String
|
143
|
+
# i.add_subcomponent(RiCal.parse_string(comp).first)
|
144
|
+
# ## This is not dry enough, possibly make a method specifically as a tag,
|
145
|
+
# # which all actic Model objects implement
|
146
|
+
# elsif comp.respond_to? "ic_component"
|
147
|
+
# i.add_subcomponent(RiCal.parse_string(comp.ievent.to_rfc2445_string).first)
|
148
|
+
# else
|
149
|
+
# i.add_subcomponent(RiCal.parse_string(comp.to_rfc2445_string).first)
|
150
|
+
# end
|
151
|
+
# si(@ic)
|
152
|
+
# end
|
153
|
+
|
154
|
+
def events
|
155
|
+
icalendar.events
|
156
|
+
end
|
157
|
+
|
158
|
+
# alias event= add_subcomponent
|
159
|
+
#def events=(events)
|
160
|
+
# icalendar.events
|
161
|
+
#end
|
162
|
+
|
163
|
+
private
|
164
|
+
def set_ical(ic = nil)
|
165
|
+
if !ical.nil? && ic.nil?
|
166
|
+
if @ic
|
167
|
+
@ic
|
168
|
+
else
|
169
|
+
@ic = RiCal.parse_string(self.ical).first
|
170
|
+
end
|
171
|
+
elsif ic.nil?
|
172
|
+
self.ical = RiCal.Calendar.to_rfc2445_string
|
173
|
+
else
|
174
|
+
@ic = ic; self.ical = @ic.to_rfc2445_string
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
alias si set_ical
|
179
|
+
end
|
180
|
+
end
|
data/lib/actic/engine.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'actic'
|
2
|
+
require 'rails'
|
3
|
+
module Actic
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
#railtie_name :actic
|
6
|
+
|
7
|
+
initializer "actic_railtie.configure_rails_initialization" do
|
8
|
+
end
|
9
|
+
|
10
|
+
# initializer "actic_railtie.configure_rails_initialization",
|
11
|
+
# :before => "actice_railtie.blah_init" do
|
12
|
+
#
|
13
|
+
# end
|
14
|
+
#config.autoload_paths += %W(models/calendar)
|
15
|
+
|
16
|
+
config.after_initialize do
|
17
|
+
#require "models/calendar"
|
18
|
+
#require "models/event"
|
19
|
+
#require "models/sub_component"
|
20
|
+
## inject actic methods into active record
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
config.before_eager_load do
|
25
|
+
#SomeClass.set_important_value = "RoboCop"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Production only
|
29
|
+
config.to_prepare do
|
30
|
+
# MyRailtie.setup!
|
31
|
+
end
|
32
|
+
|
33
|
+
console do
|
34
|
+
# Foo.con_thing!
|
35
|
+
end
|
36
|
+
|
37
|
+
generators do
|
38
|
+
|
39
|
+
#require '../../generators/actic/actic_generator'
|
40
|
+
#require '../../generators/actic_calendar/actic_calendar_generator'
|
41
|
+
#require '../../generators/actic_subcomponent/actic_subcomponent_generator'
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
rake_tasks do
|
46
|
+
# require 'path/to/railtie.tasks'
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# after_initialize
|
53
|
+
# app_middleware
|
54
|
+
# before_configuration
|
55
|
+
# before_eager_load
|
56
|
+
# before_initialize
|
57
|
+
# generators
|
58
|
+
# method_missing
|
59
|
+
# new
|
60
|
+
# respond_to?
|
61
|
+
# to_prepare
|
62
|
+
# to_prepare_blocks
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
class ActicCalendarGenerator < Rails::Generators::Base
|
3
|
+
include Rails::Generators::Migration
|
4
|
+
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
6
|
+
argument :name, :type => :string, :default => "calendar"
|
7
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type", :required => false
|
8
|
+
|
9
|
+
|
10
|
+
def self.next_migration_number(dirname)
|
11
|
+
if ActiveRecord::Base.timestamped_migrations
|
12
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
13
|
+
else
|
14
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_migration_file
|
19
|
+
migration_template 'migration.rb.txt', "db/migrate/create_#{table_name}.rb"
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_model
|
23
|
+
if name.include? ":"
|
24
|
+
self.attributes = name
|
25
|
+
self.name = "calendar"
|
26
|
+
self.attributes = format_attributes(self.attributes)
|
27
|
+
end
|
28
|
+
template "actic_calendar.rb.txt", "app/models/#{file_name}.rb"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def file_name
|
33
|
+
name.underscore
|
34
|
+
end
|
35
|
+
|
36
|
+
def table_name
|
37
|
+
name.tableize
|
38
|
+
end
|
39
|
+
|
40
|
+
def format_attributes(attrs)
|
41
|
+
fat = []
|
42
|
+
a = attrs
|
43
|
+
b = a.split
|
44
|
+
b.each {|c|
|
45
|
+
d = c.split(':')
|
46
|
+
e = {:name => d[0], :type => d[1] }
|
47
|
+
fat << e
|
48
|
+
}
|
49
|
+
fat
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Create<%= table_name.camelize %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table(:<%= table_name %>) do |t|
|
4
|
+
t.string :ical
|
5
|
+
|
6
|
+
<% if attributes %>
|
7
|
+
<% for attribute in attributes -%>
|
8
|
+
t.<%= attribute[:type] %> :<%= attribute[:name] %>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
drop_table :<%= table_name %>
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class ActicSubcomponentGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
argument :subcomponent, :type => :string, :default => "event"
|
4
|
+
argument :actic_calendar, :type => :string, :default => "calendar"
|
5
|
+
|
6
|
+
# the generator will generate different sub components based on the 'subcomponent' argument
|
7
|
+
def generate_subcomponent
|
8
|
+
if subcomponent == "event"
|
9
|
+
elsif subcomponent == "journal"
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: actic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Steve A Martin
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-10-30 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: This gem includes the actic orm wrapperb and a series of generators, it is purely for rails 3
|
22
|
+
email:
|
23
|
+
- steve@shakewell.co.uk
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- .idea/.rakeTasks
|
33
|
+
- .idea/actic.iml
|
34
|
+
- .idea/encodings.xml
|
35
|
+
- .idea/misc.xml
|
36
|
+
- .idea/modules.xml
|
37
|
+
- .idea/vcs.xml
|
38
|
+
- .idea/workspace.xml
|
39
|
+
- Gemfile
|
40
|
+
- Rakefile
|
41
|
+
- actic.gemspec
|
42
|
+
- lib/actic.rb
|
43
|
+
- lib/actic/engine.rb
|
44
|
+
- lib/actic/models/actic_calendar.rb
|
45
|
+
- lib/actic/models/event.rb
|
46
|
+
- lib/actic/models/sub_component.rb
|
47
|
+
- lib/actic/railtie.rb
|
48
|
+
- lib/actic/version.rb
|
49
|
+
- lib/generators/actic/USAGE
|
50
|
+
- lib/generators/actic/actic_generator.rb
|
51
|
+
- lib/generators/actic_calendar/USAGE
|
52
|
+
- lib/generators/actic_calendar/actic_calendar_generator.rb
|
53
|
+
- lib/generators/actic_calendar/templates/actic_calendar.rb.txt
|
54
|
+
- lib/generators/actic_calendar/templates/migration.rb.txt
|
55
|
+
- lib/generators/actic_subcomponent/USAGE
|
56
|
+
- lib/generators/actic_subcomponent/actic_subcomponent_generator.rb
|
57
|
+
- lib/generators/actic_subcomponent/templates/event.rb.txt
|
58
|
+
- lib/generators/actic_subcomponent/templates/journal.rb.txt
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: http://rubygems.org/gems/actic
|
61
|
+
licenses: []
|
62
|
+
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
requirements: []
|
85
|
+
|
86
|
+
rubyforge_project: actic
|
87
|
+
rubygems_version: 1.3.7
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: A fusion of ORM and ical
|
91
|
+
test_files: []
|
92
|
+
|