espace_membre-ruby 0.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2bfd2579e27ef0ad32518182288290b7101e39669ec8dd6824f529b8cc038e88
4
+ data.tar.gz: 48ee8747ace9ce15c704f139f579b1e292a7bb34bf987b2120073e192e659f01
5
+ SHA512:
6
+ metadata.gz: f6e5e5e58fd6816272d80ebd5efbc29c0710e574a94f6e0208312dc7a2352cb894d87d97812fe514c8aebe50f5f94d5d30178a52a8847e5807bfd0c667a12bfc
7
+ data.tar.gz: a56effda2e4587268d95c3e4d0ec8e59f4bb73e7418ea0d83c7549e6bc6a4bea5769b9e2ee3db784f8730468c862ef19d977e7fa18b0e53413dd9152cb584882
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # espace_membre-ruby
2
+
3
+ This gem offers some glue (namely ActiveRecord models) around the
4
+ Espace-Membre database to allow writing simple Ruby apps around it.
5
+
6
+ ## TODO
7
+
8
+ - [ ] allow configuration (database name)
9
+ - [ ] restore RSpec
10
+ - [ ] run the tests
11
+ - [ ] distribute.
12
+
13
+ ## Installation
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem "espace_membre-ruby"
18
+ ```
19
+
20
+ Then start having fun:
21
+
22
+ ```ruby
23
+ EspaceMembre::User.without(:active_missions).last(10)
24
+ ```
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/setup"
2
+
3
+ require "bundler/gem_tasks"
@@ -0,0 +1,13 @@
1
+ module EspaceMembre
2
+ class Incubator < Record
3
+ self.primary_key = "uuid"
4
+
5
+ validates :ghid, presence: true
6
+
7
+ has_many :startups
8
+
9
+ def to_s
10
+ title
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EspaceMembre
4
+ class Mission < Record
5
+ self.primary_key = "uuid"
6
+
7
+ belongs_to :user
8
+
9
+ has_and_belongs_to_many :startups, join_table: "missions_startups"
10
+
11
+ scope :active, -> { where(end: Time.zone.now..) }
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EspaceMembre
4
+ class MissionStartup < Record
5
+ self.table_name = "missions_startups"
6
+ self.primary_key = "uuid"
7
+
8
+ belongs_to :mission
9
+ belongs_to :startup_id
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ module EspaceMembre
2
+ class Phase < Record
3
+ belongs_to :startup
4
+
5
+ PHASES = [
6
+ "investigation",
7
+ "construction",
8
+ "acceleration",
9
+ "success",
10
+ "alumni",
11
+ "transfer"
12
+ ]
13
+
14
+ scope :latest_completed, -> { order(start: :desc) }
15
+
16
+ PHASES.each do |phase|
17
+ # define scopes for each state (Phase.success, Phase.alumni, etc.)
18
+ scope phase, -> { where("phases.name": phase) }
19
+
20
+ # define individual instance methods
21
+ define_method "#{phase}?" do
22
+ name == phase
23
+ end
24
+ end
25
+
26
+ scope :active_phase, -> { construction.or(acceleration) }
27
+
28
+ def terminate!
29
+ update!(end: Time.zone.now)
30
+ end
31
+
32
+ def to_s
33
+ name
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module EspaceMembre
2
+ class Railtie < ::Rails::Railtie
3
+ initializer "emdb.setup" do
4
+ ActiveSupport.on_load(:active_record) do
5
+ require "espace_membre/record.rb"
6
+ require "espace_membre/incubator.rb"
7
+ require "espace_membre/mission.rb"
8
+ require "espace_membre/mission_startup.rb"
9
+ require "espace_membre/phase.rb"
10
+ require "espace_membre/startup.rb"
11
+ require "espace_membre/user.rb"
12
+
13
+ path = [File.expand_path('../../../spec/dummy/spec/factories', __FILE__)]
14
+
15
+ FactoryBot.definition_file_paths += path if defined?(FactoryBotRails)
16
+
17
+ FactoryBot.factories.clear
18
+
19
+ FactoryBot.find_definitions
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ module EspaceMembre
2
+ class Record < ActiveRecord::Base
3
+ self.abstract_class = true
4
+
5
+ connects_to database: { writing: :espace_membre_db, reading: :espace_membre_db }
6
+ end
7
+ end
@@ -0,0 +1,42 @@
1
+ module EspaceMembre
2
+ class Startup < Record
3
+ self.primary_key = "uuid"
4
+
5
+ validates :ghid, presence: true
6
+
7
+ belongs_to :incubator
8
+
9
+ has_many :phases
10
+
11
+ has_and_belongs_to_many :missions, join_table: "missions_startups"
12
+
13
+ has_many :users, through: :missions
14
+
15
+ has_one :evaluation, foreign_key: :startup_uuid
16
+
17
+ has_one :latest_phase,
18
+ -> { order(start: :desc) },
19
+ class_name: "Phase",
20
+ inverse_of: :startup
21
+
22
+ scope :in_phase, ->(phase) { joins(:latest_phase).where("phases.name" => phase) }
23
+
24
+ Phase::PHASES.each do |name|
25
+ define_method "in_#{name}?" do
26
+ latest_phase.send("#{name}?")
27
+ end
28
+ end
29
+
30
+ def in_phase?(name)
31
+ send("in_#{name}?")
32
+ end
33
+
34
+ def to_s
35
+ name
36
+ end
37
+
38
+ def latest_phase
39
+ phases.latest_completed.first
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ module EspaceMembre
2
+ class Team < Record
3
+ self.primary_key = "uuid"
4
+
5
+ validates :ghid, presence: true
6
+
7
+ belongs_to :incubator
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module EspaceMembre
2
+ class User < Record
3
+ self.primary_key = "uuid"
4
+
5
+ DOMAINES = %w[
6
+ Coaching
7
+ Autre
8
+ Produit
9
+ Intraprenariat
10
+ Data
11
+ Déploiement
12
+ Animation
13
+ Design
14
+ Développement
15
+ Support
16
+ ]
17
+
18
+ has_and_belongs_to_many :teams, join_table: "users_teams"
19
+
20
+ has_many :missions, -> { order '"end" ASC' }
21
+ has_one :last_mission, -> { order(end: :desc) }, class_name: "EspaceMembre::Mission"
22
+
23
+ has_many :startups, through: :missions
24
+
25
+ has_many :active_missions, -> { active }, class_name: "EspaceMembre::Mission"
26
+ has_many :active_startups, through: :active_missions, source: :startups
27
+
28
+ validates :username, :fullname, :role, :domaine, presence: true
29
+ validates :domaine, inclusion: { in: DOMAINES }
30
+
31
+ def self.identify_email!(email)
32
+ User.find_by!(primary_email: email)
33
+ rescue ActiveRecord::RecordNotFound
34
+ User.find_by!(secondary_email: email)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module EspaceMembre
2
+ VERSION = "0.2"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "espace_membre/version"
2
+ require "espace_membre/railtie"
3
+
4
+ module EspaceMembre
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :espace_membre do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,9 @@
1
+ require 'faker'
2
+
3
+ FactoryBot.define do
4
+ factory :incubator, class: 'EspaceMembre::Incubator' do
5
+ ghid { Faker::Lorem.word.downcase }
6
+ uuid { Faker::Internet.uuid }
7
+ title { Faker::Lorem.word }
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ require 'faker'
2
+
3
+ FactoryBot.define do
4
+ factory :mission, class: 'EspaceMembre::Mission' do
5
+ uuid { Faker::Internet.uuid }
6
+ start { Date.today }
7
+ add_attribute(:end) { Date.tomorrow }
8
+ employer { Faker::Company.name }
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'faker'
2
+
3
+ FactoryBot.define do
4
+ factory :phase, class: 'EspaceMembre::Phase' do
5
+ uuid { Faker::Internet.uuid }
6
+ start { Time.zone.now }
7
+ name { Faker::Lorem.word }
8
+
9
+ EspaceMembre::Phase::PHASES.each do |phase_name|
10
+ trait phase_name do
11
+ name { phase_name }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ require 'faker'
2
+
3
+ FactoryBot.define do
4
+ factory :question, class: "Evaluation::Question" do
5
+ domaine { %w[accessibilité vie-privée].sample }
6
+ title { Faker::Lorem.sentence }
7
+ end
8
+ end
@@ -0,0 +1,37 @@
1
+ require 'faker'
2
+
3
+ FactoryBot.define do
4
+ factory :startup, class: "EspaceMembre::Startup" do
5
+ ghid { Faker::Lorem.word.downcase }
6
+ uuid { Faker::Internet.uuid }
7
+ name { Faker::Lorem.word }
8
+ description { Faker::Lorem.paragraph }
9
+ incubator
10
+
11
+ trait :in_investigation do
12
+ after(:create) do |startup|
13
+ FactoryBot.create(:phase, :investigation, startup: startup)
14
+ end
15
+ end
16
+
17
+ trait :in_construction do
18
+ in_investigation
19
+
20
+ after(:create) do |startup|
21
+ startup.latest_phase.terminate!
22
+
23
+ FactoryBot.create(:phase, :construction, startup: startup)
24
+ end
25
+ end
26
+
27
+ trait :in_acceleration do
28
+ in_construction
29
+
30
+ after(:create) do |startup|
31
+ startup.latest_phase.terminate!
32
+
33
+ FactoryBot.create(:phase, :acceleration, startup: startup)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faker'
4
+
5
+ FactoryBot.define do
6
+ factory :user, class: 'EspaceMembre::User' do
7
+ username { Faker::Internet.username }
8
+ uuid { Faker::Internet.uuid }
9
+ fullname { Faker::Name.name }
10
+ domaine { EspaceMembre::User::DOMAINES.sample }
11
+ role { Faker::Job.title }
12
+ primary_email { Faker::Internet.email }
13
+ secondary_email { Faker::Internet.email }
14
+
15
+ trait :with_active_mission do
16
+ after(:create) do |user|
17
+ user.missions.create!(start: Time.zone.now, end: Time.now.next_week)
18
+ end
19
+ end
20
+
21
+ trait :with_active_startup do
22
+ with_active_mission
23
+
24
+ after(:create) do |user|
25
+ user.missions.last.startups << create(:startup, :in_construction)
26
+ user.save
27
+ end
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: espace_membre-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ platform: ruby
6
+ authors:
7
+ - Stéphane Maniaci
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 8.1.2
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 8.1.2
26
+ description: Write Ruby apps around the beta.gouv.fr dataset without the hassle
27
+ email:
28
+ - stephane.maniaci@beta.gouv.fr
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - README.md
34
+ - Rakefile
35
+ - lib/espace_membre-ruby.rb
36
+ - lib/espace_membre/incubator.rb
37
+ - lib/espace_membre/mission.rb
38
+ - lib/espace_membre/mission_startup.rb
39
+ - lib/espace_membre/phase.rb
40
+ - lib/espace_membre/railtie.rb
41
+ - lib/espace_membre/record.rb
42
+ - lib/espace_membre/startup.rb
43
+ - lib/espace_membre/team.rb
44
+ - lib/espace_membre/user.rb
45
+ - lib/espace_membre/version.rb
46
+ - lib/tasks/espace_membre_tasks.rake
47
+ - spec/dummy/spec/factories/incubators.rb
48
+ - spec/dummy/spec/factories/missions.rb
49
+ - spec/dummy/spec/factories/phases.rb
50
+ - spec/dummy/spec/factories/questions.rb
51
+ - spec/dummy/spec/factories/startups.rb
52
+ - spec/dummy/spec/factories/users.rb
53
+ homepage: https://github.com/betagouv/espace_membre-ruby
54
+ licenses: []
55
+ metadata:
56
+ homepage_uri: https://github.com/betagouv/espace_membre-ruby
57
+ source_code_uri: https://github.com/betagouv/espace_membre-ruby
58
+ changelog_uri: https://github.com/betagouv/espace_membre-ruby
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubygems_version: 4.0.3
74
+ specification_version: 4
75
+ summary: A collection of Ruby code around the EspaceMembre app
76
+ test_files: []